考虑以下代码:

iSocket = socket(PF_INET, SOCK_DGRAM, 0);
memset(&sSocketAddr, 0, sizeof(sSocketAddr));

sSocketAddr.sin_family = AF_INET;
sSocketAddr.sin_addr.s_addr = htonl(INADDR_ANY);
sSocketAddr.sin_port = htons(10003);
Res = bind(iSocket, (struct sockaddr *)&sSocketAddr, sizeof(struct sockaddr_in));


在上面的代码中,bind返回-1。但是对于任何其他端口号,它返回0(无错误)。我需要根据UDP客户端要求使用10003。如何使它起作用?

最佳答案

如绑定手册页(http://linux.die.net/man/2/bind)中所述:


  如果出错,则返回-1,并正确设置errno。


我认为这是每个POSIX调用中的标准过程,有一个名为errno的整数,其中包含实际错误的值。您可以手动检查其值,也可以将原语用作perror或strerror(http://www.beej.us/guide/bgnet/output/html/multipage/perrorman.html

if (Res  == -1) { // some error has occurred
    // prints "socket error: " + the error message:
    perror("socket error");
}


您可能想要#include<errno.h>(对于打印功能,则为stdio.h

09-06 09:53