2016-12-21 58 views
3

在我的服務器上,我在兩個不同的端口上綁定了TCP和UDP。 我第一次連接我的客戶端與TCP(通過接受等)我可以在TCP和UDP中使用相同的sockaddr_in嗎?

然後,我想使用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聯接了。 沒有錯誤消息,但我的客戶端沒有收到任何東西。

所以我想知道是否有可能使用相同的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) 

回答

2

可以使用sockaddr_in TCP和UDP的同一個副本,但他們必須在不同的插座。

使用AF_INET創建的給定套接字也指定使得TCP或SOCK_DGRAM使其成爲UDP的SOCK_STREAM

所以,如果你有這樣的:

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套接字傳遞給bind綁定到UDP/12345。

+0

這不是當我創建服務器套接字,而是當我接受客戶端套接字。我編輯了我的帖子。 –

+0

對於UDP,您不要調用「accept」。您需要使用'sendto'來指定遠端的IP /端口,或者您需要調用'connect',傳遞客戶端的IP /端口,以便'send'知道要發送到哪裏。 – dbush

+0

@dbush實際上,他想使用從tcp獲得的sockaddr,並使用它們以UDP方式向其客戶端發送消息。 例如,我接受TCP中的客戶端。我得到了他的sockaddr_in。然後我在sendto()函數中給這個sockaddr_in。 –

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); 

現在插座clientTcp可以使用此地址結構連接到遠程tcp服務器。

使用相同的SOCKADDR_IN結構sa_serv的UDP服務器:

只要同一個遠程機器上的TPC和UDP服務器,我們只能改變端口:

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

現在我們udp套接字clientUdp可以使用sa_serv來從遠程udp serv發送和接收數據。

  • SOCKADDR_IN是UDP和TCP一樣只是改變端口的值,如果服務器有時解決。
相關問題