C++ 多线程客户端未从服务器接收消息

C++ 多线程客户端未从服务器接收消息,c++,sockets,client-server,client-side,C++,Sockets,Client Server,Client Side,我有一个多客户端服务器程序。客户端控制台需要等待用户输入消息发送到服务器,客户端还需要始终可用于接收来自服务器的消息(这是间歇性的)。为了做到这一点,我尝试在客户端设置两个线程,一个用于接收,一个用于发送 最初,客户机程序(我从中下载)被设计为向服务器发送消息并立即接收回消息。这是初始代码(我没有在这里包括函数,因为我知道它们可以工作,并且函数名是自解释的): intmain() { //初始化winsock库 myTcpSocket::initialize(); //获取客户信息 字符串cli

我有一个多客户端服务器程序。客户端控制台需要等待用户输入消息发送到服务器,客户端还需要始终可用于接收来自服务器的消息(这是间歇性的)。为了做到这一点,我尝试在客户端设置两个线程,一个用于接收,一个用于发送

最初,客户机程序(我从中下载)被设计为向服务器发送消息并立即接收回消息。这是初始代码(我没有在这里包括函数,因为我知道它们可以工作,并且函数名是自解释的):

intmain()
{
//初始化winsock库
myTcpSocket::initialize();
//获取客户信息
字符串clientName=clientInfo.getHostName();
字符串clientIPAddress=clientInfo.getHostIPAddress();
//获取服务器的IP地址和名称
字符串serverIPAddress=“”;
readServerConfig(服务器IP地址);
myHostInfo serverInfo(serverIPAddress,ADDRESS);
字符串serverName=serverInfo.getHostName();
//为客户端创建套接字
mytcpsocketmyclient(PORTNUM);
//连接到服务器。
myClient.connectToServer(serverIPAddress,ADDRESS);
int recvBytes=0;
而(1)
{
//向服务器发送消息
char messageToServer[MAX_MSG_LEN+1];
memset(messageToServer,0,sizeof(messageToServer));

cout在多线程程序中,您正在创建两个客户端,一个在
sendHandleThread
中,另一个在
rechandlehread
中,以及两个连接。当然,服务器通过客户端消息进入的连接发送其回复消息,即发送到
sendHandleThread
,这不是prepa红色表示接收它,而
recHandleThread
在其连接上没有接收任何内容,因为没有发送任何内容。
要纠正这种情况,您必须只创建一个客户端连接,并让两个线程使用相同的连接。

我猜服务器可能没有向您的客户端发送任何内容,或者没有发送ReceiveMessage()所需的数据格式。ReceiveMessage()有多少字节希望在返回之前接收?它实际接收多少字节?您可能希望在ReceiveMessage()实现中放置一些printf,以查看其中发生的情况…或者运行WireShark以查看哪些字节实际从服务器传入您的计算机,或者两者都是…服务器正在向客户端发送消息(如果接收函数和发送函数都在同一个线程中,我就可以接收到它。只有当它们被分成不同的线程时,程序才能似乎接收不到任何东西。当两个函数在同一个线程中时,服务器正在向客户端发送消息。您如何证明它正在向cli发送消息当函数位于单独的线程中时,是否使用ent?
int main()
{
//initialize the winsock library
myTcpSocket::initialize();

//get client's information 
string clientName = clientInfo.getHostName();
string clientIPAddress = clientInfo.getHostIPAddress();

//get server's IP address and name
string serverIPAddress = "";
readServerConfig(serverIPAddress);

myHostInfo serverInfo(serverIPAddress,ADDRESS);
string serverName = serverInfo.getHostName();

//create the socket for client
myTcpSocket myClient(PORTNUM);

// connect to the server.
myClient.connectToServer(serverIPAddress, ADDRESS);

int recvBytes = 0;
while (1)
{
    // send message to server
    char messageToServer[MAX_MSG_LEN+1];
    memset(messageToServer, 0, sizeof(messageToServer));
    cout << "[SEND] ";
    cin.getline(messageToServer,MAX_MSG_LEN);

    winLog << "[SEND] " << messageToServer << endl;
    myClient.sendMessage(string(messageToServer));

    if ( !string(messageToServer).compare("Quit") || !string(messageToServer).compare("quit") ) 
        break;

    //receive message from server
    string messageFromServer = "";
    recvBytes = myClient.receiveMessage(messageFromServer);
    if ( recvBytes == -99 ) break;

    cout   << "[RECV:" << serverName << "]: " << messageFromServer << endl;
    winLog << "[RECV:" << serverName << "]: " << messageFromServer << endl;

}

return 1;
}
DWORD WINAPI sendHandleThread(LPVOID threadInfo) //sending thread
{
//this structure contains all the data this callback will work on
myThreadArgument* sendArgument = (myThreadArgument*)threadInfo;

//create the socket for client
myTcpSocket myClient(PORTNUM); //PORTNUM = 1200

// connect to the server.
string serverIPAddress = "";
readServerConfig(serverIPAddress);
myClient.connectToServer(serverIPAddress, ADDRESS);

myHostInfo serverInfo(serverIPAddress,ADDRESS);
string serverName = serverInfo.getHostName();

int recvBytes = 0;

while (1)
{
    // send message to server
    char messageToServer[MAX_MSG_LEN+1];
    memset(messageToServer, 0, sizeof(messageToServer));
    cout << "[SEND] ";
    cin.getline(messageToServer,MAX_MSG_LEN);

    winLog << "[SEND] " << messageToServer << endl;
    myClient.sendMessage(string(messageToServer));

    if ( !string(messageToServer).compare("Quit") || !string(messageToServer).compare("quit") ) 
        break;
}
return 1;
}

DWORD WINAPI recHandleThread(LPVOID threadInfo) //receiving thread
{
//this structure contains all the data this callback will work on
myThreadArgument* recArgument = (myThreadArgument*)threadInfo;

//create the socket for client
myTcpSocket myClient(PORTNUM); //PORTNUM = 1200

// connect to the server.
string serverIPAddress = "";
readServerConfig(serverIPAddress);
myClient.connectToServer(serverIPAddress, ADDRESS);

myHostInfo serverInfo(serverIPAddress,ADDRESS);
string serverName = serverInfo.getHostName();

int recvBytes = 0;

while (1)
{
    //receive message from server
    string messageFromServer = "";
    recvBytes = myClient.receiveMessage(messageFromServer);
    if ( recvBytes == -99 ) break;

    cout   << "[RECV:" << serverName << "]: " << messageFromServer << endl;
    winLog << "[RECV:" << serverName << "]: " << messageFromServer << endl;
}
return 1;
}

int main()
{
//semaphore
mySemaphore coutSemaphore(string(""), 1);

//initialize the winsock library
myTcpSocket::initialize();

//get client's information (assume neither the name nor the address is given)
string clientName = clientInfo.getHostName();
string clientIPAddress = clientInfo.getHostIPAddress();

//get server's IP address and name
string serverIPAddress = "";
readServerConfig(serverIPAddress);

myHostInfo serverInfo(serverIPAddress,ADDRESS);
string serverName = serverInfo.getHostName();

//create sending thread
myTcpSocket send;
string sendName = "sendName";
myThreadArgument* sendArgument = new myThreadArgument(&send, &coutSemaphore, sendName);
myThread* sendThread = new myThread(sendHandleThread, (void*)sendArgument);
sendThread->execute();

//create receiving thread
myTcpSocket rec;
string recName = "recName";
myThreadArgument* recArgument = new myThreadArgument(&rec, &coutSemaphore, recName);
myThread* recThread = new myThread(recHandleThread, (void*)recArgument);
recThread->execute();

while (1)
{

    //dummy process
    Sleep(30000);
    cout << "--" << endl;

}

return 1;
}
DWORD WINAPI clientHandleThread(LPVOID threadInfo)
{
     // this structure will contain all the data this callback will work on
     myThreadArgument* clientArgument = (myThreadArgument*)threadInfo;

   // get the client connection: receiving messages from client and
   // sending messages to the client will all be done by using
   // this client connection
   myTcpSocket* clientConnection = clientArgument->getClientConnect();
   string clientName = clientArgument->getHostName();

   // the server is communicating with this client here
   while(1)
   {
       string messageFromClient = "";

       // receive from the client

       int numBytes = clientConnection->recieveMessage(messageFromClient);
       if ( numBytes == -99 ) break;

       cout   << "[RECV fr " << clientName << "]: " << messageFromClient << endl;

       // if the client wants to disconnect
       if ( messageFromClient.compare("quit") == 0 || messageFromClient.compare("Quit") == 0 )
       {
           break;
       }
       else // send to the client
      {
           clientConnection->sendMessage(string("testing")); //test reply
       }
   }

   // if we reach here, this session with the client is done,
   // so we set the event on this thread to inform the main
  // control that this session is finished
   clientArgument->getExitEvent()->setEvent();
   return 1;
}