我正在尝试实现一个接收超时为1秒的套接字:

int sockfd;
struct sockaddr_in self;
struct sockaddr_in client_addr;
int addrlen=sizeof(client_addr);
ssize_t nBytes;

sockfd = socket(AF_INET, SOCK_STREAM, 0);

self.sin_family = AF_INET;
self.sin_port = htons(PORT);
self.sin_addr.s_addr = INADDR_ANY;

int on = 1;
setsockopt( sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on);

// 1 Sec Timeout
tv.tv_sec  = 1;
tv.tv_usec = 0;
setsockopt( sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv);

bind(sockfd, (struct sockaddr*)&self, sizeof(self));

listen(sockfd, 20);

clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &addrlen);

nBytes = recv(clientfd, buffer, MAXBUF-1, 0);

如果没有“setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,&t​​v,sizeof(tv);”),则接受和接收的调用会起作用,但是recv会阻塞。

使用“setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,&t​​v,sizeof(tv);”),接受调用将产生错误“资源暂时不可用”。

有人可以告诉我这种方法有什么问题吗?

最佳答案

您要在哪个套接字上启用一秒超时?一个接受连接,还是一个由accept()建立的连接?

我假设是后者-因此请在接受返回后尝试在clientfd上设置接收超时。您还可以到达需要使用select的位置,但不必这样做。

关于c - 具有recv-timeout : What is wrong with this code?的套接字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/393276/

10-11 06:29