Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以在TCP和UDP中使用相同的sockaddr_吗?_C++_Sockets_Tcp_Udp - Fatal编程技术网

C++ 我可以在TCP和UDP中使用相同的sockaddr_吗?

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

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

然后我想使用UDP在服务器和客户端之间进行通信。 因此,我尝试在中使用相同的
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.