struct sockaddr传递给bind是一个局部变量吗?

时间:2016-07-25 19:58:29

标签: c linux sockets

我想有一个简单的功能来设置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; } 结构保持链接到套接字描述符?

2 个答案:

答案 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传递的端口和地址。之后,您可以使用套接字描述符进行进一步的通信。