C++ WinSock C++;控制台应用程序即时消息接收不';t型块

C++ WinSock C++;控制台应用程序即时消息接收不';t型块,c++,sockets,networking,blocking,C++,Sockets,Networking,Blocking,我有一个关于WinSock库的问题。 我想写一个简单的即时消息程序。我只为2个客户端编写了它,现在我想对它进行改进,这样它就可以为其中的许多客户端工作,每个客户端都会发送一条消息,其中包含它的编号和将接收消息的客户端的编号 我遇到了一个问题,我想不出为什么这么简单的事情不起作用: 发送消息的客户端函数的代码: void cClientIO::GetID(SOCKET & socket) { u_long iMode = 0; ioctlsocket(socket, FIO

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

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

发送消息的客户端函数的代码:

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;
}
void cClientIO::GetID(套接字和套接字)
{
u_long iMode=0;
ioctlsocket(socket、FIONBIO和iMode);
缓冲液;
发送(套接字、缓冲区、sizeof(缓冲区)、0);
缓冲液;
//我们向服务器发送缓冲区;
发送(套接字、缓冲区、sizeof(缓冲区)、0);
}
//以下是服务器端:
void cRunServer::GetClientInfo(套接字和s){
字符缓冲区[256];
国际结果;
//布洛库
u_long iMode=0;
iResult=ioctlsocket(s、FIONBIO和iMode);
recv(s,buffer,sizeof(buffer),0);

cout由于缓冲区的大小不匹配,因此无法工作。客户端正在发送char[2048]和I recv only char[256]第二个调用将获得缓冲区的其余部分,这就是它继续流动的原因。

为什么不检查
recv
返回的内容?如果函数可能失败,则应始终检查失败,在这种情况下,失败包括连接被关闭。此外,不要盲目检查
WSAGetLastError/GetLastError
,只检查那些e如果先前调用的函数实际失败。My recv函数在第一次和第二次调用中都返回256。MSDN之后的操作:如果没有发生错误,recv返回接收的字节数[…]看起来还可以…但我仍然不明白它为什么不阻塞。尝试在第二个
ioctlsocket
之前添加
iMode=0;
。如果套接字输入缓冲区中有数据,它为什么要阻塞?
recv
调用阻塞的TCP套接字(并且没有
MSG_WAITALL
标志)仅当当前没有可用数据时才会阻塞。如果有可用数据,则调用将立即返回。确定我已修复它。由于缓冲区大小不匹配,因此无法工作。客户端正在发送char[2048]和I recv only[256]第二次呼叫确实得到了剩余的缓冲区,这就是为什么它走得更远…无论如何-感谢各位的回复。