如何在 C 中创建一个 UDP 服务器?

Posted

技术标签:

【中文标题】如何在 C 中创建一个 UDP 服务器?【英文标题】:How to create a UDP server in C? 【发布时间】:2012-06-01 06:50:31 【问题描述】:

我正在尝试用 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);

【问题讨论】:

一般来说,许多函数会提供更多关于通过 errno 发生的错误的信息。检查(并记录)errno 总是明智的 - 另请参阅 strerror。 题外话:// cmets 在 C++ 中是允许的,但在 C 中是不允许的... @fvu 很高兴知道。 P.S 我讨厌 C99 :) 【参考方案1】:

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

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


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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于如何在 C 中创建一个 UDP 服务器?的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中创建一个包以网络发送到 C

java怎么实现JSON打包UDP

C++ UDP Socket端口复用

如何在 Apache Tomcat 中创建“别名”?

我的Android进阶之旅如何在Retrofit2 中创建动态 URL?

如何在 C 中创建模块