gpt4 book ai didi

c - 为客户端 tcp 套接字绑定(bind)一个端口

转载 作者:太空宇宙 更新时间:2023-11-04 11:02:24 24 4
gpt4 key购买 nike

我有一个关于“绑定(bind)客户端 tcp 套接字的本地端口”的问题。
代码如下:

void tcpv4_cli_connect(const char *srvhost, in_port_t srvport,
const char *clihost, in_port_t cliport)
{
struct sockaddr_in srvaddr, cliaddr;
struct in_addr inaddr;
int sockfd;

bzero(&srvaddr, sizeof(srvaddr));
inet_aton(srvhost, &inaddr);
srvaddr.sin_family = AF_INET;
srvaddr.sin_addr = inaddr;
srvaddr.sin_port = htons(srvport);

bzero(&cliaddr, sizeof(cliaddr));
inet_aton(clihost, &inaddr);
cliaddr.sin_family = AF_INET;
cliaddr.sin_addr = inaddr;
cliaddr.sin_port = htons(cliport);

sockfd = socket(AF_INET, SOCK_STREAM, 0);

bind(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr));

if (connect(sockfd, (struct sockaddr *) &srvaddr, sizeof(srvaddr)) != 0)
perror("Something Wrong");
return;
}


int main(int argc, char *argv[])
{
// Wrong for "220.181.111.86", but ok for "127.0.0.1"
tcpv4_cli_connect("220.181.111.86", 80, "127.0.0.1", 40888);
return 0;
}

当我在 main 函数中执行 tcpv4_cli_connect("220.181.111.86", 80, "127.0.0.1", 40888) 时,(220.181.111.86 是 Internet 上的地址),将显示错误向上:出了点问题:参数无效

如果我在代码中注释 bind(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr)),一切都会好起来的,一个随机端口用于客户端套接字。

但是当我执行 tcpv4_cli_connect("127.0.0.1", 80, "127.0.0.1", 40888) 时无论是否将端口绑定(bind)到客户端套接字都可以。

无效参数对连接操作意味着什么?我想知道是否只允许客户端绑定(bind)特定端口连接到本地地址?客户端只能使用随机端口连接到外部服务器?
有什么我误解了吗?

/br

最佳答案

当您bind()127.0.0.1 (INADDR_LOOPBACK) 时,您绑定(bind)到一个无权访问的环回接口(interface)外部世界,只连接到它自己,所以你不能 connect()127.0.0.1 以外的任何 IP。如果你想在 connect() 到外部服务器时 bind() 到本地接口(interface),你必须绑定(bind)到连接到的接口(interface)的实际 IP可以访问该服务器的网络。

如果您只想bind() 到特定端口,但允许操作系统为您选择合适的接口(interface),则绑定(bind)到0.0.0.0 (INADDR_ANY) 代替。

关于c - 为客户端 tcp 套接字绑定(bind)一个端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26477775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com