好的,我可以创建一个套接字并向远程机器发送消息(UDP顺便说一句)。我的问题是我需要知道我发送消息的端口。远程计算机将在我发送的同一端口上响应。现在它似乎正在挑选随机高端口,如46555.有没有办法指定它出来的端口或有什么方法来找出端口号是什么?
感谢。
答案 0 :(得分:4)
虽然可以选择特定的传出端口,但通常不会这样做。
通常,客户端将选择一个随机的,高编号的端口(正如它所做的那样),然后服务器将检测客户端正在使用哪个端口,并回复该端口。使用POSIX(Berkeley)套接字,服务器将使用recvfrom
函数获取此信息,而不是recv
函数。 recvfrom
函数需要额外的两个参数,它将填充从中接收数据包的地址,包括端口号。
答案 1 :(得分:2)
你的问题的简短回答是“bind()”,假设一个接口是BSD-socket-ish。
答案越长
bind(fd, (struct sockaddr *) &addr, sizeof(struct sockaddr_in))
其中fd是套接字的文件描述符。但是等等,你问,这个“addr”是什么,为什么它是指向struct sockaddr的指针?
在你的情况下,addr是
struct sockaddr_in addr;
这是一个Internet sockaddr结构(可以转换为基本sockaddr结构的指针)。在调用bind之前,需要初始化addr:
addr.sin_family = AF_INET;
addr.sin_port = <your chosen port number here!>;
addr.sin_addr = INADDR_ANY;
在aclling bind之后,套接字将绑定到您选择的端口而不是随机端口,您可以在该端口上发送和接收UDP消息。
答案 2 :(得分:1)
当您从源计算机发送消息时,将其发送到特定的IP和PORT 在远程计算机上,您需要打开一个套接字,并绑定套接字以侦听特定端口。
在任何情况下,您都指定两台机器上的端口(使用通常的api)。 远程计算机上的套接字正在侦听您可以定义的特定端口。
beej's指南
中有很多信息答案 3 :(得分:0)
假设基于POSIX的实现,函数getsockname()
和getpeername()
起作用,至少对于流套接字是有效的。 recvfrom()
和sendto()
函数允许您获取和使用UDP套接字的信息。
如果您正在使用Windows,这些功能可能存在(可能以下划线为前缀),但也有一些本地替代方案可以在MSDN上进行搜索。
答案 4 :(得分:0)
答案 5 :(得分:0)
这里是确定本地客户端UDP套接字端口号的一种方法:
unsigned short local_port; // the port number we're interested in
struct sockaddr_in sin;
int addrlen = sizeof(sin);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = 0; // let the system choose a port number
sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); // create the socket
bind(sd, (struct sockaddr *)&sin, sizeof(sin)); // assign a port number
getsockname(sd, (struct sockaddr *)&sin, &addrlen); // read binding
local_port = ntohs(sin.sin_port); // get the port number
答案 6 :(得分:0)
一种修复端口的方法是使用bind()
,这样您可以在客户端上的特定端口上发送。注意,您应注意不要使用标准端口。此链接将帮助您了解详细信息http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-sg-en-4/ch-ports.html
您可以bind
,然后发送和接收您的数据包。
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = <required port number>;
addr.sin_addr = INADDR_ANY;
Beej的指南是轻松了解套接字编程的好地方。 https://beej.us/guide/bgnet/html/single/bgnet.html#bind
答案 7 :(得分:-1)
初始化套接字时,您应该可以设置调出的端口。我希望我可以不那么模糊,但这取决于你正在使用的套接字实现。例如(from the .NET framework):
public:
void Bind(
EndPoint^ localEP
)
与随附的IPEndpoint类一起使用
public:
IPEndPoint(
IPAddress^ address,
int port
)
允许您将套接字设置为您希望的任何本地端点。您可以选择将端口设置为零以自动分配给您。还可以选择将IPAddress设置为INADDR_ANY,即discouraged.