我想有一个简单的功能来设置UDP连接的服务器端,只需要使用端口并返回套接字描述符。这可能吗?或者传递到struct sockaddr
的{{1}}变量是否需要坚持下去?这是我想要的功能:
bind
这会有用吗?或者我是否必须将int UDP_Init( int port )
{
int sockfd = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
if ( sockfd < 0 )
{
perror( "ERROR opening UDP socket" );
return -1;
}
struct sockaddr_in server_addr;
bzero( (char*)&server_addr, sizeof(server_addr) );
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons( port );
server_addr.sin_addr.s_addr = htonl( INADDR_ANY );
if ( bind( sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr) ) < 0 )
{
perror( "ERROR binding UDP socket" );
return -1;
}
return sockfd;
}
结构保持链接到套接字描述符?
答案 0 :(得分:1)
你所拥有的一切都很好。
在您bind
套接字后,您传递的sockaddr
结构不需要以任何方式保留。
bind()
占用struct sockaddr *
的原因是因为它可以接受多个结构(IPv4 struct sockaddr_in
,IPv6 struct sockaddr_in6
,UNIX struct sockaddr_un
域套接字等)。这些结构中的每一个都是不同的大小,因此该函数采用指针(由于历史原因使用sockaddr*
)以及指向的结构的大小。
答案 1 :(得分:0)
您的代码将正常工作,当您调用绑定时,底层网络堆栈需要struct sockaddr信息将传递的套接字描述符绑定到您通过struct sockaddr传递的端口和地址。之后,您可以使用套接字描述符进行进一步的通信。