我有一个简单的udp客户端/服务器程序。
如果客户端正在断开连接,或者服务器正在重新启动,则客户端不会自动重新连接。我总是要手动重启客户端。
这是我的客户端套接字配置:
struct sockaddr_in si_other;
int s, i, j, slen=sizeof(si_other);
char buf[BUFLEN];
char message[BUFLEN] = "0";
if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
die("socket");
memset((char *) &si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(PORT);
这是我无限循环的主要部分:
if (sendto(s, message, strlen(message) , 0 , (struct sockaddr *) &si_other, slen)==-1)
die("sendto()");
//clear buf
memset(buf,'\0', BUFLEN);
//try to receive some data, this is a blocking call
if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen) == -1)
die("recvfrom()");
在做了一些研究之后,我尝试通过添加以下行来将套接字模式更改为非阻塞:
fcntl(s, F_SETFL, fcntl(s, F_GETFL, 0 | O_NONBLOCK);
客户端现在能够向服务器发送一条消息,但客户端没有收到任何答复。错误消息是:
recvfrom():资源暂时不可用
答案 0 :(得分:0)
以下解决方案正常运行:
在无限循环之前插入以下内容:
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (const char*) &tv, sizeof(struct timeval));
当函数die()
输出错误消息并停止程序时,我不得不替换以下内容:
if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen) == -1)
die("recvfrom()");
到
if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen) == -1)
printf("no response from the server!");
recvfrom()
现在仍然是阻止通话,但仅持续1秒。以前这是一个永久阻止呼叫,这是唯一的问题。