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

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

你无法listen数据报套接字,它根本就没有为它定义。 您只需要bind并开始循环读取。

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


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

无需在UDP套接字上listen(2) ,如@cnicutar所提到的那样,就是TCP。 只需recv(2)recvfrom(2)