簡體   English   中英

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

[英]Can I use the same sockaddr_in in TCP and UDP?

在我的服務器中,我將TCP和UDP綁定在兩個不同的端口上。 我首先用TCP連接我的客戶端(通過接受等)

然后我想使用UDP在我的服務器和我的客戶端之間進行通信。 所以我嘗試使用相同的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;
    }
  }
}

_fdListClients是我從TCP連接獲得的Socket的向量。 沒有錯誤消息,但我的客戶端沒有收到任何信息。

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

編輯:當我接受客戶端套接字時

  socklen_t     client_sin_len;
  sockaddr_in   *client_sin = new sockaddr_in;

  client_sin_len = sizeof(sockaddr_in   );
  std::cout << "New User ! " << std::endl;
  if ((cs = accept(fd, reinterpret_cast<struct sockaddr *>(client_sin), &client_sin_len)) == -1)

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

使用AF_INET創建的給定套接字還指定生成TCP的SOCK_STREAM或使其成為UDP的SOCK_DGRAM

所以,如果你有這個:

struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(12345);

您可以將此bind與TCP套接字綁定以綁定到TCP / 12345,您可以將其傳遞bind UDP套接字綁定以綁定到UDP / 12345。

您可以為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是相同的,只需更改端口的值,有時會在服務器上進行尋址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM