首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请们帮看下这出了什么有关问题

2012-04-04 
请大虾们帮看下这出了什么问题//开启多个客户端时能通信,但只要关了一个后,就不能通信了,这是怎么回事?谢

请大虾们帮看下这出了什么问题
//开启多个客户端时能通信,但只要关了一个后,就不能通信了,这是怎么回事?谢谢各位了
//Server

C/C++ code
#include <winsock.h>   #include <iostream>   using namespace std;#define PORT  5150   #define MSGSIZE  1024   #pragma comment(lib, "ws2_32.lib")   int g_iTotalConn = 0;   SOCKET g_CliSocketArr[FD_SETSIZE];   SOCKET sListen; fd_set fdread; DWORD WINAPI WorkerThread(LPVOID lpParam);   int main(int argc, char* argv[])   {       WSADATA wsaData;             SOCKADDR_IN local;       DWORD dwThreadId;       // Initialize windows socket library       WSAStartup(0x0202, &wsaData);       // Create listening socket       sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);       // Bind       local.sin_family = AF_INET;       local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);       local.sin_port = htons(PORT);       bind(sListen, (sockaddr*)&local, sizeof(SOCKADDR_IN));       // Listen       listen(sListen, 3);       // Create worker thread       CreateThread(NULL, 0, WorkerThread, NULL, 0, &dwThreadId);           int i;                int ret;           struct timeval tv = {1, 0};           char szMessage[MSGSIZE];           while (TRUE)            {               FD_ZERO(&fdread);             for(i=0; i<g_iTotalConn; i++)             {                FD_SET(g_CliSocketArr[i], &fdread);            }            // We only care read event               ret = select(0, &fdread, NULL, NULL, &tv);               if (ret == 0)                {                   // Time expired                   continue;               }               for (i = 0; i < g_iTotalConn; i++)                {                   if (FD_ISSET(g_CliSocketArr[i], &fdread))                    {                       // A read event happened on g_CliSocketArr                       ret = recv(g_CliSocketArr[i], szMessage, MSGSIZE, 0);                       if (ret == 0 || (ret == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET))                        {                           // Client socket closed                           printf("Client socket %d closed.\n", g_CliSocketArr[i]);                      //    FD_CLR(g_CliSocketArr[i], &fdread);                //        closesocket(g_CliSocketArr[i]);                           if(i<g_iTotalConn-1)                           {                               g_CliSocketArr[i] = g_CliSocketArr[g_iTotalConn-1];                           }                           g_iTotalConn--;                        cout<<"g_iTotalConn:"<<g_iTotalConn<<endl;                    }                        else                             //根据客户要求查询,并返回结果                    {                           // We reveived a message from client                           szMessage[ret] = '\0';                           send(g_CliSocketArr[i], szMessage, strlen(szMessage), 0);                       }                   }               }           }           return 0;   }   DWORD WINAPI WorkerThread(LPVOID lpParam)   {       while (TRUE)    {        int iAddrSize = sizeof(SOCKADDR_IN);         SOCKET sClient;        SOCKADDR_IN client;        // Accept a connection           sClient = accept(sListen, (sockaddr*)&client, &iAddrSize);           printf("Accepted client:%s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));           // Add socket to g_CliSocketArr           g_CliSocketArr[g_iTotalConn++] = sClient;         FD_SET(g_CliSocketArr[g_iTotalConn-1], &fdread);      }}  


//Client

C/C++ code
#include <WINSOCK2.H>   #include <stdio.h>   #pragma comment(lib, "ws2_32.lib")   #define SERVER_ADDRESS  "127.0.0.1"   #define PORT  5150   #define MSGSIZE  1024   int main(int argc, char* argv[])   {       WSADATA wsaData;       SOCKET sClient;       SOCKADDR_IN server;       char szMessage[MSGSIZE];       int ret;       // Initialize windows socket library       WSAStartup(0x0202, &wsaData);       // Create client socket       sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);       // Connect to server       memset(&server, 0, sizeof(SOCKADDR_IN));       server.sin_family = AF_INET;       server.sin_addr.S_un.S_addr = inet_addr(SERVER_ADDRESS);       server.sin_port = htons(PORT);       connect(sClient, (sockaddr*)&server, sizeof(SOCKADDR_IN));       while (TRUE)        {           printf("Send:");           gets(szMessage);           // Send message           send(sClient, szMessage, strlen(szMessage), 0);           // Receive message           ret = recv(sClient, szMessage, MSGSIZE, 0);           szMessage[ret] = '\0';           printf("Received [%d bytes]: '%s'\n", ret, szMessage);       }       // Clean up       closesocket(sClient);       WSACleanup();       return 0;   }   



[解决办法]
编译运行你的程序,没有任何问题啊。即使多个客户端同时开启的情况下,关闭其中一个,还是可以正常通信的。

只是你的程序一直是死循环,要退出就只有Ctrl+C了。

你程序的功能相当于:client发送内容到server,server再发送回来,client接收到消息后,再发送数据。如此循环。

热点排行