下面内容摘自是connect的man手册,程序根据这段内容完成。
EINPROGRESS
The socket is non-blocking and the connection cannot be completed immediately. It is possible to select(2) or
poll(2) for completion by selecting the socket for writing. After select(2) indicates writability, use getsock-
opt(2) to read the SO_ERROR option at level SOL_SOCKET to determine whether connect() completed successfully
(SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual error codes listed here, explaining the reason
for the failure).
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <strings.h>
#include <stdlib.h>
int main()
{
int sockfd;
sockfd = socket(AF_INET,SOCK_STREAM,0);
int flags;
flags = fcntl(sockfd,F_GETFD,0);
flags |= O_NONBLOCK;
fcntl(sockfd,F_SETFD,flags);
struct sockaddr_in addr;
bzero(&addr,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(49152);
inet_pton(AF_INET,"192.168.1.1",&addr.sin_addr.s_addr);
fd_set writefds;
FD_ZERO(&writefds);
FD_SET(sockfd,&writefds);
struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
iResult = connect(sockfd,(struct sockaddr *)&addr,sizeof(addr));
if(iResult == 0){
printf("connect imidiataly\n");
goto done;
}
iResult = select(testfd+1,NULL,&writefds,NULL,&timeout);
if(0 == iResult){
printf("timeout!\n");
goto done;
}
if(-1 == iResult){
perror("select error:");
goto done;
}
if(FD_ISSET(sockfd,&writefds)){
int error;
socklen_t errorlen = sizeof(error);
getsockopt(sockfd,SOL_SOCKET,SO_ERROR,&error,&errorlen);
}
done:
if(error){
errno = error;
perror("SO_ERROR");
close(sockfd);
}
flags = fcntl(sockfd,F_GETFD,0);
flags &= ~O_NONBLOCK;
fcntl(sockfd,F_SETFD,flags);
return 0;
}
非阻塞式connect的Linux实现
最新推荐文章于 2023-06-08 08:45:41 发布