我想知道TCP客户端是否可以使用相同的端口连接到不同的远程TCP服务器?
在网络编程中,有两个函数:sendto和send。当我们使用时,send我们不需要指定目的地。这似乎意味着一个连接的 TCP 套接字只能与一个(源 IP、源端口、目标 IP、目标端口)4 元组相关。
我可以做类似的事情吗:
sockfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&cliaddr,sizeof(cliaddr));
cliaddr.sin_family = AF_INET;
cliaddr.sin_addr.s_addr=inet_addr(local_ip);
cliaddr.sin_port=htons(32000);
bind(listenfd,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
connect(sockfd, (struct sockaddr *)&servaddr1, sizeof(servaddr1));
connect(sockfd, (struct sockaddr *)&servaddr2, sizeof(servaddr2));
sendto(sockfd, buf, len, 0, (struct sockaddr *)&servaddr1, socklen);
sendto(sockfd, buf, len, 0, (struct sockaddr *)&servaddr2, socklen);
Run Code Online (Sandbox Code Playgroud)
例如,http 代理是否可能耗尽端口并必须重用端口?
为了回答这个问题,我们可能需要区分 TCP(与 API 无关的协议)和 BSD 套接字(最知名和广泛采用的 API,应用程序通过它访问其操作系统的 TCP 堆栈的功能)。
正如您已经注意到的,TCP 协议将每个 4 元组(源 IP、源端口、目标 IP、目标端口)视为一个单独的连接。更改该 4 元组中的任何一项,它就是一个完全独立的连接。所以,是的,TCP 协议可以处理来自单个源 IP 地址和源端口的多个连接。
是否有一种简单的方法可以从古老的 BSD Sockets API 访问该功能可能是另一个问题。