C++ linux套接字仅接收第一个数据块

C++ linux套接字仅接收第一个数据块,c++,linux,sockets,C++,Linux,Sockets,我有两个程序,在服务器上,只听,客户端在说话。我发送1兆字节的数据,每个数据块64字节。我将获取64字节的第一个块,但随后我的服务器退出,因为它无法获取其他数据。我的客户正在发送所有数据 void ServerLinux::Receive(){ int sock = 0; struct sockaddr_in server; char buffer[this->packageLength]; if ((sock = socket(PF_INET, SOC

我有两个程序,在服务器上,只听,客户端在说话。我发送1兆字节的数据,每个数据块64字节。我将获取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;
    }
}
void服务器Linux::Receive(){
int-sock=0;
服务器中的结构sockaddr_;
字符缓冲区[此->packageLength];
if((sock=socket(PF_INET,sock_STREAM,IPPROTO_TCP))<0){
此->模具(“创建套接字失败”);
}
memset(&server,0,sizeof(server));
server.sinu family=AF\u INET;
server.sin_addr.s_addr=htonl(INADDR_ANY);
server.sin_port=htons(此->端口);
if(绑定(sock,(struct sockaddr*)和服务器,sizeof(服务器))<0){
此->死亡(“绑定服务器套接字失败”);
}
if(监听(sock,1)<0){
此->死亡(“在服务器套接字上侦听失败”);
}
int clientSocket=0;
客户端中的结构sockaddr_;
socklen_t size=sizeof(客户);
if((clientSocket=accept(sock,(struct sockaddr*)和client,&size))<0){
此->死亡(“无法接受客户端”);
}
接收的int=-1;
//这是很好的数据接收
如果((received=recv(clientSocket,buffer,this->packageLength,0))<0){
此->死亡(“无法从客户端接收初始字节”);
}
标准::包装长度,0)小于0){
此->死亡(“在客户端接收额外字节失败”);
}

std::cout为什么不对recv使用相同的参数

作品:recv(clientSocket,缓冲区,this->packageLength,0)

recv不工作(sock,缓冲区,此->packageLength,0)


将sock更改为clientSocket

另外,要学会喜欢通过分析ERRNO来检查函数返回的实际错误。这可能是一个建议
do{…}while(…)
循环以避免代码重复。嗯,这实际上有点尴尬@SergeyA我不敢相信他们在大学里没有想到我们。谢谢,很高兴知道。@奥洛夫,从个人经验来看,他们在大学里不会教你任何好的计算机科学知识。每次他们教你,这都是一个非常幸运的例外。你是ee,由于多种原因,真正优秀的程序员很少是计算机科学教师。除了错误消息之外,不需要第一个套接字函数。在while之前设置received>0,它将正常工作。无需执行…while