c - 如何在 C 中创建 UDP 服务器?

标签 c sockets udp bind listen

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

最佳答案

您不能在数据报套接字上监听,它根本就没有为它定义。您只需要绑定(bind)并开始循环读取。

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


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

关于c - 如何在 C 中创建 UDP 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10758632/

相关文章:

c++ - 最佳 C++ RTP/RTSP 库

c - 链接列表中的元素没有被删除

c# - 连接运行到网络类型为 NAT 的 VMWare 的 TCP 服务器

java - 安卓UDP通信

objective-c - 使用 uitabbarcontroller 在 iOS 中管理套接字

sockets - 本地传输大文件的最佳 TCP/IP 连接数

c++ - 用于实时视频流的流协议(protocol)和套接字类型

c - 串行编程 - Termios。从设备读取 0x00 字节时卡住

c - Windows 工作站不可知设置广播客户端的正确方法是什么?

c - 在 .h 中声明的结构的填充数组,在 .c 中的函数内部