Linux客户端和Window服务器端udp socket通信不能成功

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux客户端和Window服务器端udp socket通信不能成功相关的知识,希望对你有一定的参考价值。

这几天写一个简单小程序练习socke udpt通信。完成简单功能,在Window下运行一服务器,接收客户端消息打印显示。 在Window和Linux下分别使用客户端发送消息到服务器。
发现Window客户端和Window服务器端socket通信正确,服务器正确显示客户端发送的消息。
但是Linux客户端和Window服务器端socket通信不能成功。使用wireshark抓包网口报文查看分享,发现此时Linux客户端已经将UDP报文发送到Window服务器端网口,wireshark也抓到对应报文,但是奇怪的是Widow服务器端程序却没有收到这个报文,没有打印消息。
不知道是我那个地方没处理正确,路过的朋友指教,谢谢!

测试代码如下:

1. Window server代码如下:
#include "../common/InitSock.h"
#include <stdio.h>
CInitSock initSock; // 初始化Winsock库

int main()

// 创建套节字
SOCKET s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(s == INVALID_SOCKET)

printf("Failed socket() \n");
return 0;


// 填充sockaddr_in结构
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(4567);
sin.sin_addr.S_un.S_addr = INADDR_ANY;

// 绑定这个套节字到一个本地地址
if(::bind(s, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)

printf("Failed bind() \n");
return 0;


// 接收数据
char buff[1024], counter = 0;
sockaddr_in addr;
int nLen = sizeof(addr);

printf("begin: \n");

while(TRUE)

printf("loop: %d.\n", counter);
counter ++;
int nRecv = ::recvfrom(s, buff, 1024, 0, (sockaddr*)&addr, &nLen);
if(nRecv > 0)

buff[nRecv] = '\0';
printf(" 接收到数据(%s):%s", ::inet_ntoa(addr.sin_addr), buff);



::closesocket(s);

2. Linux Client代码如下:
sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//创建套接子
memset(&addr_serv, 0, sizeof(addr_serv));
addr_serv.sin_family = AF_INET;
addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
addr_serv.sin_port = htons(DEST_PORT);

dest_len = sizeof(struct sockaddr_in);
send_num = sendto(sock_fd, send_buf, sizeof(send_buf), 0, (struct sockaddr *)&addr_serv, dest_len);
close(sock_fd);

---------
问题已解决,上面代码没问题,用Linux虚拟机和window调试时,不能选用Bridge方式,改用NAT方式即可,结贴!

上面代码没问题,用Linux虚拟机和window调试时,不能选用Bridge方式,改用NAT方式即可。
因为系统环境不同,这样慢慢地很容易就找到问题出在哪里,打个比方?触发了里面有什么内容,它发送一条消息少年。这类问题(是打比方,精确到端口,语言不同。打印出来看,一步一步排查就行,不限于这一个问题)
另外的可能就是linux客户端上的代码运行机制问题。
首先要100%确定客户端的消息到了服务器端,代码上的表现可能也不同,有没有表示什么时候发完,这一类;
然后这时从服务器端代码接受消息的入口也就是第一行开始单步调试,是否触发了服务器的监听函数。也就是结束符,服务器可能一直在等单条消息的结束
参考技术A 少年,一步一步排查就行。
首先你要100%确定客户端的消息到了服务器端,精确到端口;
然后这时从服务器端代码接受消息的入口也就是第一行开始单步调试,是否触发了服务器的监听函数?触发了里面有什么内容?打印出来看,这样慢慢地很容易就找到问题出在哪里;

另外的可能就是你linux客户端上的代码运行机制问题,打个比方,它发送一条消息,有没有表示什么时候发完?也就是结束符,服务器可能一直在等单条消息的结束。这类问题(是打比方,这一类,不限于这一个问题),因为系统环境不同,语言不同,代码上的表现可能也不同。追问

虽然和问题不太相关,但是感谢热心帮助,给分~

本回答被提问者采纳

以上是关于Linux客户端和Window服务器端udp socket通信不能成功的主要内容,如果未能解决你的问题,请参考以下文章

检测基于udp的服务端,在windows下,和linux各用啥命令??

Linux UDP 单任务服务端和客户端实现

sockt udp服务端怎么关闭

UDP Linux编程(客户端&服务器端)

socket用法(TCP, UDP)

socket用法(TCP, UDP)