在PowerPC架构上运行Linux系统,该架构通过以太网连接到另一台获得UDP连接的设备(基于包),
我尝试设置套接字并将其绑定到我的端口8813
。但每当我输入与0
不同的端口时,绑定失败。
以下是代码:
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上使用测试工具(只需调试,如果端口有传入流量;将外部设备连接到它),我会收到数据;所以,外部设备肯定会发送数据
绑定到端口0
有效; netstat -au
在程序运行时提及侦听端口2
的工具
错误消息:BIND failed! Error: Address family not supported by protocol
所以,这里有两个问题:
我做错了什么?
我对“绑定”的理解是错误的。听“系统分配给我的程序的一些随机端口”有什么意义?我的意思是,如果我设置了一个http-Server,我想听端口80
而不是端口“RANDOM”。这有什么好处?
答案 0 :(得分:0)
您已在代码中重新定义struct sockaddr_in
。如果与系统定义它的方式有任何不同,那么尝试使用此结构的任何代码都将无法正常工作。
您需要#include <netinet/in.h>
才能正确定义此结构。