识别C ++套接字端口号

时间:2010-07-22 21:25:42

标签: c++ sockets udp

好的,我可以创建一个套接字并向远程机器发送消息(UDP顺便说一句)。我的问题是我需要知道我发送消息的端口。远程计算机将在我发送的同一端口上响应。现在它似乎正在挑选随机高端口,如46555.有没有办法指定它出来的端口或有什么方法来找出端口号是什么?

感谢。

8 个答案:

答案 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.