非阻塞连接正在进行中。在windows下,可以通过select判断socket何时建立,如果socket是可写的,则连接建立。linux下呢?初始化后,立即变为可写。因此,尝试向套接字写入内容将导致 SIGPIPE。
int sockfd = ::socket(AF_INET, SOCK_STREAM, 0);
int arg = ::fcntl(sockfd, F_GETFL);
long flags = arg & ~O_NONBLOCK;
flags |= O_NONBLOCK;
fcntl(sockfd, F_SETFL, flags);
struct sockaddr_in dest;
dest.sin_family = AF_INET;
dest.sin_port = htons(1111);
inet_aton("127.0.0.1", &dest.sin_addr);
int rc = ::connect(sockfd, (struct sockaddr* )&dest, sizeof(dest));
fd_set fdWrite;
FD_ZERO(&fdWrite);
FD_SET(sockfd, &fdWrite);
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
rc = ::select(int(sockfd) + 1, 0, &fdWrite, 0, &tv);
int er = errno;
return 0;
为了不用引导性问题拉扯橡皮筋,我将简单地引用
man 2 connect