C:套接字绑定到错误的端口
我有C代码在一个端口上侦听,但它在错误的端口上侦听 这是在.h文件中定义的:C:套接字绑定到错误的端口,c,sockets,C,Sockets,我有C代码在一个端口上侦听,但它在错误的端口上侦听 这是在.h文件中定义的: #define PHANTASIA_PORT 2101 插座: int the_socket, error, on=1; /* create a socket */ errno = 0; if ((the_socket=socket(AF_INET, SOCK_STREAM, 0)) == -1) { sprintf(error_msg, "[0.0.0.0:?] Socket cr
#define PHANTASIA_PORT 2101
插座:
int the_socket, error, on=1;
/* create a socket */
errno = 0;
if ((the_socket=socket(AF_INET, SOCK_STREAM, 0)) == -1) {
sprintf(error_msg,
"[0.0.0.0:?] Socket creation failed in Do_init_server_socket: %s\n",
strerror(errno));
Do_log_error(error_msg);
exit(SOCKET_CREATE_ERROR);
}
error = setsockopt(the_socket, SOL_SOCKET, SO_REUSEADDR,
(char *) &on, sizeof(on));
这就是它的绑定方式:
/* set up the bind address */
bind_address.sin_family = AF_INET;
bind_address.sin_addr.s_addr = INADDR_ANY;
bind_address.sin_port = PHANTASIA_PORT;
/* bind to that socket */
error = bind(the_socket, (struct sockaddr *) &bind_address,
sizeof(bind_address));
error = listen(the_socket, SOMAXCONN);
但当它运行时,lsof报告:
phantasia 2400 root 4u IPv4 2024436 TCP *:13576 (LISTEN)
当我在define中将端口更改为2100时,它转而侦听:
phantasia 2266 root 4u IPv4 2021315 TCP *:13320 (LISTEN)
这是一些旧代码,但在编译时没有任何警告或错误。也许我脑子里有什么事。当它绑定时,我有一个调试日志,它报告它绑定到端口2101。将
PHANTASIA_端口
替换为htons(PHANTASIA_端口)
指定端口号时使用函数
所以这一行:
bind_address.sin_port = PHANTASIA_PORT;
应该是:
bind_address.sin_port = htons(PHANTASIA_PORT);
htons
是一个函数,它将主机整数转换为网络整数,并在必要时修复它们的尾数(整数中的HI-LO/LO-HI字节顺序)。这是API中一个绝对可怕的缺点,但它永远不会消失。@wnoise:100%同意。很久以前,有个白痴认为在内核空间中保存一个bswap
操作码是值得的,因为它污染了每一个使用丑陋的endian依赖项编写的用户空间应用程序。@wnoise@R。。不同意。如果你通过网络发送东西,你必须知道endianness,对sockaddr_*用户隐藏它对任何人都没有帮助。(尽管我承认,任何人通过网络发送原始sockaddr_*struct,或者任何与此相关的原始struct,都应该受到严厉的惩罚)。@ninjalj:唯一应该通过网络发送的东西是标准文件格式的文本和二进制文件,它们是纯八位字节序列,没有endian考虑。发送和接收C结构是一种完全落后的做法,应该在20年前废除。这使得sockaddr
脑损伤成为一个体面的现代程序中唯一的endian考虑因素。