Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Select()cpp跟踪客户机数据需求 首先,我对C++仍然很陌生。我正试图写一个全球导航卫星系统互联网广播节目。基本上,当客户机登录并被接受时,我的程序将客户机请求的数据流源存储在客户机类中。我打算使用两个数组的索引号来匹配一个客户机对象数组和一个clientSockets数组,但是试图使用Select()检查非阻塞套接字会使这变得复杂。我已经找到了一些实现Select()的示例,但我不确定如何从用于接受listenSocket连接的数组中跟踪原始clientSocket class Client{ public: std::string source; std::string user; //stored in txt file as name:password boolean connected; int IndexNumber; }; typedef struct _MYSOCKET_INFORMATION{ char Buffer[BUFFERSIZE]; WSABUF DataBuf; SOCKET Socket; DWORD SendBytes; DWORD RecvBytes; }SOCKET_INFORMATION, *LPSOCKET_INFORMATION; // creates number of objects of this structure LPSOCKET_INFORMATION SocketList[NUMBER_CLIENTS]; FD_SET Writer; FD_SET Reader; DWORD TotalSockets = 0; DWORD Flags; u_long NonBlock = 1; timeval tv; long tv_sec = 1; long tv_usec = 0; //intiate objects Caster caster; DataStream datastream[NUMBER_BASES]; //100 base stations max Client client[NUMBER_CLIENTS]; SOCKET listenSocket; SOCKET clientSocket[NUMBER_CLIENTS]; SOCKET serverSocket; char recvArray[BUFFERSIZE]; using namespace std; int main() { //initialize the Read and Write socket sets FD_ZERO(&Reader); FD_ZERO(&Writer); //check for connection attempt FD_SET(listenSocket, &Reader); FD_SET(serverSocket, &Reader); //set read and write state based on state of buffer for( unsigned int i=0; i<TotalSockets; i++){ if( SocketList[i]->RecvBytes < SocketList[i]->SendBytes){ FD_SET(SocketList[i]->Socket,&Writer); } else{ FD_SET(SocketList[i]->Socket,&Reader); } } //Select returns number of sockets ready to be read/writen Total = select(0, &Reader, &Writer, NULL, &tv); if(Total == SOCKET_ERROR){ printf("Error select function %d\n", WSAGetLastError()); return 1; } if( FD_ISSET(listenSocket, &Reader)){ Total--; //set current client no while(client[current].connected == true){ current++; if(current >= NUMBER_CLIENTS){ current = 0; count++; if(count >= 2){//has cylcled twice all must be set to true, can add no more. count =0; printf("client limit reached.\n"); break; } } } clientSocket[current] = accept(listenSocket, NULL, NULL); //setup client connection for further use if( clientSocket[current] != INVALID_SOCKET){ //set new client to non blocking check = ioctlsocket(clientSocket[current], FIONBIO, &NonBlock); if( check == SOCKET_ERROR){ printf("Error setting client to nonblocking mode. %d.\n", WSAGetLastError()); closesocket(clientSocket[current]); continue; } else{ printf("Accepted client connection request \n"); //recieve data check = recv(clientSocket[current], recvArray, BUFFERSIZE, 0); if( check == SOCKET_ERROR){ //close connection if error printf("error recieving login data. %d \n", WSAGetLastError()); closesocket(clientSocket[current]); continue; } if( check == 0){//no data is recieved then client disconnected printf("ERROR no data, client dsiconnected.\n"); closesocket(clientSocket[current]); continue; } else{ for(int n=0; n<check +1 ; n++){ //must be request message for data per NTRIP 1.0 clientRequest << recvArray[n]; //place read char bytes into stringstream object for parsing. } //if request is good returns a client requested source, username, and true false for data send. checkClientRequest(clientSocket[current], client[current].source, client[current].connected, client[current].user); } } } }//end of check client listen socket for(unsigned int i=0; Total>0 && i<TotalSockets; i++){ LPSOCKET_INFORMATION SocketInfo = SocketList[i]; //check if client sends GGA string if(FD_ISSET(SocketInfo->Socket, &Reader)){ Total--; SocketInfo->DataBuf.buf = SocketInfo->Buffer; SocketInfo->DataBuf.len = BUFFERSIZE; Flags = 0; SocketInfo->RecvBytes = sizeof(SocketInfo->DataBuf); check = WSARecv(SocketInfo->Socket, &(SocketInfo->DataBuf), 1, &(SocketInfo->RecvBytes), &Flags, NULL, NULL); if( check == SOCKET_ERROR){ FreeSocketInformation(i); //shuts down client socket if socket error continue; } else{ memcpy(recvArray, SocketInfo->DataBuf.buf, SocketInfo->RecvBytes +1); //print data on screen change to sort lines printf("%s \n", SocketInfo->DataBuf.buf); } } 类客户端{ 公众: std::字符串源; std::string user;//作为名称:密码存储在txt文件中 布尔连通; 整数指数; }; typedef结构_MYSOCKET_信息{ 字符缓冲区[BUFFERSIZE]; WSABUF数据库; 插座; DWORD发送字节; 德沃德·雷克比; }SOCKET_信息,*LPSOCKET_信息; //创建此结构的对象数 LPSOCKET_信息SocketList[客户端数量]; FD_集编写器; FD_集读卡器; DWORD TotalSockets=0; 德沃德旗; u_long NonBlock=1; 蒂梅瓦尔电视; 长电视秒=1; 长tv_usec=0; //初始化对象 脚轮; 数据流数据流[基数]//最多100个基站 客户[客户数量]; SOCKET-listenSocket; SOCKET clientSocket[NUMBER_CLIENTS]; 套接字服务器套接字; char recvArray[BUFFERSIZE]; 使用名称空间std; int main() { //初始化读写套接字集 FD_ZERO(和读卡器); FD_ZERO(&Writer); //检查是否有连接尝试 FD_集(listenSocket和读卡器); FD_集(服务器插座和读卡器); //根据缓冲区的状态设置读写状态 for(unsigned int i=0;iRecvBytesSendBytes){ FD_集(SocketList[i]->Socket和Writer); } 否则{ FD_集(插座列表[i]->插座和读卡器); } } //选择返回准备读/写的套接字数 总计=选择(0、读卡器和写卡器、空值和电视); 如果(总数==套接字错误){ printf(“错误选择函数%d\n”,WSAGetLastError()); 返回1; } if(FD_ISSET(listenSocket和读卡器)){ 总数--; //设置当前客户端号 while(客户端[当前].connected==true){ 电流++; 如果(当前>=客户端数量){ 电流=0; 计数++; 如果(count>=2){//有两次Cycled,则必须将all设置为true,不能再添加。 计数=0; printf(“已达到客户端限制。\n”); 打破 } } } clientSocket[current]=accept(listenSocket,NULL,NULL);//设置客户端连接以供进一步使用 if(clientSocket[当前]!=无效的\u套接字){ //将新客户端设置为非阻塞 check=ioctlsocket(clientSocket[current]、FIONBIO和NonBlock); 如果(检查==套接字错误){ printf(“将客户端设置为非阻塞模式时出错。%d.\n”,WSAGetLastError()); closesocket(clientSocket[当前]); 继续; } 否则{ printf(“已接受的客户端连接请求”); //接收数据 check=recv(clientSocket[current],recvArray,BUFFERSIZE,0); if(check==SOCKET\u ERROR){//如果发生错误,请关闭连接 printf(“接收登录数据时出错。%d\n”,WSAGetLastError()); closesocket(clientSocket[当前]); 继续; } 如果(check==0){//未收到任何数据,则客户端断开连接 printf(“错误无数据,客户端dsiconnected。\n”); closesocket(clientSocket[当前]); 继续; } 否则{ 对于(int n=0;nDataBuf.buf=SocketInfo->Buffer; SocketInfo->DataBuf.len=缓冲区大小; Flags=0; SocketInfo->RecvBytes=sizeof(SocketInfo->DataBuf); 检查=WSARecv(SocketInfo->Socket,&(SocketInfo->DataBuf),1,&(SocketInfo->RecvBytes),&Flags,NULL,NULL); 如果(检查==套接字错误){ FreeSocketInformation(i);//如果套接字错误,则关闭客户端套接字 继续; } 否则{ memcpy(recvArray,SocketInfo->DataBuf.buf,SocketInfo->RecvBytes+1); //在屏幕上打印数据更改为排序行 printf(“%s\n”,SocketInfo->DataBuf.buf); } }_C++_Sockets_Select_Winsock2 - Fatal编程技术网 Socket和Writer); } 否则{ FD_集(插座列表[i]->插座和读卡器); } } //选择返回准备读/写的套接字数 总计=选择(0、读卡器和写卡器、空值和电视); 如果(总数==套接字错误){ printf(“错误选择函数%d\n”,WSAGetLastError()); 返回1; } if(FD_ISSET(listenSocket和读卡器)){ 总数--; //设置当前客户端号 while(客户端[当前].connected==true){ 电流++; 如果(当前>=客户端数量){ 电流=0; 计数++; 如果(count>=2){//有两次Cycled,则必须将all设置为true,不能再添加。 计数=0; printf(“已达到客户端限制。\n”); 打破 } } } clientSocket[current]=accept(listenSocket,NULL,NULL);//设置客户端连接以供进一步使用 if(clientSocket[当前]!=无效的\u套接字){ //将新客户端设置为非阻塞 check=ioctlsocket(clientSocket[current]、FIONBIO和NonBlock); 如果(检查==套接字错误){ printf(“将客户端设置为非阻塞模式时出错。%d.\n”,WSAGetLastError()); closesocket(clientSocket[当前]); 继续; } 否则{ printf(“已接受的客户端连接请求”); //接收数据 check=recv(clientSocket[current],recvArray,BUFFERSIZE,0); if(check==SOCKET\u ERROR){//如果发生错误,请关闭连接 printf(“接收登录数据时出错。%d\n”,WSAGetLastError()); closesocket(clientSocket[当前]); 继续; } 如果(check==0){//未收到任何数据,则客户端断开连接 printf(“错误无数据,客户端dsiconnected。\n”); closesocket(clientSocket[当前]); 继续; } 否则{ 对于(int n=0;nDataBuf.buf=SocketInfo->Buffer; SocketInfo->DataBuf.len=缓冲区大小; Flags=0; SocketInfo->RecvBytes=sizeof(SocketInfo->DataBuf); 检查=WSARecv(SocketInfo->Socket,&(SocketInfo->DataBuf),1,&(SocketInfo->RecvBytes),&Flags,NULL,NULL); 如果(检查==套接字错误){ FreeSocketInformation(i);//如果套接字错误,则关闭客户端套接字 继续; } 否则{ memcpy(recvArray,SocketInfo->DataBuf.buf,SocketInfo->RecvBytes+1); //在屏幕上打印数据更改为排序行 printf(“%s\n”,SocketInfo->DataBuf.buf); } },c++,sockets,select,winsock2,C++,Sockets,Select,Winsock2" /> Socket和Writer); } 否则{ FD_集(插座列表[i]->插座和读卡器); } } //选择返回准备读/写的套接字数 总计=选择(0、读卡器和写卡器、空值和电视); 如果(总数==套接字错误){ printf(“错误选择函数%d\n”,WSAGetLastError()); 返回1; } if(FD_ISSET(listenSocket和读卡器)){ 总数--; //设置当前客户端号 while(客户端[当前].connected==true){ 电流++; 如果(当前>=客户端数量){ 电流=0; 计数++; 如果(count>=2){//有两次Cycled,则必须将all设置为true,不能再添加。 计数=0; printf(“已达到客户端限制。\n”); 打破 } } } clientSocket[current]=accept(listenSocket,NULL,NULL);//设置客户端连接以供进一步使用 if(clientSocket[当前]!=无效的\u套接字){ //将新客户端设置为非阻塞 check=ioctlsocket(clientSocket[current]、FIONBIO和NonBlock); 如果(检查==套接字错误){ printf(“将客户端设置为非阻塞模式时出错。%d.\n”,WSAGetLastError()); closesocket(clientSocket[当前]); 继续; } 否则{ printf(“已接受的客户端连接请求”); //接收数据 check=recv(clientSocket[current],recvArray,BUFFERSIZE,0); if(check==SOCKET\u ERROR){//如果发生错误,请关闭连接 printf(“接收登录数据时出错。%d\n”,WSAGetLastError()); closesocket(clientSocket[当前]); 继续; } 如果(check==0){//未收到任何数据,则客户端断开连接 printf(“错误无数据,客户端dsiconnected。\n”); closesocket(clientSocket[当前]); 继续; } 否则{ 对于(int n=0;nDataBuf.buf=SocketInfo->Buffer; SocketInfo->DataBuf.len=缓冲区大小; Flags=0; SocketInfo->RecvBytes=sizeof(SocketInfo->DataBuf); 检查=WSARecv(SocketInfo->Socket,&(SocketInfo->DataBuf),1,&(SocketInfo->RecvBytes),&Flags,NULL,NULL); 如果(检查==套接字错误){ FreeSocketInformation(i);//如果套接字错误,则关闭客户端套接字 继续; } 否则{ memcpy(recvArray,SocketInfo->DataBuf.buf,SocketInfo->RecvBytes+1); //在屏幕上打印数据更改为排序行 printf(“%s\n”,SocketInfo->DataBuf.buf); } },c++,sockets,select,winsock2,C++,Sockets,Select,Winsock2" />

使用Select()cpp跟踪客户机数据需求 首先,我对C++仍然很陌生。我正试图写一个全球导航卫星系统互联网广播节目。基本上,当客户机登录并被接受时,我的程序将客户机请求的数据流源存储在客户机类中。我打算使用两个数组的索引号来匹配一个客户机对象数组和一个clientSockets数组,但是试图使用Select()检查非阻塞套接字会使这变得复杂。我已经找到了一些实现Select()的示例,但我不确定如何从用于接受listenSocket连接的数组中跟踪原始clientSocket class Client{ public: std::string source; std::string user; //stored in txt file as name:password boolean connected; int IndexNumber; }; typedef struct _MYSOCKET_INFORMATION{ char Buffer[BUFFERSIZE]; WSABUF DataBuf; SOCKET Socket; DWORD SendBytes; DWORD RecvBytes; }SOCKET_INFORMATION, *LPSOCKET_INFORMATION; // creates number of objects of this structure LPSOCKET_INFORMATION SocketList[NUMBER_CLIENTS]; FD_SET Writer; FD_SET Reader; DWORD TotalSockets = 0; DWORD Flags; u_long NonBlock = 1; timeval tv; long tv_sec = 1; long tv_usec = 0; //intiate objects Caster caster; DataStream datastream[NUMBER_BASES]; //100 base stations max Client client[NUMBER_CLIENTS]; SOCKET listenSocket; SOCKET clientSocket[NUMBER_CLIENTS]; SOCKET serverSocket; char recvArray[BUFFERSIZE]; using namespace std; int main() { //initialize the Read and Write socket sets FD_ZERO(&Reader); FD_ZERO(&Writer); //check for connection attempt FD_SET(listenSocket, &Reader); FD_SET(serverSocket, &Reader); //set read and write state based on state of buffer for( unsigned int i=0; i<TotalSockets; i++){ if( SocketList[i]->RecvBytes < SocketList[i]->SendBytes){ FD_SET(SocketList[i]->Socket,&Writer); } else{ FD_SET(SocketList[i]->Socket,&Reader); } } //Select returns number of sockets ready to be read/writen Total = select(0, &Reader, &Writer, NULL, &tv); if(Total == SOCKET_ERROR){ printf("Error select function %d\n", WSAGetLastError()); return 1; } if( FD_ISSET(listenSocket, &Reader)){ Total--; //set current client no while(client[current].connected == true){ current++; if(current >= NUMBER_CLIENTS){ current = 0; count++; if(count >= 2){//has cylcled twice all must be set to true, can add no more. count =0; printf("client limit reached.\n"); break; } } } clientSocket[current] = accept(listenSocket, NULL, NULL); //setup client connection for further use if( clientSocket[current] != INVALID_SOCKET){ //set new client to non blocking check = ioctlsocket(clientSocket[current], FIONBIO, &NonBlock); if( check == SOCKET_ERROR){ printf("Error setting client to nonblocking mode. %d.\n", WSAGetLastError()); closesocket(clientSocket[current]); continue; } else{ printf("Accepted client connection request \n"); //recieve data check = recv(clientSocket[current], recvArray, BUFFERSIZE, 0); if( check == SOCKET_ERROR){ //close connection if error printf("error recieving login data. %d \n", WSAGetLastError()); closesocket(clientSocket[current]); continue; } if( check == 0){//no data is recieved then client disconnected printf("ERROR no data, client dsiconnected.\n"); closesocket(clientSocket[current]); continue; } else{ for(int n=0; n<check +1 ; n++){ //must be request message for data per NTRIP 1.0 clientRequest << recvArray[n]; //place read char bytes into stringstream object for parsing. } //if request is good returns a client requested source, username, and true false for data send. checkClientRequest(clientSocket[current], client[current].source, client[current].connected, client[current].user); } } } }//end of check client listen socket for(unsigned int i=0; Total>0 && i<TotalSockets; i++){ LPSOCKET_INFORMATION SocketInfo = SocketList[i]; //check if client sends GGA string if(FD_ISSET(SocketInfo->Socket, &Reader)){ Total--; SocketInfo->DataBuf.buf = SocketInfo->Buffer; SocketInfo->DataBuf.len = BUFFERSIZE; Flags = 0; SocketInfo->RecvBytes = sizeof(SocketInfo->DataBuf); check = WSARecv(SocketInfo->Socket, &(SocketInfo->DataBuf), 1, &(SocketInfo->RecvBytes), &Flags, NULL, NULL); if( check == SOCKET_ERROR){ FreeSocketInformation(i); //shuts down client socket if socket error continue; } else{ memcpy(recvArray, SocketInfo->DataBuf.buf, SocketInfo->RecvBytes +1); //print data on screen change to sort lines printf("%s \n", SocketInfo->DataBuf.buf); } } 类客户端{ 公众: std::字符串源; std::string user;//作为名称:密码存储在txt文件中 布尔连通; 整数指数; }; typedef结构_MYSOCKET_信息{ 字符缓冲区[BUFFERSIZE]; WSABUF数据库; 插座; DWORD发送字节; 德沃德·雷克比; }SOCKET_信息,*LPSOCKET_信息; //创建此结构的对象数 LPSOCKET_信息SocketList[客户端数量]; FD_集编写器; FD_集读卡器; DWORD TotalSockets=0; 德沃德旗; u_long NonBlock=1; 蒂梅瓦尔电视; 长电视秒=1; 长tv_usec=0; //初始化对象 脚轮; 数据流数据流[基数]//最多100个基站 客户[客户数量]; SOCKET-listenSocket; SOCKET clientSocket[NUMBER_CLIENTS]; 套接字服务器套接字; char recvArray[BUFFERSIZE]; 使用名称空间std; int main() { //初始化读写套接字集 FD_ZERO(和读卡器); FD_ZERO(&Writer); //检查是否有连接尝试 FD_集(listenSocket和读卡器); FD_集(服务器插座和读卡器); //根据缓冲区的状态设置读写状态 for(unsigned int i=0;iRecvBytesSendBytes){ FD_集(SocketList[i]->Socket和Writer); } 否则{ FD_集(插座列表[i]->插座和读卡器); } } //选择返回准备读/写的套接字数 总计=选择(0、读卡器和写卡器、空值和电视); 如果(总数==套接字错误){ printf(“错误选择函数%d\n”,WSAGetLastError()); 返回1; } if(FD_ISSET(listenSocket和读卡器)){ 总数--; //设置当前客户端号 while(客户端[当前].connected==true){ 电流++; 如果(当前>=客户端数量){ 电流=0; 计数++; 如果(count>=2){//有两次Cycled,则必须将all设置为true,不能再添加。 计数=0; printf(“已达到客户端限制。\n”); 打破 } } } clientSocket[current]=accept(listenSocket,NULL,NULL);//设置客户端连接以供进一步使用 if(clientSocket[当前]!=无效的\u套接字){ //将新客户端设置为非阻塞 check=ioctlsocket(clientSocket[current]、FIONBIO和NonBlock); 如果(检查==套接字错误){ printf(“将客户端设置为非阻塞模式时出错。%d.\n”,WSAGetLastError()); closesocket(clientSocket[当前]); 继续; } 否则{ printf(“已接受的客户端连接请求”); //接收数据 check=recv(clientSocket[current],recvArray,BUFFERSIZE,0); if(check==SOCKET\u ERROR){//如果发生错误,请关闭连接 printf(“接收登录数据时出错。%d\n”,WSAGetLastError()); closesocket(clientSocket[当前]); 继续; } 如果(check==0){//未收到任何数据,则客户端断开连接 printf(“错误无数据,客户端dsiconnected。\n”); closesocket(clientSocket[当前]); 继续; } 否则{ 对于(int n=0;nDataBuf.buf=SocketInfo->Buffer; SocketInfo->DataBuf.len=缓冲区大小; Flags=0; SocketInfo->RecvBytes=sizeof(SocketInfo->DataBuf); 检查=WSARecv(SocketInfo->Socket,&(SocketInfo->DataBuf),1,&(SocketInfo->RecvBytes),&Flags,NULL,NULL); 如果(检查==套接字错误){ FreeSocketInformation(i);//如果套接字错误,则关闭客户端套接字 继续; } 否则{ memcpy(recvArray,SocketInfo->DataBuf.buf,SocketInfo->RecvBytes+1); //在屏幕上打印数据更改为排序行 printf(“%s\n”,SocketInfo->DataBuf.buf); } }

使用Select()cpp跟踪客户机数据需求 首先,我对C++仍然很陌生。我正试图写一个全球导航卫星系统互联网广播节目。基本上,当客户机登录并被接受时,我的程序将客户机请求的数据流源存储在客户机类中。我打算使用两个数组的索引号来匹配一个客户机对象数组和一个clientSockets数组,但是试图使用Select()检查非阻塞套接字会使这变得复杂。我已经找到了一些实现Select()的示例,但我不确定如何从用于接受listenSocket连接的数组中跟踪原始clientSocket class Client{ public: std::string source; std::string user; //stored in txt file as name:password boolean connected; int IndexNumber; }; typedef struct _MYSOCKET_INFORMATION{ char Buffer[BUFFERSIZE]; WSABUF DataBuf; SOCKET Socket; DWORD SendBytes; DWORD RecvBytes; }SOCKET_INFORMATION, *LPSOCKET_INFORMATION; // creates number of objects of this structure LPSOCKET_INFORMATION SocketList[NUMBER_CLIENTS]; FD_SET Writer; FD_SET Reader; DWORD TotalSockets = 0; DWORD Flags; u_long NonBlock = 1; timeval tv; long tv_sec = 1; long tv_usec = 0; //intiate objects Caster caster; DataStream datastream[NUMBER_BASES]; //100 base stations max Client client[NUMBER_CLIENTS]; SOCKET listenSocket; SOCKET clientSocket[NUMBER_CLIENTS]; SOCKET serverSocket; char recvArray[BUFFERSIZE]; using namespace std; int main() { //initialize the Read and Write socket sets FD_ZERO(&Reader); FD_ZERO(&Writer); //check for connection attempt FD_SET(listenSocket, &Reader); FD_SET(serverSocket, &Reader); //set read and write state based on state of buffer for( unsigned int i=0; i<TotalSockets; i++){ if( SocketList[i]->RecvBytes < SocketList[i]->SendBytes){ FD_SET(SocketList[i]->Socket,&Writer); } else{ FD_SET(SocketList[i]->Socket,&Reader); } } //Select returns number of sockets ready to be read/writen Total = select(0, &Reader, &Writer, NULL, &tv); if(Total == SOCKET_ERROR){ printf("Error select function %d\n", WSAGetLastError()); return 1; } if( FD_ISSET(listenSocket, &Reader)){ Total--; //set current client no while(client[current].connected == true){ current++; if(current >= NUMBER_CLIENTS){ current = 0; count++; if(count >= 2){//has cylcled twice all must be set to true, can add no more. count =0; printf("client limit reached.\n"); break; } } } clientSocket[current] = accept(listenSocket, NULL, NULL); //setup client connection for further use if( clientSocket[current] != INVALID_SOCKET){ //set new client to non blocking check = ioctlsocket(clientSocket[current], FIONBIO, &NonBlock); if( check == SOCKET_ERROR){ printf("Error setting client to nonblocking mode. %d.\n", WSAGetLastError()); closesocket(clientSocket[current]); continue; } else{ printf("Accepted client connection request \n"); //recieve data check = recv(clientSocket[current], recvArray, BUFFERSIZE, 0); if( check == SOCKET_ERROR){ //close connection if error printf("error recieving login data. %d \n", WSAGetLastError()); closesocket(clientSocket[current]); continue; } if( check == 0){//no data is recieved then client disconnected printf("ERROR no data, client dsiconnected.\n"); closesocket(clientSocket[current]); continue; } else{ for(int n=0; n<check +1 ; n++){ //must be request message for data per NTRIP 1.0 clientRequest << recvArray[n]; //place read char bytes into stringstream object for parsing. } //if request is good returns a client requested source, username, and true false for data send. checkClientRequest(clientSocket[current], client[current].source, client[current].connected, client[current].user); } } } }//end of check client listen socket for(unsigned int i=0; Total>0 && i<TotalSockets; i++){ LPSOCKET_INFORMATION SocketInfo = SocketList[i]; //check if client sends GGA string if(FD_ISSET(SocketInfo->Socket, &Reader)){ Total--; SocketInfo->DataBuf.buf = SocketInfo->Buffer; SocketInfo->DataBuf.len = BUFFERSIZE; Flags = 0; SocketInfo->RecvBytes = sizeof(SocketInfo->DataBuf); check = WSARecv(SocketInfo->Socket, &(SocketInfo->DataBuf), 1, &(SocketInfo->RecvBytes), &Flags, NULL, NULL); if( check == SOCKET_ERROR){ FreeSocketInformation(i); //shuts down client socket if socket error continue; } else{ memcpy(recvArray, SocketInfo->DataBuf.buf, SocketInfo->RecvBytes +1); //print data on screen change to sort lines printf("%s \n", SocketInfo->DataBuf.buf); } } 类客户端{ 公众: std::字符串源; std::string user;//作为名称:密码存储在txt文件中 布尔连通; 整数指数; }; typedef结构_MYSOCKET_信息{ 字符缓冲区[BUFFERSIZE]; WSABUF数据库; 插座; DWORD发送字节; 德沃德·雷克比; }SOCKET_信息,*LPSOCKET_信息; //创建此结构的对象数 LPSOCKET_信息SocketList[客户端数量]; FD_集编写器; FD_集读卡器; DWORD TotalSockets=0; 德沃德旗; u_long NonBlock=1; 蒂梅瓦尔电视; 长电视秒=1; 长tv_usec=0; //初始化对象 脚轮; 数据流数据流[基数]//最多100个基站 客户[客户数量]; SOCKET-listenSocket; SOCKET clientSocket[NUMBER_CLIENTS]; 套接字服务器套接字; char recvArray[BUFFERSIZE]; 使用名称空间std; int main() { //初始化读写套接字集 FD_ZERO(和读卡器); FD_ZERO(&Writer); //检查是否有连接尝试 FD_集(listenSocket和读卡器); FD_集(服务器插座和读卡器); //根据缓冲区的状态设置读写状态 for(unsigned int i=0;iRecvBytesSendBytes){ FD_集(SocketList[i]->Socket和Writer); } 否则{ FD_集(插座列表[i]->插座和读卡器); } } //选择返回准备读/写的套接字数 总计=选择(0、读卡器和写卡器、空值和电视); 如果(总数==套接字错误){ printf(“错误选择函数%d\n”,WSAGetLastError()); 返回1; } if(FD_ISSET(listenSocket和读卡器)){ 总数--; //设置当前客户端号 while(客户端[当前].connected==true){ 电流++; 如果(当前>=客户端数量){ 电流=0; 计数++; 如果(count>=2){//有两次Cycled,则必须将all设置为true,不能再添加。 计数=0; printf(“已达到客户端限制。\n”); 打破 } } } clientSocket[current]=accept(listenSocket,NULL,NULL);//设置客户端连接以供进一步使用 if(clientSocket[当前]!=无效的\u套接字){ //将新客户端设置为非阻塞 check=ioctlsocket(clientSocket[current]、FIONBIO和NonBlock); 如果(检查==套接字错误){ printf(“将客户端设置为非阻塞模式时出错。%d.\n”,WSAGetLastError()); closesocket(clientSocket[当前]); 继续; } 否则{ printf(“已接受的客户端连接请求”); //接收数据 check=recv(clientSocket[current],recvArray,BUFFERSIZE,0); if(check==SOCKET\u ERROR){//如果发生错误,请关闭连接 printf(“接收登录数据时出错。%d\n”,WSAGetLastError()); closesocket(clientSocket[当前]); 继续; } 如果(check==0){//未收到任何数据,则客户端断开连接 printf(“错误无数据,客户端dsiconnected。\n”); closesocket(clientSocket[当前]); 继续; } 否则{ 对于(int n=0;nDataBuf.buf=SocketInfo->Buffer; SocketInfo->DataBuf.len=缓冲区大小; Flags=0; SocketInfo->RecvBytes=sizeof(SocketInfo->DataBuf); 检查=WSARecv(SocketInfo->Socket,&(SocketInfo->DataBuf),1,&(SocketInfo->RecvBytes),&Flags,NULL,NULL); 如果(检查==套接字错误){ FreeSocketInformation(i);//如果套接字错误,则关闭客户端套接字 继续; } 否则{ memcpy(recvArray,SocketInfo->DataBuf.buf,SocketInfo->RecvBytes+1); //在屏幕上打印数据更改为排序行 printf(“%s\n”,SocketInfo->DataBuf.buf); } },c++,sockets,select,winsock2,C++,Sockets,Select,Winsock2,这不仅仅是一个问题,但是如何使用clientSocket[]跟踪SocketInfo结构呢's?为什么不在SOCKET\u信息结构中放置一个指向Client结构的指针?请不要在Windows上使用select。它只是为了与Berkeley SOCKET兼容而提供的,而不是Windows方式。使用线程、Windows消息、IOCP、完成事件、完成例程,@DavidSchwartz:just bec因为它不是“Windows方式”,并不意味着select()根本不能或不应该使用。如果使用得当,它就可

这不仅仅是一个问题,但是如何使用clientSocket[]跟踪SocketInfo结构呢's?

为什么不在
SOCKET\u信息
结构中放置一个指向
Client
结构的指针?请不要在Windows上使用select。它只是为了与Berkeley SOCKET兼容而提供的,而不是Windows方式。使用线程、Windows消息、IOCP、完成事件、完成例程,@DavidSchwartz:just bec因为它不是“Windows方式”,并不意味着
select()
根本不能或不应该使用。如果使用得当,它就可以正常工作,而且在很多情况下,编写“Windows方式”代码更容易使用,这通常需要将代码分成更难管理的部分。好的,我只是在SOCKET_信息结构中添加了一个IndexNo值,并在填写SOCKET信息时将当前客户端数组[number]传递给SOCKET结构。希望它能起作用。