C++ 我可以在TCP和UDP中使用相同的sockaddr_吗?
在我的serveur中,我将TCP和UDP绑定在两个不同的端口上。 我首先用TCP连接我的客户机(通过accept等) 然后我想使用UDP在服务器和客户端之间进行通信。 因此,我尝试在中使用相同的C++ 我可以在TCP和UDP中使用相同的sockaddr_吗?,c++,sockets,tcp,udp,C++,Sockets,Tcp,Udp,在我的serveur中,我将TCP和UDP绑定在两个不同的端口上。 我首先用TCP连接我的客户机(通过accept等) 然后我想使用UDP在服务器和客户端之间进行通信。 因此,我尝试在中使用相同的sockaddr\u,如下所示: void AUDPMonitor::sendMessage(Message &msg) { for (ISocket *socket: *_fdListClients) { if (msg.getClientId() == socket->
sockaddr\u,如下所示:
void AUDPMonitor::sendMessage(Message &msg)
{
for (ISocket *socket: *_fdListClients)
{
if (msg.getClientId() == socket->getSock())
{
UDPSocket *UdpSocket = reinterpret_cast<UDPSocket *>(socket);
UdpSocket->send(msg, socket->getUserAddr());
break;
}
}
}
您可以在
中为TCP和UDP使用相同的sockaddr\u副本,但它们必须位于不同的套接字上
使用AF_INET
创建的给定套接字还指定SOCK_STREAM
生成TCP或SOCK_DGRAM
生成UDP
所以如果你有这个:
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(12345);
您可以通过TCP套接字将其传递到绑定到TCP/12345的bind
,您可以通过UDP套接字将其传递到绑定到UDP/12345的bind
。您可以在TCP或UDP服务器或客户端的结构中使用相同的sockaddr\u,但只要您想将其用于不同的端口,就应该更改端口和地址的值,因为服务器不能绑定到同一端口
因此,如果我们有两个远程站点运行TCP服务器和UDP服务器,则需要客户端来连接它们:
SOCKET servTcp; // a remote bound and listing tcp socket waiting for remote clients through the blocking function `accept`
SOCKET servUdp; // a remote bound Udp server waiting for clients
//对于客户:
SOCKET clientTcp = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKET clientUdp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
SOCKADDR_IN sa_serv;
sa_serv.sin_addr.S_un.S_addr = inet_addr("127.168.0.1");
sa_serv.sin_family = AF_INET;
sa_serv.sin_port = htons(777);
现在,socket clientTcp可以使用此地址结构连接到远程tcp服务器
要为udp服务器使用相同的SOCKADDR_结构sa_serv,请执行以下操作:
只要tpc和udp服务器位于同一远程机器上,我们只需更改端口:
sa_serv.sin_port = htons(1000); // the port is unique for servers to bind on.
现在,我们可以使用udp套接字客户端udp使用sa_serv从远程udp服务发送和接收数据
- SOCKADDR_IN对于udp和tcp是相同的,只是更改端口的值,有时更改服务器的地址
不是在创建服务器套接字时,而是在接受客户端套接字时。我编辑了我的帖子。对于UDP,您不需要调用accept
。您需要使用sendto
指定远程端的IP/端口,或者需要调用connect
,传递客户端的IP/端口,以便send
知道发送到哪里。@dbush事实上,他想使用从tcp获得的sockaddr,并使用它们以UDP向他的客户端发送消息。例如,我接受TCP中的客户端。我把他的袜子放进去了。然后我在sendto()函数中给出了这个sockaddr_。@DimitriDanilov要使其工作,客户端监听的UDP端口号必须与它连接到服务器的TCP端口号相同。然后,客户端必须在调用“connect”之前绑定TCP端口。
sa_serv.sin_port = htons(1000); // the port is unique for servers to bind on.