Mar*_*oni 10 c sockets udp bind listen
我正在尝试用C编写UDP服务器(在Linux下).我知道在socket()函数中我必须使用SOCK_DGRAM而不是SOCK_STREAM.
if ( (list_s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0 )
{
fprintf(stderr, "ERROR");
}
Run Code Online (Sandbox Code Playgroud)
但现在,当我尝试运行程序时(编译时没有错误),它表示存在错误listen().这是对它的调用:
if (listen(list_s, 5) < 0)
{
fprintf(stderr, "ERROR IN LISTEN");
exit(EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)
你能弄明白问题是什么吗?这是代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
cni*_*tar 23
你不能listen在数据报套接字上,它根本就没有为它定义.你只需要bind开始阅读循环.
作为一个简短的解释,listen通知操作系统它应该期望该套接字上的连接,并且您将在以后接受它们.显然,对数据报套接字没有意义,因此错误.
旁注:您应该尝试使用perror打印此类错误.在这种情况下,它(可能)表示操作不受支持.