2016-07-25 50 views
1

我想要一个简单的函数来设置UDP连接的服务器端,只需要使用该端口并返回套接字描述符。这可能吗?还是struct sockaddr变量传入bind需要继续?这是我想要的功能:结构sockaddr可以通过绑定是一个局部变量吗?

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; 
} 

这个工作吗?或者,我必须保持sockaddr_in结构链接到套接字描述符?

回答

1

你有什么好。

一旦你bind一个套接字,你传入的sockaddr结构不需要以任何方式保留。

原因bind()需要struct sockaddr *是因为有几个结构可以接受(struct sockaddr_in对于IPv4,struct sockaddr_in6对于IPv6,struct sockaddr_un用于UNIX域套接字等)。这些结构中的每一个都是不同的大小,所以函数需要一个指针(由于历史原因,使用sockaddr*)以及所指向的结构的大小。

0

当您调用绑定时,您的代码将正常工作网络堆栈需要struct sockaddr信息将传递的套接字描述符绑定到您通过struct sockaddr传递的端口和地址。之后,您可以使用套接字描述符进行进一步的通信。