为什么我可以绑定到C中的(看似)无效端口?

时间:2012-10-23 07:22:11

标签: c sockets

我使用BSD套接字在C中创建了一个基本的客户端和服务器。我能够绑定到65535以上的端口号,客户端可以连接到它。我在这里做错了什么?

代码:

int port = 999999;
...
serverAddr.sin_port = htons(port);

2 个答案:

答案 0 :(得分:5)

因为htons采用16位参数,其输入将被截断。

试试这个,看看你得到了什么:

#include <stdio.h>
#include <arpa/inet.h>

int
main(int argc, char **argv)
{
        int foo = 999999;
        int bar = ntohs(htons(foo));

        printf("%d\n", bar);

        return 0;
}

答案 1 :(得分:2)

htons适用于短整数。所以它会将数字截断为16位版本。在这种情况下,您应该使用带有32位整数的htonl。但它也不会工作。在netinet/in.h sockaddr_in中定义为,

struct sockaddr_in
  {
    __SOCKADDR_COMMON (sin_);
    in_port_t sin_port;         /* Port number.  */
    ....
  };

in_port_t定义为

/* Type to represent a port.  */
typedef uint16_t in_port_t;

因此sin_port 16位整数。截断也将在这里发生。 因此,如果您运行以下代码,

int main(){
    unsigned long l = 0x00010001;
    unsigned short s = 0x00;
    printf("l=0x%08lX\n", l);       
    printf("s=0x%08X\n", s=l);      
    printf("l=0x%08lX\n", l=s);    
    return 0;
}

输出

l=0x00010001
s=0x00000001
l=0x00000001

了解高阶位如何丢失! IDEONE