11

我正在尝试用 C(在 Linux 下)编写一个 UDP 服务器。我知道在socket()函数中我必须使用SOCK_DGRAM而不是SOCK_STREAM.

if ( (list_s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0 ) 
{
    fprintf(stderr, "ERROR");
}

但是现在,当我尝试运行程序时(编译时没有错误),它说listen(). 这是对它的调用:

if (listen(list_s, 5) < 0)
{
    fprintf(stderr, "ERROR IN LISTEN");
    exit(EXIT_FAILURE);
}

你能弄清楚问题是什么吗?这是代码:

int       list_s;                /*  listening socket          */
int       conn_s;                /*  connection socket         */
short int port;                  /*  port number               */
struct    sockaddr_in servaddr;  /*  socket address structure  */

if ( (list_s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0 ) 
{
    fprintf(stderr, "ERROR\n");
}

memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family      = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port        = htons(port);

if ( bind(list_s, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 )
{
    fprintf(stderr, "ERROR IN BIND \n");
}

if ( listen(list_s, 5) < 0 )      // AL POSTO DI 5 LISTENQ
{
    fprintf(stderr, "ERROR IN LISTEN\n");
    exit(EXIT_FAILURE);
}
4

2 回答 2

24

您不能listen在数据报套接字上,它根本没有为它定义。您只需要bind并开始循环阅读。

作为一个简短的解释,listen通知操作系统它应该期望该套接字上的连接,并且您将在以后接受它们。显然,这对数据报套接字没有意义,因此会出现错误。


旁注:您应该尝试使用perror来打印此类错误。在这种情况下,它(可能)会说Operation not supported

于 2012-05-25T17:10:35.730 回答
5

正如@cnicutar 所提到的,不需要listen(2)在UDP 套接字上,即用于TCP。只是recv(2)recvfrom(2)

于 2012-05-25T17:14:27.877 回答