gpt4 book ai didi

不支持 C++ 绑定(bind) UDP 套接字地址系列

转载 作者:太空宇宙 更新时间:2023-11-04 10:32:55 25 4
gpt4 key购买 nike

在 PowerPC 架构上运行 Linux 系统,该架构通过以太网连接到另一个获得 UDP 连接的设备(基于包),我尝试设置一个套接字并将其绑定(bind)到我的端口 8813。但是每当我输入不同于 0 的端口时,绑定(bind)就会失败。

代码如下:

int connector::initUDPSocket(){
struct hostent *server;
//Construct Socket
struct sockaddr_in {
__uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
}
;
sockaddr_in socketaddress;
socklen_t addrlen = sizeof(struct sockaddr_in); /* length of addresses */


udpsocket=socket(AF_INET,SOCK_DGRAM ,0);

if(udpsocket<=0)
{
printf("No Socket opened!");
return 1;
}
else
{
printf("ONE Socket opened!");

memset((char *) &socketaddress,0, sizeof(socketaddress));


socketaddress.sin_family = AF_INET;
socketaddress.sin_addr.s_addr=htonl(inet_addr("192.168.0.10"));//<=That's the external devices address;// htonl(inet_addr("192.168.0.1"));//<=That's my devices address;//htonl(INADDR_ANY);//INADDR_ANY;//
socketaddress.sin_port = htons(8813);//8813;//htonl(8813);//htons(0); //<=Only the last one works


int bind_result=bind(udpsocket,(struct sockaddr *)&socketaddress,sizeof(socketaddress));
if( bind_result == SOCKET_ERROR)
{

printf(LFL_CRI,"BIND failed! Error: %s",strerror(errno)); //Returns "BIND failed! Error: Address family not supported by protocol"
}
else
{
printf(LFL_CRI,"BIND worked!");
//Nun den Listener für den DatenStream aufsetzen.
char SockAddrBuffer[sizeof(struct sockaddr_storage)];
socklen_t SockAddrBufferSize = sizeof(SockAddrBuffer);
int numofbytes=recvfrom(udpsocket, udp_buffer, UDP_BUFFERSIZE, 0, (struct sockaddr *)SockAddrBuffer, &SockAddrBufferSize);
if (numofbytes >0)
{
printf("%i bytes received",numofbytes);
}
}

}
return 0;
}
}

到目前为止我发现了什么:

  • 可以 Ping 192.168.0.10

  • 数据似乎没有被防火墙拦截; iptables -nvL 提到没有丢失的包。我为此添加了一个新规则,在应用此规则之前,当连接外部设备时,数量或丢失的包裹会增加。

  • 在我的 Windows PC 上使用测试工具(简单调试,如果端口上有传入流量;将外部设备连接到它),我接收数据;所以,外部设备肯定会发送数据

  • 绑定(bind)到端口 0 有效; netstat -au 提到在程序运行时监听端口 2 的工具

  • 错误信息:BIND 失败!错误:协议(protocol)不支持地址系列

所以,这里有 2 个问题:

  1. 我做错了什么?

  2. 我对“绑定(bind)”的理解有误。听“系统分配给我的程序的某个随机端口”有什么意义?我的意思是,如果我设置了一个 http 服务器,我想监听端口 80 而不是端口“RANDOM”。这有什么用?

最佳答案

您重新定义了 struct sockaddr_in在你的代码中。如果它与系统定义它的方式有任何不同,任何尝试使用此结构的代码都将无法正常工作。

您需要 #include <netinet/in.h>获得此结构的正确定义。

关于不支持 C++ 绑定(bind) UDP 套接字地址系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38977715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com