c++ - 使用 C++ 套接字时无法接收到多个消息

标签 c++ sockets

我附上了下面的代码,标题说明了一切。我能够收到一条消息,然后在第一条消息之后发送的所有其他消息都不会发送或未读入。

客户端,多次调用send_msg,cppClientSocket是建立连接的构造函数。

void cppClientSocket::send_msg(const char msg[], int size){
    sendto(sockfd ,msg, size , 0, (struct sockaddr *)&serv, sizeof(serv));
}

cppClientSocket::cppClientSocket(int port){
    sockfd = socket(AF_INET,SOCK_DGRAM,0);

    serv.sin_family = AF_INET;
    serv.sin_port = htons(port);
    serv.sin_addr.s_addr = inet_addr("127.0.0.1");
};

Server,cppServerSocket用于构造对方的UDP套接字。检索从另一个类连续调用(在 while 循环内)。

cppServerSocket::cppServerSocket(int port){
    fd = socket(AF_INET, SOCK_DGRAM, 0);
    if(fd<0){
        std::cout << "AN error occured when creating the socket" << std::endl;
        return;
    }

    addrlen = sizeof(remaddr); /* length of addresses */ 

    /* bind the socket to any valid IP address and a specific port */ 
    memset((char *)&myaddr, 0, sizeof(myaddr)); 
    //set to udp
    myaddr.sin_family = AF_INET;
    //host to network - long : convert a number into a 32-bit network representation.
    myaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    //host to network - short : convert a number into a 16-bit network representation.
    myaddr.sin_port = htons(port);

    if (bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) {
        perror("bind failed"); 
        return; 
    }
}

std::string cppServerSocket::retrieve(){
    int count = recvfrom(fd, buf, BUFSIZE-1, 0, (struct sockaddr *)&remaddr, &addrlen); 
    if(!displayedError && count < 0){
        std::cout << "An Error occured: " << strerror(errno) <<  std::endl;
        displayedError = true;
        return "";
    }
    if (count >= 0){
        printf("received message: \"%s\"\n", buf);
        std::string rcv(buf,count);
        return rcv;
    }
}

感谢您的帮助!

更新 如果我修改检索,使其像一个服务器一样简单地打印它收到的每条消息,它就可以正常工作而不会出错...

std::string cppServerSocket::retrieve(){
    for(;;){
    int count = recvfrom(fd, buf, BUFSIZE-1, 0, (struct sockaddr *)&remaddr, &addrlen); 
    if(!displayedError && count < 0){
        std::cout << "An Error occured: " << strerror(errno) <<  std::endl;
        displayedError = true;
        //return "";
    }else if (count >= 0){
        printf("received message: \"%s\"\n", buf);
        std::string rcv(buf,count);
        //return rcv;
    }
    }
    return "";
}

下面添加了用于调用原始 retrieve() 方法的代码。

void check_socket(cppServerSocket css){
    string temp;

    temp.append(css.retrieve());
    if(temp.size()>0){
        std::cout << temp << std::endl; //for debugging
        debug.push_back(temp);
        debug.pop_front();
    }
}

下面是调用 check_socket() 方法的 main 中的代码

    //code inside of main
    cppServerSocket css(3000);
    for(int i=0; i< test_time; i++){
        printScreen(test_devices, test_dev_status, false);
        t = clock();
        while(clock() - t < CLOCKS_PER_SEC){
            check_socket(css);
        }
    }

最佳答案

知道了!!!

问题出在 check_socket(cppServerSocket css) 中,因为我没有通过引用传递我的 cppServerSocket 的析构函数被调用,并且在那个析构函数中我指定了套接字应该关闭。因此,在收到第一条消息后,socked 将被关闭。为了解决这个问题,我通过引用传递了 cppServerSocket

void check_socket(cppServerSocket &css){
    string temp;

    temp.append(css.retrieve());
    if(temp.size()>0){
        std::cout << temp << std::endl; //for debugging
        debug.push_back(temp);
        debug.pop_front();
    }
}

感谢大家的帮助!

关于c++ - 使用 C++ 套接字时无法接收到多个消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48437229/

相关文章:

c++ - 抽象基类的设计问题?

c++ - 快速计数大量序列中的核苷酸类型

c++ - vim 不高亮某些 c++ 关键字

c++ - 错误, “include/Trading_GenericTemplate.h:37: error: expected constructor, destructor, or type conversion before â=â token”

python-3.x - api返回奇数响应

Linux套接字和多线程程序

sockets - 如何将套接字连接更改为超时而不是完全关闭?

node.js - socket.io 的可扩展架构

c - 从 C 读取套接字

c++ - 等待另一个进程锁定然后解锁 Win32 互斥量