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

时间:2010-11-11 18:21:30

标签: 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 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)

当我在定义中将端口更改为2100时,它会听取:

phantasia  2266     root    4u  IPv4 2021315       TCP *:13320 (LISTEN)

这是一些旧代码,但在编译时没有任何警告或错误。也许有些事情在我脑海里浮现。我绑定时有一个调试日志,它报告它绑定到端口2101。

2 个答案:

答案 0 :(得分:6)

PHANTASIA_PORT替换为htons(PHANTASIA_PORT)

答案 1 :(得分:2)

指定端口号时使用htons功能。

所以这一行:

bind_address.sin_port = PHANTASIA_PORT;

应该是:

bind_address.sin_port = htons(PHANTASIA_PORT);

htons是一个函数,可以将主机整数转换为网络整数,并在必要时修复它们的字节顺序(HI-LO / LO-HI字节顺序)。