아래 코드에 뭔가 틀린 것이 틀림 없지만 select 문과 함께 사용하여 클라이언트 연결을 사용할 수없는 것 같습니다. 아래 오류 처리의 부족을 무시하십시오. 내가 인터넷 서버의 포트 80에 연결하려고하면BSD 소켓 connect + select (클라이언트)
나는이 문제를 제한 시간 (60)까지 1. 블록을 갖고있는 것 같다 항상 즉시 반환 127.0.0.1에 기존 또는 비 기존 포트를 연결을 시도하는 (2) 성공 또는 실패 여부를 구별 할 방법이없는 선택.
select와 함께 BSD nonblocking에 대한 이해가 부족합니다. 즉, 그것은 진행중인입니다 : 합법적으로 -
fd_set readfds;
FD_ZERO(&readfds);
struct timeval tv;
tv.tv_sec = 60;
tv.tv_usec = 0;
struct sockaddr_in dest;
int socketFD = socket(AF_INET, SOCK_STREAM, 0);
memset(&dest, 0, sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_addr.s_addr = inet_addr("127.0.0.1");
dest.sin_port = htons(9483);
long arg;
arg = fcntl(socketFD, F_GETFL, NULL);
arg |= O_NONBLOCK;
fcntl(socketFD, F_SETFL, arg);
if (connect(socketFD, (struct sockaddr *)&dest, sizeof(struct sockaddr))<0 && errno == EINPROGRESS) {
//now add it to the read set
FD_SET(socketFD, &readfds);
int res = select(socketFD+1, &readfds, NULL, NULL, &tv);
int error = errno;
if (res>0 && FD_ISSET(socketFD, &readfds)) {
NSLog(@"errno: %d", error); //Always 36
}
}
우수 답변! 고마워요! –