UDP模式下上位机能不能建立多个socket分别对不同的IP进行一对一的通信?

花生切糖 2019-03-07 03:26:48
我在做一项测试,下位机是2块网络通信模块,都配置为UDP模式,分别配置成不同的IP和端口号,然后通过网线连接到路由器;现在上位机这边我创建了两个socket分别对相应的下位机进行一对一的通信,代码如下:

UINT16 i;

WORD socketVersion = MAKEWORD(2,2);
WSADATA wsaData;
SOCKET desSocket_0;
SOCKET desSocket_1;

struct sockaddr_in serverAddr[2];
int iAddrlen = sizeof(sockaddr_in);
char szbuffer[10] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
int ret;

if (WSAStartup(socketVersion,&wsaData) != 0)
{
printf("Winsock init faied!\r\n");
WSACleanup();
return;
}

/* 服务器监听的端口和地址 */
for(i = 0;i < 2;i ++)
{
memset(&serverAddr[i], 0, sizeof(serverAddr));
serverAddr[i].sin_family = AF_INET;
}
serverAddr[0].sin_port = htons(6000);
serverAddr[0].sin_addr.S_un.S_un_b.s_b1 = 192;
serverAddr[0].sin_addr.S_un.S_un_b.s_b2 = 168;
serverAddr[0].sin_addr.S_un.S_un_b.s_b3 = 1;
serverAddr[0].sin_addr.S_un.S_un_b.s_b4 = 120;
printf("Now connecting the server...\r\n");

desSocket_0 = socket(AF_INET, SOCK_DGRAM, 0);
if(desSocket_0 == INVALID_SOCKET)
{
printf("Socket0建立失败!\r\n");
printf("Error mseeage:%d\n",WSAGetLastError());
}

serverAddr[1].sin_port = htons(5000);
serverAddr[1].sin_addr.S_un.S_un_b.s_b1 = 192;
serverAddr[1].sin_addr.S_un.S_un_b.s_b2 = 168;
serverAddr[1].sin_addr.S_un.S_un_b.s_b3 = 1;
serverAddr[1].sin_addr.S_un.S_un_b.s_b4 = 130;
printf("Now connecting the server...\r\n");

desSocket_1 = socket(AF_INET, SOCK_DGRAM, 0);
if(desSocket_1 == INVALID_SOCKET)
{
printf("Socket1建立失败!\r\n");
printf("Error mseeage:%d\n",WSAGetLastError());
}

while(true)
{
ret = sendto(desSocket_0, szbuffer, sizeof(szbuffer), 0, (struct sockaddr*)&serverAddr[0], iAddrlen);
if(ret != SOCKET_ERROR)
{
Sleep(1000);
ret = recvfrom(desSocket_0, szbuffer, sizeof(szbuffer), 0, (struct sockaddr*)&serverAddr[0], &iAddrlen);
if(ret != SOCKET_ERROR)
{
printf("recive from server:%d\r\n", 0);
}
else
printf("Socket0ReciveError:%d\n",WSAGetLastError());
}
else
printf("Socket0SendError:%d\n",WSAGetLastError());

Sleep(1000);
ret = sendto(desSocket_1, szbuffer, sizeof(szbuffer), 0, (struct sockaddr*)&serverAddr[1], iAddrlen);
if(ret != SOCKET_ERROR)
{
Sleep(1000);
ret = recvfrom(desSocket_1, szbuffer, sizeof(szbuffer), 0, (struct sockaddr*)&serverAddr[1], &iAddrlen);
if(ret != SOCKET_ERROR)
{
printf("recive from server:%d\r\n", 1);
}
else
printf("Socket1ReciveError:%d\n",WSAGetLastError());
}
else
printf("Socket1SendError:%d\n",WSAGetLastError());

Sleep(1000);
}
closesocket(desSocket_0);
closesocket(desSocket_1);
printf("通讯失败!\r\n");
return;

结果无法通信。不能同时创建多个socket吗?
...全文
358 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cqzj70 2019-04-09
  • 打赏
  • 举报
回复
怎么会不能创建多个socket套接字,我曾经在为壹基金开发的地震模拟车上的上位机程序都通过创建多个套接字来进行通信
花生切糖 2019-03-07
  • 打赏
  • 举报
回复
我找到原因了,不是上位机程序的原因。作为下位机的W5100s初始化时需要配置它的物理地址,要求同一个局域网内的W5100s的物理地址不能重复,结果我配置成一样的了,改成不一样的后就可以了。
花生切糖 2019-03-07
  • 打赏
  • 举报
回复
服务器端是W5100S网络芯片,直接初始化为UDP模式,端口号和IP都是和上位机程序对应的。为什么要开线程?按照我的程序,分别建两个socket一对一通讯,逻辑上应该互不干扰才对。还是说我对socket这块理解错了,不能这么操作?
zgl7903 2019-03-07
  • 打赏
  • 举报
回复
写&调好一个通讯模块, 开两个线程

Eleven 2019-03-07
  • 打赏
  • 举报
回复
你对应的服务端是怎么做的?有bind绑定正确的IP/Port与Client端相对应?
花生切糖 2019-03-07
  • 打赏
  • 举报
回复
运行结果是这样的: 当我把其中一个socket的处理代码注释掉,就正常了:

/*
		Sleep(1000);
		ret = sendto(desSocket_1, szbuffer, sizeof(szbuffer), 0, (struct  sockaddr*)&serverAddr[1], iAddrlen);
		if(ret != SOCKET_ERROR)
		{
			Sleep(1000);
			ret = recvfrom(desSocket_1, szbuffer, sizeof(szbuffer), 0, (struct sockaddr*)&serverAddr[1], &iAddrlen);
			if(ret != SOCKET_ERROR)
			{
				printf("recive from server:%d\r\n", 1);
			}
			else
				printf("Socket1ReciveError:%d\n",WSAGetLastError());
		}
		else
			printf("Socket1SendError:%d\n",WSAGetLastError());
*/
注释掉上述代码后的结果如下:
Eleven 2019-03-07
  • 打赏
  • 举报
回复
哪里调用失败了吗?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧