以下のコードに何か間違いがありますが、クライアント接続を使用できないようで、selectステートメントと組み合わせて非ブロック化しているようです。以下のエラー処理の不足を無視してください。BSDソケットconnect + select(クライアント)
私は2つの問題を抱えているようです。1.インターネットサーバー上のポート80に接続しようとすると、ブロックがブロックされます。 2. 127.0.0.1上の既存のポートまたは既存のポートを常に瞬時に返します。成功するか失敗するかを区別することができない選択。
selectと組み合わせてBSDノンブロッキングの理解に欠けているものは何ですか?つまり、それは進行中です:合法的に -
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
}
}
優秀な回答!ありがとうGil! –