Linux Socket select가 항상 1로 되돌아오는 문제 해결

1849 단어 socket
문제 해결:
win에서 게임 서버를 linux로 옮길 때 많은 문제에 부딪혔는데 그 중 하나는 select가 항상 1로 되돌아오는 것이다. 끊임없는 디버깅 분석을 통해 포트가 차지하는 것을 발견했다.
linux의 socket 프로그램이 닫혔을 때, 밑에 있는 TCP 연결은 바로 닫히지 않으며, 디버깅 프로그램에서 문제가 발생할 수 있습니다. 명령을 사용할 수 있습니다.
netstat – apn | grep <포트 번호>
당신이 사용하는 포트가 당연히 사용 중인지 확인하세요
TCP 상태가 TIME 이면WAIT, 그리고 프로그램이 꺼졌어요. 조금만 기다리면 TCP가 자동으로 포트를 풀 거예요.
마지막으로 프로그램 이름과pid가 표시되면 이 프로그램을 수동으로 닫아야 합니다.
kill
또는:
pkill <프로그램 이름> (이름이 다른 프로그램이 없는지 확인하려면)
select 사용법 정보:
헤더 파일
#include#include#include
정의 함수
int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout);
함수 설명
select () 는 파일 설명어의 상태가 바뀌기를 기다리는 데 사용됩니다.파라미터 n은 가장 큰 파일 묘사 단어에 1을 더하는 것을 의미하며, 파라미터readfds, writefds, exceptfds는 묘사 어구라고 하는데, 이 묘사 단어의 읽기, 쓰기, 예외를 되돌려 주는 데 쓰인다.다음 매크로는 이 세 가지 설명 어구를 처리하는 방법을 제공합니다: FDCLR(inr fd,fd_set* set);설명 어구 set에서 관련 fd를 지우는 데 사용되는 비트 FDISSET(int fd,fd_set *set);설명 어구 set의 관련 fd 비트가 True FD 인지 테스트하는 데 사용SET(int fd,fd_set*set);설명 어구 set에서 관련 fd를 설정하는 데 사용되는 비트 FDZERO(fd_set *set); 설명 어구 set의 전체 부위 매개 변수 timeout을 구조 timeval로 지우고 select()의 대기 시간을 설정합니다. 구조 정의는 다음과 같습니다struct timeval{time t tv sec;time t tv usec;;매개 변수 timeout을 NULL로 설정하면 select에 timeout이 없음을 표시합니다. (상태가 바뀔 때까지 기다립니다.)
반환값이 실행되면 파일 설명어 상태가 바뀐 개수를 반환합니다.
시간 초과가 0으로 되돌아오면, 설명어 상태가 바뀌기 전에timeout 시간을 초과한 것을 의미합니다.
오류가 발생하면 -1:
오류 원인은errno에 저장됩니다. 이 때 매개 변수readfds, writefds, exceptfds,timeout의 값은 예측할 수 없습니다.errno 값: EBADF 파일 설명이 잘못되었거나 이 파일이 닫혔습니다. 이 호출은 신호에 의해 중단되었습니다. EINVAL 매개 변수 n은 마이너스입니다.ENOMEM 코어 메모리 부족
예제
일반적인 프로그램 세그먼트:
fs_set readset;

FD_ZERO(&readset);

FD_SET(fd,&readset);

select(fd+1,&readset,NULL,NULL,NULL);

if(FD_ISSET(fd,readset){……}

좋은 웹페이지 즐겨찾기