服务器发送消息给客服端的有关问题
服务器发送消息给客服端的问题
问题描述:服务器一个,客服端两个,现在服务器给客服端发消息,却只有一个客服端收到,然后再发又只有一个收到,不过这个时候是另一个客服端收到,依次轮流收到服务器的信息,感觉有些奇怪,有些问题是想不明白
问题描述:服务器一个,客服端两个,现在服务器给客服端发消息,却只有一个客服端收到,然后再发又只有一个收到,不过这个时候是另一个客服端收到,依次轮流收到服务器的信息,感觉有些奇怪,有些问题是想不明白
- C/C++ code
//服务器端代码: #include "stdafx.h" #include <windows.h> #include <process.h> #include <iostream> #include <string> using namespace std; #pragma comment(lib,"ws2_32.lib") /*recive message thread*/ DWORD WINAPI ClientThread(LPVOID lp) { SOCKET sock = (SOCKET)lp;//---------- char szbuff[1024]; int ret; while(1) { //perform a blocking recv() call ret = recv(sock,szbuff,1024,0); if(ret == 0) break; else if(ret == SOCKET_ERROR) { cout << "recv() failed " << WSAGetLastError() << endl; break; } szbuff[ret] = '\0'; cout << "RECV:" << szbuff << " " << ret << "bytes" << endl; } return 0; } /*send message thread*/ DWORD WINAPI SendThread(LPVOID lp) { SOCKET sock = (SOCKET)lp; char buff[1024]; string msg; int ret; while(1) { cin >> msg; char buff[1024]; strcpy(buff,msg.c_str()); ret = send(sock,buff,msg.length() + 1,0); if(ret == 0) break; else if(ret == SOCKET_ERROR) { cout << "send failed " << WSAGetLastError() << endl; break; } } return 0; } int _tmain(int argc, _TCHAR* argv[]) { //cout << *(int*)lp << endl; //Initialize Winsock WSADATA wsd; if(WSAStartup(MAKEWORD(2,2),&wsd) != 0) { cout << "Failled to load Winsock!" << endl; return 1; } //create our listening socket SOCKET sListen,sClient; sListen = socket(AF_INET,SOCK_STREAM,IPPROTO_IP); if(sListen == SOCKET_ERROR) { cout << "socket() failed " << WSAGetLastError() << endl; return 1; } //Select local interface and bind to it struct sockaddr_in local,client; int iport = 5000; local.sin_addr.s_addr = htonl(INADDR_ANY); local.sin_port = htons(iport); local.sin_family = AF_INET; if(bind(sListen,(SOCKADDR*)&local,sizeof(local)) == SOCKET_ERROR) { cout << "bind() failed " << WSAGetLastError() << endl; return 1; } listen(sListen,8); cout << "server side is in listening status!" << endl; //Waitfor incoming clients,Once one is detected,create thread and pass //the handle off to it int iAddrSize(0); HANDLE hThread; DWORD dwThreadId,dwSendThreadId; while(1) { iAddrSize = sizeof(client); sClient = accept(sListen,(SOCKADDR*)&client,&iAddrSize); if(sClient == INVALID_SOCKET) { cout << "accept() failed " << WSAGetLastError() << endl; break; } cout << "Accept client:" << inet_ntoa(client.sin_addr) << endl; cout << ntohs(client.sin_port) << endl; hThread = CreateThread(NULL,0,ClientThread, (LPVOID)sClient,0,&dwThreadId); HANDLE hSendThread = CreateThread(NULL,0,SendThread, (LPVOID)sClient,0,&dwSendThreadId); if(hThread == NULL) { cout << "CreateThread() failed " << GetLastError() << endl; break; } CloseHandle(hThread); CloseHandle(hSendThread); } closesocket(sListen); WSACleanup(); return 0; }
- C/C++ code
//客服端代码: #include "stdafx.h" #include <windows.h> #include <process.h> #include <iostream> #include <string> #include <stdio.h> #include <stdlib.h> using namespace std; #pragma comment(lib,"ws2_32.lib") /*recive message thread*/ DWORD WINAPI ClientThread(LPVOID lp) { SOCKET sock = (SOCKET)lp; char szbuff[1024]; int ret; while(1) { ret = recv(sock,szbuff,1024,0); if(ret == 0) break; else if(ret == SOCKET_ERROR) { cout << "recv() failed " << WSAGetLastError() << endl; break; } szbuff[ret] = '\0'; cout << "recv " << szbuff << " " << ret << "bytes" << endl; } return 0; } /*send message thread*/ DWORD WINAPI SendThread(LPVOID lp) { SOCKET sock = (SOCKET)lp; string msg; char buff[1024]; int ret; while(1) { cin >> msg; strcpy(buff,msg.c_str()); ret = send(sock,buff,msg.length() + 1,0); if(ret == 0) break; else if(ret == SOCKET_ERROR) { cout << "send failed " << WSAGetLastError() << endl; break; } } return 0; } int _tmain(int argc, _TCHAR* argv[]) { WSADATA wsd; SOCKET sClient; struct sockaddr_in server; struct hostent *host = NULL; //load Winsock if(WSAStartup(MAKEWORD(2,2),&wsd) != 0) { cout << "Failled to load Winsock!" << endl; return 1; } //create socket and attempt to connect to the server sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_IP); if(sClient == INVALID_SOCKET) { cout << "socket failed " << WSAGetLastError() << endl; return 1; } string szServer; u_long iport; cout << "please input IP address: " << endl; cin >> szServer; cout << "please input port number: " << endl; cin >> iport; server.sin_addr.s_addr = inet_addr(INADDR_ANY); server.sin_family = AF_INET; server.sin_port = htons(iport); //if the supplied server address isn't in the form //"aaa.bbb.ccc.ddd" it's a host name,so try to resolve it if(server.sin_addr.s_addr == INADDR_NONE) { host = gethostbyname(szServer.c_str()); if(host == NULL) { cout << "unable to resolve server: " << szServer << endl; return 1; } CopyMemory(&server.sin_addr,host->h_addr_list[0],host->h_length); } if(connect(sClient,(SOCKADDR*)&server,sizeof(server))==SOCKET_ERROR) { cout << "connect failed " << WSAGetLastError() << endl; return 1; } cout << "connect succeed!" << endl; DWORD dwThreadId,dwSendThreadId; HANDLE hThread = CreateThread(NULL,0,ClientThread, (LPVOID)sClient,0,&dwThreadId); HANDLE hSendThread = CreateThread(NULL,0,SendThread, (LPVOID)sClient,0,&dwSendThreadId); if(hThread == NULL) { cout << "CreateThread() failed " << GetLastError() << endl; } if(hSendThread == NULL) { cout << "CreateThread() failed " << GetLastError() << endl; } CloseHandle(hThread); CloseHandle(hSendThread); //prevent main thread exit; while(1) { } closesocket(sClient); WSACleanup(); return 0; }