【问题标题】:linux sockets only reciving first chunk of datalinux套接字只接收第一块数据
【发布时间】:2015-12-03 02:58:07
【问题描述】:

我有两个程序,在服务器上,只在听,客户端在说话。我以每个 64 字节的块发送 1 兆字节的数据。我将获得 64 字节的第一块,但随后我的服务器退出,因为它无法获取其他数据。我的客户正在发送所有数据。

void ServerLinux::Receive(){

    int sock = 0;
    struct sockaddr_in server;
    char buffer[this->packageLength];

    if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
        this->Die("Failed to create socket");
    }

    memset(&server, 0, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    server.sin_port = htons(this->port);

    if(bind(sock, (struct sockaddr *) &server, sizeof(server)) < 0){
        this->Die("Failed to bind the server socket");
    }
    if(listen(sock, 1) < 0){
        this->Die("Failed to listen on server socket");
    }

    int clientSocket = 0;
    struct sockaddr_in client;
    socklen_t size = sizeof(client);
    if((clientSocket = accept(sock, (struct sockaddr *) &client, &size)) < 0){
        this->Die("Failed to accept client");
    }

    int received = -1;

    //This is fine data is recived
    if((received = recv(clientSocket, buffer, this->packageLength,0)) < 0){
        this->Die("Failed to receive initial bytes from client");
    }
    std::cout << "Received!" << std::endl;

    //Data is not received in this while loop
    while(received > 0){
        if((received = recv(sock, buffer, this->packageLength,0)) < 0){
            this->Die("Failed to receive additional bytes frin client");
        }
        std::cout << "Received!" << std::endl;
    }
}

【问题讨论】:

    标签: c++ linux sockets


    【解决方案1】:

    你为什么不对 recv 使用相同的参数?

    作品:recv(clientSocket, buffer, this->packageLength,0)

    不起作用 recv(sock, buffer, this->packageLength,0)

    将 sock 更改为 clientSocket

    【讨论】:

    • 另外,学会爱通过分析ERRNO来检查函数返回的实际错误。
    • 这可能是建议使用do { ... } while (...); 循环以避免代码重复的好时机。
    • 嗯,这实际上有点尴尬@SergeyA 我不敢相信他们在大学里没有这样想我们。谢谢,很高兴知道。
    • @Olof,从个人经验来看,他们不会在大学里教给你任何好的计算机科学知识。每次他们这样做,这是一个非常幸运的例外。你看,真正优秀的程序员很少是计算机科学老师,原因有很多。
    • 除了错误信息,不需要第一个socket函数。在while之前设置收到> 0,它会正常工作。不需要做......而
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2012-10-25
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    相关资源
    最近更新 更多