socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
我的理解是否正确,这将为此套接字使用本地端口,任何人都可以澄清它决定使用哪个端口吗?有没有办法控制套接字打开的本地端口?
这只会创建一个执行 TCP 的 AF_INET (ipv4) 套接字。一旦你调用connect
它,它将绑定到一个端口,如果还没有通过bind
. 如果您想自己选择端口号,只需bind
手动选择。
bind()
新创建的套接字在您、listen()
或connect()
它之前没有地址。
如果你想connect()
或listen()
在那个套接字上,你不一定要先绑定到地址和端口;一个将被自动分配。但是,如果您尝试运行其他人将连接到的服务器,您可能希望首先连接到bind()
已知地址和端口。有时您想从特定的地址和端口连接出去,而您在这里也必须bind()
首先连接。
如果要查找现有套接字绑定的地址,请使用getsockname()
.
使用bind来控制您使用的本地端口。您还可以选择使用它来选择要使用的网络接口。
以下代码在所有可用接口上选择端口 12345
struct sockaddr_in addr;
addr.sin_family = 2;
addr.sin_addr.s_addr = INADDR_ANY;
addr.in_port = htons(12345);
int err = bind(socket, (struct sockaddr*)&addr, sizeof(addr));
如果您不在乎使用哪个端口,则端口 0 被视为网络堆栈选择一个(y)可用端口的特殊情况
阅读socket(2)和ip(7)手册页以及一些关于 Linux 套接字的教程。您还需要调用bind(2)系统调用来绑定到某个特定端口。