在PowerPC架构上运行Linux系统,该系统通过以太网连接到另一个获取UDP连接的设备(基于套件), 我尝试设置套接字并将其绑定到我的端口8813
。但是每当我输入与0
不同的端口时,绑定失败。C++绑定UDP套接字地址系列不支持
下面是代码:
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;
}
}
我发现了什么至今:
平
192.168.0.10
可能数据似乎并没有被防火墙阻止;
iptables -nvL
提到没有丢包。为此,我添加了一条新规则,在应用此规则之前,连接外部设备时会增加数量或丢弃的数据包。在我的Windows PC上使用测试工具(只需调试,如果端口上有传入流量;将外部设备连接到它),我会接收数据;所以,外部设备肯定发送数据
绑定到端口
0
工作;在netstat -au
提到的工具监听端口2
,在程序运行时错误消息:
BIND failed! Error: Address family not supported by protocol
所以,2个问题在这里开:
我在做什么错误?
我对“绑定”的理解错误。听听“系统分配给我的程序的一些随机端口”有什么意义?我的意思是,如果我设置了http-Server,我想听Port
80
而不是端口“RANDOM”。这有什么好处?
你为什么重新定义'sockaddr_in'?包括''来获得对你的工具链正确的那个。如果它被排除在工具链之外,可能有一个很好的理由。 –
user4581301
在某些地方,您正在使用'printf'而不是'fprintf'。 'udpsocket'没有声明,我想它应该是整数。你可以创建[MCVE](http://stackoverflow.com/help/mcve)吗? – karastojko