可以在数据报套接字中使用发送和接收吗?

Posted

技术标签:

【中文标题】可以在数据报套接字中使用发送和接收吗?【英文标题】:Is it ok to use in both datagram socket for send and received? 【发布时间】:2012-09-25 10:45:00 【问题描述】:

我的 MasterSlaveSynchronize 类用于发送和接收心跳。 是否可以只有一个数据报套接字同时用于发送和接收?

下面的2个方法可以定时运行,也可以同时运行。

void MasterSlaveSynchronize::sendHearBeat() 
    const int HEARBEAT_LEN = 1;
    const char HEARBEAT[1] =  '1' ;

    int n = sendto(sock, HEARBEAT, HEARBEAT_LEN, 0,(const struct sockaddr *) &target_, length_);
    if (n < 0)
        printf("Sendto"); //TODO ERR


void MasterSlaveSynchronize::recivedHearBeat() 
    char buf[1024];
    if (bind(sock, (struct sockaddr *) &this_, length_) < 0)
        printf("binding"); //TODO err
    while (1) 
        int n = recvfrom(sock, buf, 1024, 0, (struct sockaddr *) &target_,&length_);
        if (n < 0)
            printf("recvfrom"); //TODO ER
        //TODO update got hearbeat
    

【问题讨论】:

【参考方案1】:

是的,对sendtorecvfrom 使用相同的套接字很好(确实是预期的)。

但是,您的 recivedHearBeat() 函数永远不会退出。没关系,如果它在单独的线程中运行。

【讨论】:

是的,确保它在不同的线程中运行。该类既用作发送心跳的客户端,也用作接收心跳的服务器。可以使用相同的端口进行发送和接收吗?最后一个(也是愚蠢的)-套接字的dosnt绑定将其绑定到特定用途(ip,端口)? 是的,bind 确实使套接字特定于一个(ip,端口),然后用于发送和接收。 bind 需要在调用 sendto 函数之前发生。 但是对于 sendHearBeat 我不需要使用绑定。 @user1495181 不,一旦在套接字上完成,它就会在两个方向上应用。 我根本不需要它来从客户端发送到服务器。我可以使用 sendHearBeat 方法,只创建没有任何绑定的套接字,它将作为客户端工作。

以上是关于可以在数据报套接字中使用发送和接收吗?的主要内容,如果未能解决你的问题,请参考以下文章

unix 套接字数据报:服务器接收到无效字符

流式套接字(SOCK_STREAM),数据报套接字 (SOCK_DGRAM) 的比较

发送和接收 Socket 数据报

如何拆分接收到的 boost asio udp 套接字联合数据报

socket 错误之:OSError: [WinError 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。

QT下UDP套接字通信——QUdpSocket 简单使用