当前位置:  开发笔记 > 运维 > 正文

带有recv-timeout的套接字:这段代码有什么问题?

如何解决《带有recv-timeout的套接字:这段代码有什么问题?》经验,为你挑选了2个好方法。

我正在尝试实现一个recv超时为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工作,但recv阻止.

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

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



1> Roddy..:

你希望哪个套接字有一秒超时?接受连接的那个,还是accept()建立的连接?

我假设后者 - 所以尝试在accept返回后在clientfd上设置接收超时.您也可以到达需要使用select的位置,但您不需要.



2> Ignas2526..:

这有点偏离主题,但我真的想分享这个解决方案来在windows和unix上设置recv超时.也许是我,但我花了很多时间弄清楚为什么我的程序不起作用以及如何正确设置超时.希望你觉得它有用.它将超时设置为10秒.

对于Windows:

DWORD sock_timeout = 10*1000;

对于Unix:

const struct timeval sock_timeout={.tv_sec=10, .tv_usec=0};

对彼此而言:

setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (char*)&sock_timeout, sizeof(sock_timeout));

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有