背景
在做SOC与MCU通信的时候,MCU端作为服务端,SOC端作为客户端。博主开发的是SOC端的代码,写个socket通讯很容易,很快写完和上位机模拟测试是OK的,但是和MCU联调的时候发现不通,握手不上。
抓包分析,原因找到,MCU端的习惯是将源端口和目标端口都配置成同一个,SOC(linux)上的习惯是,只指定目标端口,源端口随机分配,显而易见,如此肯定通不了。
解决
要么MCU改,要我SOC改。
基于安全和资源的考虑,MCU端的端口确实应该是明确指定的,那就SOC端改。
在建立socket连接时,将源端口固定:
示例代码
...
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(m_port); // 指定服务端的通讯端口
memcpy(&servaddr.sin_addr,h->h_addr,h->h_length);
memset(&clientaddr,0,sizeof(clientaddr));
clientaddr.sin_family = AF_INET;
clientaddr.sin_port = htons(m_port); // 指定客户端的通讯端口
clientaddr.sin_addr.s_addr = INADDR_ANY;
if (bind(m_sockfd, (struct sockaddr *)&clientaddr,sizeof(clientaddr)) != 0)
{
close(m_sockfd); m_sockfd = -1; return false;
}
if (connect(m_sockfd, (struct sockaddr *)&servaddr,sizeof(servaddr)) != 0)
{
close(m_sockfd); m_sockfd = -1; return false;
}
...