sve*_*ven 3 c sockets linux posix udp
我发送一个UDP数据包sendto,然后收到答案.recv如果recv没有收到回复,程序就不会继续.但是,udp数据包可能会丢失,或者由于某种原因,数据包可能无法传送,因此程序卡recv在线.我想知道recv如果nopacket到达时如何设置超时,例如一分钟,然后跳过该行并继续执行代码?
我没有粘贴完整的代码,因为它是一个通用udp代码,我的问题只与唯一相关recv.最后要说明的是,开发环境是linux.
unsigned long buf[maxlen];
struct protoent *proto; //
struct sockaddr_in server_addr;
int s; // socket
memset( &server_addr, 0, sizeof( server_addr ));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr = inet_addr(hostname);
sendto(s,msg,sizeof(msg),0,(struct sockaddr *)&server_addr,sizeof(server_addr));
recv(s,buf,sizeof(buf),0);
Run Code Online (Sandbox Code Playgroud)
如何在Linux中为UDP套接字设置超时:
#include <sys/time.h>
struct timeval timeout={2,0}; //set timeout for 2 seconds
/* set receive UDP message timeout */
setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(struct timeval));
/* Receive UDP message */
int recvlen = recvfrom(fd, buf, BUFSIZE, 0, (struct sockaddr *)&remaddr, &slen);
if (recvlen >= 0) {
//Message Received
}
else{
//Message Receive Timeout or other error
}
Run Code Online (Sandbox Code Playgroud)
您可以使用poll或select类似的东西:
struct pollfd fd;
int res;
fd.fd = s;
fd.events = POLLIN;
res = poll(&fd, 1, 1000); // 1000 ms timeout
if (res == 0)
{
// timeout
}
else if (res == -1)
{
// error
}
else
{
// implies (fd.revents & POLLIN) != 0
recv(s,buf,sizeof(buf),0); // we can read ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13607 次 |
| 最近记录: |