如何创建在C UDP服务器?(How to create a UDP server in C?)

2019-09-17 12:49发布

我想用C来写一个UDP服务器(Linux下)。 我知道,在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);
}

Answer 1:

你可以不listen数据报套接字,它根本就没有为它定义。 你只需要bind ,并开始阅读一环。

作为一个简短的说明, listen通知,它应该预料到插座连接上的操作系统,而且你会在以后的时间来接受它们。 显然,这是没有意义的数据报套接字,从而错误。


旁注:你应该尝试使用perror打印这样的错误。 在这种情况下,将(可能)都表示不支持操作



Answer 2:

没有必要listen(2)在UDP套接字,如@cnicutar提到,那就是为TCP。 刚刚recv(2)recvfrom(2)



文章来源: How to create a UDP server in C?