Windows Socket 编程 : 支持多线程(TCP)(环境:VS2010)_第1页
Windows Socket 编程 : 支持多线程(TCP)(环境:VS2010)_第2页
Windows Socket 编程 : 支持多线程(TCP)(环境:VS2010)_第3页
Windows Socket 编程 : 支持多线程(TCP)(环境:VS2010)_第4页
Windows Socket 编程 : 支持多线程(TCP)(环境:VS2010)_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Windows 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 const short LoginSuc = 1004;1

2、0 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 fromUserName32;29 char toUserName32

3、;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 = 0; i tempWho; 34 35 if( isLogi

4、n & 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 = 0; 45 scanf(%s, Message); 46 m

5、emcpy(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(sendBuff+2, Message, strlen(M

6、essage); 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; 64 else if(isLogin) 65 print

7、f(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(true) 83 84 memset(recvBuf, 0x

8、00, 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 98 break; 99 case MesNormal:1

9、00 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 116 char onLineUser100 = 0;117

10、 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 default :132 break;133 134 /end if1

11、35 / 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: %dn, err);151 return 1;152 1

12、53 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 Winsock 2.2 dll was found okayn)

13、;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 addrClient.sin_port = htons(6000)

14、;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 failed !userSock = clientSock

15、;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(loginInfo), 0);211 int a = send

16、(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 #include 6 #include UserMesInf

17、o.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); 30 31 while(true) 32 33 mems

18、et(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_s(userInfo-userName, userName)

19、; 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 printf(Login : %s = %d !n, us

20、erInfo-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(toName, recvBuf+2, 32); 73 couttoN

21、ameuserName, 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 char Message1000 = 0;106 memcpy(M

22、essage, 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, strlen(sendMes)+1, 0);115 if(i

23、 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;131 132 memcpy(onLineUserBuff,

24、&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(

25、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 wVersionRequested;163 WSADATA wsaData;164

26、int err;165 166 wVersionRequested = MAKEWORD(2, 2);167 168 err = WSAStartup(wVersionRequested, &wsaData);169 if (err != 0) 170 printf(WSAStartup failed with error: %dn, err);171 return 1;172 173 174 if (LOBYTE(wsaData.wVersion) != 2 | HIBYTE(wsaData.wVersion) != 2) 175 /* Tell the user that we could

27、 not find a usable */176 /* WinSock DLL. */177 printf(Could not find a usable version of Winsock.dlln);178 WSACleanup();179 return 1;180 181 else182 printf(The Winsock 2.2 dll was found okayn);183 184 185 SOCKET servSock = socket(AF_INET, SOCK_STREAM, 0);186 187 SOCKADDR_IN addrServ ;188 addrServ.sin_family = AF_INET;189 addrServ.sin_port = htons(6000);190 addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY);191 192 bind(servSock, (SOCKADDR*)&addrServ, sizeof(SOCKADDR);193 194 if(listen(servSock, 20) = SOCKET_ERROR)195 196 printf(listen

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论