我使用 BSD 套接字在 C 中制作了一个基本的客户端和服务器。我能够绑定到65535以上的端口号,客户端可以连接到它。我在这里做错了什么?
代码:
int port = 999999;
...
serverAddr.sin_port = htons(port);
因为 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;
}
htons
适用于短整数。所以它会将数字截断为 16 位版本。在这种情况下,您应该使用htonl
32 位整数。但它也不会工作。Innetinet/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