-1
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

我的理解是否正确,这将为此套接字使用本地端口,任何人都可以澄清它决定使用哪个端口吗?有没有办法控制套接字打开的本地端口?

4

4 回答 4

3

这只会创建一个执行 TCP 的 AF_INET (ipv4) 套接字。一旦你调用connect它,它将绑定到一个端口,如果还没有通过bind. 如果您想自己选择端口号,只需bind手动选择。

于 2013-09-01T12:58:09.787 回答
1

bind()新创建的套接字在您、listen()connect()它之前没有地址。

如果你想connect()listen()在那个套接字上,你不一定要先绑定到地址和端口;一个将被自动分配。但是,如果您尝试运行其他人将连接到的服务器,您可能希望首先连接到bind()已知地址和端口。有时您想从特定的地址和端口连接出去,而您在这里也必须bind()首先连接。

如果要查找现有套接字绑定的地址,请使用getsockname().

于 2013-09-01T13:17:07.373 回答
1

使用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)可用端口的特殊情况

于 2013-09-01T12:57:35.903 回答
0

阅读socket(2)ip(7)手册页以及一些关于 Linux 套接字的教程。您还需要调用bind(2)系统调用来绑定到某个特定端口。

于 2013-09-01T12:58:25.993 回答