我可以在TCP和UDP中使用相同的sockaddr_in吗?

时间:2016-12-21 15:44:01

标签: c++ sockets tcp udp

在我的服务器中,我将TCP和UDP绑定在两个不同的端口上。 我首先用TCP连接我的客户端(通过接受等)

然后我想使用UDP在我的服务器和客户端之间进行通信。 所以我尝试使用相同的call

sockaddr_in

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连接获得的Socket的向量。 没有错误消息,但我的客户没有收到任何内容。

所以我想知道是否可以使用相同的sockaddr_in或者它是否不可能。

编辑:当我接受客户端套接字

_fdListClients

2 个答案:

答案 0 :(得分:4)

您可以使用sockaddr_in的相同副本用于TCP和UDP,但它们必须位于不同的套接字上。

使用AF_INET创建的给定套接字还指定生成TCP的SOCK_STREAM或使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套接字将其传递给bind以绑定到TCP / 12345,并且可以使用UDP套接字将其传递给bind以绑定到UDP / 12345。

答案 1 :(得分:1)

您可以为TCP或UDP服务器或客户端使用相同的SOCAKADDR_IN结构,但是每当您想要将其用于其他服务器或客户端时,您应该更改端口和地址的值,因为服务器不能绑定到同一端口。

因此,如果我们有两个运行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_IN结构sa_serv:

只要同一台远程机器上的tpc和udp服务器我们只更改端口:

sa_serv.sin_port   = htons(1000); // the port is unique for servers to bind on.

现在我们udp套接字clientUdp可以使用sa_serv来发送和接收来自远程udp serv的数据。

  • 对于udp和tcp,SOCKADDR_IN是相同的,只需更改端口的值,有时会在服务器上进行寻址。