【发布时间】: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 :)