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吗?
...全文
383 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
哪里调用失败了吗?
内容概要:本文介绍了软件定义汽车(SDV)的最佳实践案例,重点围绕基于Vector技术的电子电气(E/E)架构设计与实现。文档展示了高算力计算平台(HPC)、区域控制器(Zone ECU)和车载网络(如CAN、Ethernet)的系统架构布局,并结合AUTOSAR操作系统(Classic/Adaptive)、虚拟化(Hypervisor)和SOA服务设计,构建现代化车载系统。通过vCANdrive平台演示了从开发、测试(SIL/HIL)、到OTA升级的全流程,涵盖传感器、执行器、应用层软件及云端协同的集成方案。同时展示了硬件原型(如树莓派、Triboard)和MICROSAR系列工具链在实际项目中的应用。; 适合人群:从事汽车电子系统开发、车载软件架构设计以及智能网联汽车研发的工程师和技术管理人员,具备一定的嵌入式系统或AUTOSAR基础者更佳。; 使用场景及目标:①理解软件定义汽车的整体架构设计方法;②掌握基于Vector工具链的HPC与区域控制器集成方案;③实现OTA更新、SIL/HIL测试、ETH-CAN通信转换等关键技术验证;④支持智能驾驶(ADAS)与智能座舱(IVI)系统的快速原型开发。; 阅读建议:建议结合Vector相关工具(如PREEvision、CANoe4SW、MICROSAR)进行实践操作,重点关注系统分层设计、通信机制与软件更新流程,同时可参考文档中的硬件连接示意图与信号映射关系进行仿真与实车验证。

18,358

社区成员

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

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