1、Windows Socket 编程 支持多线程TCP环境VSWindows Socket 编程 : 支持多线程(TCP)(环境:VS2010)几点说明:(1)发送的数据不能有空格;(2)这是控制台应用程序;1、UserMesInfo.h 公共文件,客户端和服务器端公用;1 #ifndef User_Mes_Sock 2 #define User_Mes_Sock 3 #include 4 #endif 5 6 const short MesLogin = 1001; 7 const short MesError = 1002; 8 const short MesNormal = 1003; 9
2、 const short LoginSuc = 1004;10 const short MesToAll = 1005;11 const short OnLineUser = 1010;12 13 14 /User Struct15 struct UserInfo16 17 short userId;18 char userName32;19 SOCKET userSock;20 LONG userAddr;21 UserInfo *pNext;22 ;23 24 /Message Struct25 struct MesInfo26 27 short MesType;28 char fromU
3、serName32;29 char toUserName32;30 char MesContent1024;31 ; 2、TCP:客户端程序 1 #include 2 #include 3 #include 4 5 #include UserMesInfo.h 6 7 #pragma comment(lib,ws2_32.lib) 8 9 using namespace std; 10 11 BOOL isLogin = false; 12 13 14 string charToString(char temp) 15 16 string tempStr = ; 17 for(int i =
4、0; i tempWho; 34 35 if( isLogin & tempWho = 1) 36 37 /To One 38 printf(Please input NAME you want to CHAT : ); 39 char toName32 = 0; 40 scanf(%s, toName); 41 memcpy(sendBuff, &MesNormal, 2); 42 memcpy(sendBuff+2, toName, 32); 43 printf(Please input what do you want to say : ); 44 char Message1000 =
5、0; 45 scanf(%s, Message); 46 memcpy(sendBuff+34, Message, strlen(Message); 47 send(servSock, sendBuff, sizeof(sendBuff)+1, 0); 48 else if(isLogin & tempWho = 2) 49 /To ALL 50 printf(Please input DATA : ); 51 char Message1000 = 0; 52 scanf(%s, Message); 53 54 memcpy(sendBuff, &MesToAll, 2); 55 memcpy
6、(sendBuff+2, Message, strlen(Message); 56 send(servSock, sendBuff, sizeof(sendBuff)+1, 0); 57 58 else if(isLogin & tempWho = 3) 59 char getOnLineUsers4; 60 memcpy(getOnLineUsers, &OnLineUser, 2); 61 send(servSock, getOnLineUsers, sizeof(getOnLineUsers), 0); 62 else if(isLogin & tempWho = 4) 63 break
7、; 64 else if(isLogin) 65 printf(You input Error! Please Again !); 66 67 68 69 return TRUE; 70 71 72 73 DWORD WINAPI ProcThread(LPVOID lpParameter) 74 75 SOCKET cliSocket = *(SOCKET*)lpParameter; 76 77 /SOCKADDR_IN sockFrom ; 78 /int length = sizeof(SOCKADDR); 79 80 char recvBuf1024 = 0; 81 82 while(
8、true) 83 84 memset(recvBuf, 0x00, 1024); 85 int recvLen = recv(cliSocket, recvBuf, 1024, 0); 86 if(recvLen 0) 87 88 short megId = *(short*)recvBuf; 89 switch(megId) 90 91 case LoginSuc: 92 93 /char userName32 = 0; 94 /memcpy(userName, recvBuf+2, 4); 95 printf(Login Success !n); 96 isLogin = true; 97
9、 98 break; 99 case MesNormal:100 101 char Mess1000;102 memcpy(Mess, recvBuf+2, sizeof(recvBuf)-2);103 printf( = Me :%sn, Mess);104 105 106 break;107 case MesToAll:108 109 char Mess1000;110 memcpy(Mess, recvBuf+2, sizeof(recvBuf)-2);111 printf( = All :%sn, Mess);112 113 break;114 case OnLineUser:115
10、116 char onLineUser100 = 0;117 118 memcpy(onLineUser, recvBuf+2, sizeof(recvBuf)-2);119 120 /string userStr = charToString(onLineUser);121 122 for(int i =0; i sizeof(onLineUser); i+)123 coutonLineUseri;124 125 /printf(%sn, userStr);126 coutendlonLineUserendl;127 printf(n);128 129 130 break;131 defau
11、lt :132 break;133 134 /end if135 / end while136 137 return 0;138 139 140 int main()141 142 WORD wVersionRequested;143 WSADATA wsaData;144 int err;145 146 wVersionRequested = MAKEWORD(2, 2);147 148 err = WSAStartup(wVersionRequested, &wsaData);149 if (err != 0) 150 printf(WSAStartup failed with error
12、: %dn, err);151 return 1;152 153 154 if (LOBYTE(wsaData.wVersion) != 2 | HIBYTE(wsaData.wVersion) != 2) 155 /* Tell the user that we could not find a usable */156 /* WinSock DLL. */157 printf(Could not find a usable version of Winsock.dlln);158 WSACleanup();159 return 1;160 161 else162 printf(The Wi
13、nsock 2.2 dll was found okayn);163 164 165 SOCKET clientSock = socket(AF_INET, SOCK_STREAM, 0);166 167 if(clientSock = -1)168 169 perror(socket创建出错!); 170 exit(1);171 172 173 SOCKADDR_IN addrClient;174 addrClient.sin_addr.S_un.S_addr = inet_addr(127.0.0.1);175 addrClient.sin_family = AF_INET;176 add
14、rClient.sin_port = htons(6000);177 178 179 int ret = connect(clientSock, (sockaddr*)&addrClient, sizeof(SOCKADDR);180 if (ret)181 182 printf(连接失败n);183 return -1;184 185 186 HANDLE thHandle = CreateThread(NULL, 0, ProcThread, &clientSock, 0, NULL);187 188 if(NULL = thHandle)189 190 coutCreate Thread
15、 failed !userSock = clientSock;201 strcpy_s(user-userName, userName);202 user-userAddr = addrClient.sin_addr.S_un.S_addr;203 */204 205 char loginInfo64 = 0;206 memcpy(loginInfo, &MesLogin, 2);207 memcpy(loginInfo+2, userName, strlen(userName);208 209 210 /int a = send(clientSock, loginInfo, strlen(l
16、oginInfo), 0);211 int a = send(clientSock, loginInfo, strlen(loginInfo), 0);212 213 SendMes(clientSock);214 215 /Sleep(20000);216 /closesocket(clientSock);217 CloseHandle(thHandle);218 WSACleanup();219 220 221 system(PAUSE);222 return 0;223 3、TCP:服务器端程序 1 #include 2 #include 3 #include 4 #include 5
17、#include 6 #include UserMesInfo.h 7 8 #pragma comment(lib,ws2_32.lib) 9 10 using namespace std; 11 12 UserInfo *gUserInfo ; 13 14 string charToString(char temp) 15 16 string tempStr = ; 17 for(int i = 0; i userSock; 26 /SOCKADDR_IN sockFrom ; 27 28 char recvBuf1024; 29 /int length = sizeof(SOCKADDR)
18、; 30 31 while(true) 32 33 memset(recvBuf, 0x00, 1024); 34 recv(cliSocket, recvBuf, 1024, 0); 35 36 short MesType = *(short*)recvBuf; 37 38 switch(MesType) 39 40 case MesLogin: 41 42 static short USERID = 1001; 43 UserInfo* userInfo = new UserInfo; 44 char* userName = (char*)(recvBuf + 2); 45 strcpy_
19、s(userInfo-userName, userName); 46 userInfo-userId = USERID+; 47 userInfo-userSock = cliSocket; 48 userInfo-userAddr = (UserInfo*)lpParameter)-userAddr; 49 userInfo-pNext = NULL; 50 51 if(!gUserInfo) 52 53 gUserInfo = userInfo; 54 else 55 56 userInfo-pNext = gUserInfo; 57 gUserInfo = userInfo; 58 59
20、 printf(Login : %s = %d !n, userInfo-userName, userInfo-userId); 60 61 char loginInfo4 = 0; 62 memcpy(loginInfo, &LoginSuc, 2); 63 64 int i = send(cliSocket, loginInfo, strlen(loginInfo), 0); 65 66 67 break; 68 case MesNormal: 69 70 /printf(The Normal Message !); 71 char toName32 = 0; 72 memcpy(toNa
21、me, recvBuf+2, 32); 73 couttoNameuserName, strlen(toName) 89 90 SOCKET toSock = tempUser-userSock; 91 send(toSock, sendMes, strlen(sendMes)+1, 0); 92 sendFlag = true; 93 94 tempUser = tempUser-pNext; 95 96 if(!sendFlag) 97 98 printf(Send Failed !n); 99 100 101 102 break;103 case MesToAll:104 105 cha
22、r Message1000 = 0;106 memcpy(Message, recvBuf+2, sizeof(recvBuf)-2);107 UserInfo* tempUser = gUserInfo;108 char sendMes1002;109 memcpy(sendMes, &MesToAll, 2);110 memcpy(sendMes+2, Message, sizeof(Message);111 while(tempUser)112 113 SOCKET toSock = tempUser-userSock;114 int i = send(toSock, sendMes,
23、strlen(sendMes)+1, 0);115 if(i 0)116 117 printf(Send To %s Success !n, tempUser-userName);118 119 tempUser = tempUser-pNext;120 121 122 break;123 case MesError:124 /printf(The Error Message !);125 break; 126 case OnLineUser:127 128 129 char onLineUserBuff1000 = 0;130 UserInfo* tempUser = gUserInfo;1
24、31 132 memcpy(onLineUserBuff, &OnLineUser, 2);133 134 int i = 0;135 string userStr = ;136 while(tempUser)137 138 userStr += charToString(tempUser-userName);139 /处理方式有问题140 /memcpy(onLineUserBuff+2, tempUser-userName, 32);141 /send(cliSocket, onLineUserBuff, sizeof(onLineUserBuff), 0);142 tempUser = tempUser-pNext;143 144 memcpy(onLineUserBuff+2, userStr.c_str(), userStr.length();145 send(cliSocket, onLineUserBuff, sizeof(onLineUserBuff), 0);146 147 148 break;149 default:150 /printf(The Default Process !);151 break;152 153 154 155 156 157 return 0;158 159 160 int main()161 162 WORD wV
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1