我有一个由我们的客户定义的连接协议。使用 UDP 和 TCP 协议在两台 linux 计算机之间发送数据。IP 地址和端口在启动时是固定的。
我们以 200 Hz 的频率发送消息,我一直在使用 connect 来节省一些传输时间。
我的问题是,如果出现通信错误,我需要断开连接并重新初始化。
我对其中一个 UDP 连接有疑问,因为它不会重新绑定到所需的地址并返回 errno 22。
我正在使用的代码类似于:
int
doConnect(int& sock, int local_port, char *local_ip, int remote_port, char *remote_ip)
{
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
struct sockaddr_in addr;
memset(&addr, 0, sizeof(sockaddr_in);
addr.sin_family = AF_INET;
addr.sin_port = htons(local_port);
inet_pton(local_ip,&addr.sin_addr.s_addr);
if (0 > bind(sock, (struct sockaddr*)&addr, sizeof(addr)))
{
printf("Bind Error errno = %d\n", errno);
return ERR_BIND;
}
memset(&addr, 0, sizeof(sockaddr_in);
addr.sin_family = AF_INET;
addr.sin_port = htons(remote_port);
inet_pton(remote_ip,&addr.sin_addr.s_addr);
if (0 > connect(sock, (struct sockaddr*)&addr, sizeof(addr)))
{
printf("Connect Error errno = %d\n", errno);
return ERR_CONNECT;
}
return ERR_OK;
}
它的使用方式是这样的:
int s1(-1), s2(-1);
doConnect(s1, 31003, "172.17.21.255", 31006, "172.17.21.1");
doConnect(s2, 31001, "172.17.21.3", 31004, "172.17.21.1");
发生错误时
close(s1);
close(s2);
doConnect(s1, 31003, "172.17.21.255", 31006, "172.17.21.1");
doConnect(s2, 31001, "172.17.21.3", 31004, "172.17.21.1");
这里本地地址是 172.17.21.3,我连接到 172.17.21.1。s1 收听广播消息。
s1 成功地重新连接到远程机器,但 s2 失败,调用 bind 时出现错误 22。
我尝试在关闭套接字之前立即显式调用绑定并连接到 AF_UNSPEC 地址。这并不能解决问题。
有什么我应该使用的选项吗?