0
点赞
收藏
分享

微信扫一扫

续上一篇博客UDP通讯10054错误码补充

上一篇博客传送门:​​https://blog.51cto.com/u_14123985/5283970​​

补充上一篇博客中window端能正常收到所有朝自己发送的信息,但是window端自己发送的(特定情况下就是[发送端Ip和接收端一样,且发送目的的端口未开放的情况下])会被自己收到并产生10054错误.

特定情况下就是[发送端Ip和接收端一样,且发送目的的端口未开放的情况下]):我尝试用netstat -ano查找相同IP的其他开放端口进行发送时不会擅自recvfrom,发送和接收的IP不同时也不会擅自recvfrom

#include <iostream>
#include <stdio.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <cstring>
#include <arpa/inet.h>
#include<unistd.h>
void recvProcSDK(int& sock)
{
// int sock = (int)p;
char s[256];
sockaddr_in sa;
socklen_t len = sizeof(sa);
while (true)
{
std::cout << "in recvProc" << std::endl;
int n = recvfrom(sock, s, sizeof(s), 0, (sockaddr*)&sa, &len);
std::cout << "recvProc over" << std::endl;
int hport = htons(sa.sin_port);
if (n < 0)
break;
s[n] = 0;
std::cout <<"recvProcSDK" << s << std::endl;
}
std::cout << "proc exit" << std::endl;
}


int main(int argc,char *argv[])
{
int sock = socket(AF_INET, SOCK_DGRAM, 0);
sockaddr_in sa,sb;//接收端和发送端都是同一个SOCKET
{
sa.sin_family = AF_INET;
sa.sin_port = htons(atoi(argv[1]));
sa.sin_addr.s_addr = inet_addr("192.168.0.66");
sb.sin_family = AF_INET;
sb.sin_port = htons(9999);//window套接字的信息
sb.sin_addr.s_addr = inet_addr("192.168.0.66");
}

if (bind(sock, (sockaddr*)&sa, sizeof(sa)))
{
std::cout << "main bind error" << std::endl;
return -1;
}
if (fork() == 0) {
recvProcSDK(sock);
}
char data[256];
int n = 0;
while (true)
{
std::cout << "请输入传送的内容:";
std::cin >> data;
n = sendto(sock, data, strlen(data), 0, (sockaddr*)&sb, sizeof(sb));//发送给另一个地址
if (n <= 0)
{
std::cout << "error no" << std::endl;
}
}
int stuats = 0;
wait(&stuats);

return 0;
}

我用Linux实现了相同的通讯流程发现在Linux平台下相同情况下sendto不会被自己的recvfrom接收到,

在没有深入剖析winsock套接字的情况下不敢对此下断言,只能说这种特定情况下window和linux的套接字所有区别的


举报

相关推荐

0 条评论