如何在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)
。