当前位置: 首页 > 知识库问答 >
问题:

UDP客户端没有自动重新连接

鄂昌胤
2023-03-14

我有一个简单的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);

共有1个答案

璩正志
2023-03-14

以下解决方案工作正常:

在无限循环之前插入以下内容:

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!");
 类似资料:
  • udp 客户端 udp 客户端 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * *//* * 程序清单:udp 客户端 * * 这是一个 udp 客户端的例程 * 导出 u

  • 我正在使用单节点独立zookeeper运行一个带有zookeeper发现SPI机制的单节点Apache Ignite服务器。 我正在尝试使用下面的发现SPI配置从客户端应用程序连接Ignite服务器,如下所示 请提供在zookeeper重新启动后客户端自动重新连接的配置。

  • 问题内容: 我使用和创建一个实时Web应用程序。我将为用户提供对套接字连接的完全控制,例如手动断开连接和(重新)连接。 在客户端启动时,该功能可以正常运行,但是在使用之后,不会启动新连接。 问题答案: 现在可以使用socket.socket.reconnect() 相关:https : //github.com/LearnBoost/socket.io- client/issues/251

  • 提示 视频 PPT 下载 背景介绍 UDP 协议是用于客户端-服务器模式的一种传输协议,如今的很多通信软件都是利用这个协议实现的,如腾讯 QQ 发送消息用的就是 UDP 协议。 本教程介绍了如何利用 socket 编程来实现一个 UDP 客户端,与服务器进行通信。与开发 TCP 客户端一样,我们先将 socket 编程的流程列出来,然后给出具体的实例。 UDP 与 TCP 的不同之处是,他的通信不

  • 我在实现UDP连接时遇到了麻烦,因为当我在局域网内尝试它时,它是有效的,但是当NAT内部的人试图连接到公共服务器地址时,它会失败,因为从服务器作为响应发送的数据包永远不会到达客户端。 我的协议如下: 客户端A向服务器发送一个字节作为连接请求 服务器B为客户端创建一个新的套接字,并从那里向recvfrom()调用中报告的客户端端口响应一个字节。永远不会联系到客户 我也试过: 执行许多调用,每个调用在