WinSock C++控制台应用程序即时消息回复不会阻止

WinSock C++ Console App Instant Messanger recv doesn't block

本文关键字:回复 消息 C++ 控制台 应用程序 WinSock      更新时间:2023-10-16

我有一个关于WinSock库的问题。我正在尝试写一个简单的即时消息程序。我只为两个客户端写了它,现在我想改进它,这样它可以为其中的许多客户端工作,每个客户端都会向服务器发送一条消息,其中包含它的编号和将接收消息的客户端的编号。

我遇到了一个问题,我想不通,为什么这么简单的事情不起作用:

发送消息的客户端功能的代码:

void cClientIO::GetID(SOCKET & socket)
{
    u_long iMode = 0;
    ioctlsocket(socket, FIONBIO, &iMode);
    cout << "Type your ID:" << endl;
    cin >> buffer;
    send(socket, buffer, sizeof(buffer), 0);
    cout << "Type reciever ID" << endl;
    cin >> buffer;
    //We send buffer to the server;
    send(socket,buffer,sizeof(buffer), 0);
}

//Here is the server side:

void cRunServer::GetClientInfo(SOCKET & s){
    char buffer[256];
    int iResult;
    //BLOKUJ pls
    u_long iMode = 0;
    iResult = ioctlsocket(s, FIONBIO, &iMode);
    recv(s, buffer, sizeof(buffer), 0);
    cout << "Client number: " << buffer << WSAGetLastError() << endl;
    iResult = ioctlsocket(s, FIONBIO, &iMode);
    recv(s, buffer, sizeof(buffer), 0);
    cout << "Attempts to connect to client ID: " << WSAGetLastError() << endl;
}

我不知道发生了什么。。。第一个recv阻止了我的代码,但第二个没有,只是继续。。。我尝试使用GetWSALastError(),但它一直给我0。。。

感谢您提前提供帮助。

它不起作用,因为缓冲区的大小不匹配。客户端正在发送char[2048],而我只接收char[256],第二个调用获取缓冲区的其余部分,这就是它继续流动的原因。