Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:套接字绑定到错误的端口_C_Sockets - Fatal编程技术网

C:套接字绑定到错误的端口

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

我有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 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考虑因素。