Windows Socket 编程支持多线程TCP环境VS.docx
- 文档编号:6345636
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:20
- 大小:22.26KB
Windows Socket 编程支持多线程TCP环境VS.docx
《Windows Socket 编程支持多线程TCP环境VS.docx》由会员分享,可在线阅读,更多相关《Windows Socket 编程支持多线程TCP环境VS.docx(20页珍藏版)》请在冰点文库上搜索。
WindowsSocket编程支持多线程TCP环境VS
WindowsSocket编程:
支持多线程(TCP)(环境:
VS2010)
几点说明:
(1)发送的数据不能有空格;
(2)这是控制台应用程序;
1、UserMesInfo.h公共文件,客户端和服务器端公用;
1#ifndefUser_Mes_Sock
2#defineUser_Mes_Sock
3#include
4#endif
5
6constshortMesLogin=1001;
7constshortMesError=1002;
8constshortMesNormal=1003;
9constshortLoginSuc=1004;
10constshortMesToAll=1005;
11constshortOnLineUser=1010;
12
13
14//UserStruct
15structUserInfo
16{
17shortuserId;
18charuserName[32];
19SOCKETuserSock;
20LONGuserAddr;
21UserInfo*pNext;
22};
23
24//MessageStruct
25structMesInfo
26{
27shortMesType;
28charfromUserName[32];
29chartoUserName[32];
30charMesContent[1024];
31};
2、TCP:
客户端程序
1#include
2#include
3#include
4
5#include"UserMesInfo.h"
6
7#pragmacomment(lib,"ws2_32.lib")
8
9usingnamespacestd;
10
11BOOLisLogin=false;
12
13
14stringcharToString(chartemp[])
15{
16stringtempStr="";
17for(inti=0;i 18tempStr+=temp[i]; 19returntempStr; 20} 21 22BOOLSendMes(SOCKETservSocket) 23{ 24SOCKETservSock=servSocket; 25while(TRUE) 26{ 27inttempWho; 28charsendBuff[1024]={0}; 29if(isLogin) 30{ 31printf("'1': speaktoONE;\n'2': speaktoALL;\n'3': OnLineUsers;\n'4': Exit;\n"); 32 33cin>>tempWho; 34} 35if(isLogin&&tempWho==1) 36{ 37//ToOne 38printf("PleaseinputNAMEyouwanttoCHAT: "); 39chartoName[32]={0}; 40scanf("%s",toName); 41memcpy(sendBuff,&MesNormal,2); 42memcpy(sendBuff+2,toName,32); 43printf("Pleaseinputwhatdoyouwanttosay: "); 44charMessage[1000]={0}; 45scanf("%s",Message); 46memcpy(sendBuff+34,Message,strlen(Message)); 47send(servSock,sendBuff,sizeof(sendBuff)+1,0); 48}elseif(isLogin&&tempWho==2){ 49//ToALL 50printf("PleaseinputDATA: "); 51charMessage[1000]={0}; 52scanf("%s",Message); 53 54memcpy(sendBuff,&MesToAll,2); 55memcpy(sendBuff+2,Message,strlen(Message)); 56send(servSock,sendBuff,sizeof(sendBuff)+1,0); 57 58}elseif(isLogin&&tempWho==3){ 59chargetOnLineUsers[4]; 60memcpy(getOnLineUsers,&OnLineUser,2); 61send(servSock,getOnLineUsers,sizeof(getOnLineUsers),0); 62}elseif(isLogin&&tempWho==4){ 63break; 64}elseif(isLogin){ 65printf("YouinputError! PleaseAgain! "); 66} 67 68} 69returnTRUE; 70} 71 72 73DWORDWINAPIProcThread(LPVOIDlpParameter) 74{ 75SOCKETcliSocket=*(SOCKET*)lpParameter; 76 77//SOCKADDR_INsockFrom; 78//intlength=sizeof(SOCKADDR); 79 80charrecvBuf[1024]={0}; 81 82while(true) 83{ 84memset(recvBuf,0x00,1024); 85intrecvLen=recv(cliSocket,recvBuf,1024,0); 86if(recvLen>0) 87{ 88shortmegId=*(short*)recvBuf; 89switch(megId) 90{ 91caseLoginSuc: 92{ 93//charuserName[32]={0}; 94//memcpy(userName,recvBuf+2,4); 95printf("LoginSuccess! \n"); 96isLogin=true; 97} 98break; 99caseMesNormal: 100{ 101charMess[1000]; 102memcpy(Mess,recvBuf+2,sizeof(recvBuf)-2); 103printf("==>Me: %s\n",Mess); 104 105} 106break; 107caseMesToAll: 108{ 109charMess[1000]; 110memcpy(Mess,recvBuf+2,sizeof(recvBuf)-2); 111printf("==>All: %s\n",Mess); 112} 113break; 114caseOnLineUser: 115{ 116charonLineUser[100]={0}; 117 118memcpy(onLineUser,recvBuf+2,sizeof(recvBuf)-2); 119 120//stringuserStr=charToString(onLineUser); 121 122for(inti=0;i 123cout< 124 125//printf("%s\n",userStr); 126cout< 127printf("\n"); 128 129} 130break; 131default: 132break; 133} 134}//endif 135}//endwhile 136 137return0; 138} 139 140intmain() 141{ 142WORDwVersionRequested; 143WSADATAwsaData; 144interr; 145 146wVersionRequested=MAKEWORD(2,2); 147 148err=WSAStartup(wVersionRequested,&wsaData); 149if(err! =0){ 150printf("WSAStartupfailedwitherror: %d\n",err); 151return1; 152} 153 154if(LOBYTE(wsaData.wVersion)! =2||HIBYTE(wsaData.wVersion)! =2){ 155/*Telltheuserthatwecouldnotfindausable*/ 156/*WinSockDLL.*/ 157printf("CouldnotfindausableversionofWinsock.dll\n"); 158WSACleanup(); 159return1; 160} 161else 162printf("TheWinsock2.2dllwasfoundokay\n"); 163 164 165SOCKETclientSock=socket(AF_INET,SOCK_STREAM,0); 166 167if(clientSock==-1) 168{ 169perror("socket创建出错! "); 170exit (1); 171} 172 173SOCKADDR_INaddrClient; 174addrClient.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); 175addrClient.sin_family=AF_INET; 176addrClient.sin_port=htons(6000); 177 178 179intret=connect(clientSock,(sockaddr*)&addrClient,sizeof(SOCKADDR)); 180if(ret) 181{ 182printf("连接失败\n"); 183return-1; 184} 185 186HANDLEthHandle=CreateThread(NULL,0,ProcThread,&clientSock,0,NULL); 187 188if(NULL==thHandle) 189{ 190cout<<"CreateThreadfailed! "< 191return-1; 192} 193 194charuserName[32]; 195printf("Pleaseinputname: "); 196scanf_s("%s",userName,31); 197 198/* 199UserInfo*user=newUserInfo; 200user->userSock=clientSock; 201strcpy_s(user->userName,userName); 202user->userAddr=addrClient.sin_addr.S_un.S_addr; 203*/ 204 205charloginInfo[64]={0}; 206memcpy(loginInfo,&MesLogin,2); 207memcpy(loginInfo+2,userName,strlen(userName)); 208 209 210//inta=send(clientSock,loginInfo,strlen(loginInfo),0); 211inta=send(clientSock,loginInfo,strlen(loginInfo),0); 212 213SendMes(clientSock); 214 215//Sleep(20000); 216//closesocket(clientSock); 217CloseHandle(thHandle); 218WSACleanup(); 219 220 221system("PAUSE"); 222return0; 223} 3、TCP: 服务器端程序 1#include 2#include 3#include 4#include 5#include 6#include"UserMesInfo.h" 7 8#pragmacomment(lib,"ws2_32.lib") 9 10usingnamespacestd; 11 12UserInfo*gUserInfo; 13 14stringcharToString(chartemp[]) 15{ 16stringtempStr=""; 17for(inti=0;i 18tempStr+=temp[i]; 19returntempStr; 20} 21 22 23DWORDWINAPIProcMes(LPVOIDlpParameter) 24{ 25SOCKETcliSocket=((UserInfo*)lpParameter)->userSock; 26//SOCKADDR_INsockFrom; 27 28charrecvBuf[1024]; 29//intlength=sizeof(SOCKADDR); 30 31while(true) 32{ 33memset(recvBuf,0x00,1024); 34recv(cliSocket,recvBuf,1024,0); 35 36shortMesType=*(short*)recvBuf; 37 38switch(MesType) 39{ 40caseMesLogin: 41{ 42staticshortUSERID=1001; 43UserInfo*userInfo=newUserInfo; 44char*userName=(char*)(recvBuf+2); 45strcpy_s(userInfo->userName,userName); 46userInfo->userId=USERID++; 47userInfo->userSock=cliSocket; 48userInfo->userAddr=((UserInfo*)lpParameter)->userAddr; 49userInfo->pNext=NULL; 50 51if(! gUserInfo) 52{ 53gUserInfo=userInfo; 54}else 55{ 56userInfo->pNext=gUserInfo; 57gUserInfo=userInfo; 58} 59printf("Login: %s==>%d! \n",userInfo->userName,userInfo->userId); 60 61charloginInfo[4]={0}; 62memcpy(loginInfo,&LoginSuc,2); 63 64inti=send(cliSocket,loginInfo,strlen(loginInfo),0); 65 66} 67break; 68caseMesNormal: 69{ 70//printf("TheNormalMessage! "); 71chartoName[32]={0}; 72memcpy(toName,recvBuf+2,32); 73cout< 74charMessage[1000]={0}; 75memcpy(Message,recvBuf+34,sizeof(recvBuf)-34); 76printf("%s\n",Message); 77 78charsendMes[1006]; 79memcpy(sendMes,&MesNormal,2); 80memcpy(sendMes+2,recvBuf+34,sizeof(recvBuf)-34); 81 82//send(toSock,sendMes,sizeof(sendMes),0); 83 84UserInfo*tempUser=gUserInfo; 85BOOLsendFlag=false; 86while(tempUser) 87{ 88if(! memcmp(toName,tempUser->userName,strlen(toName))) 89{ 90SOCKETtoSock=tempUser->userSock; 91send(toSock,sendMes,strlen(sendMes)+1,0); 92sendFlag=true; 93} 94tempUser=tempUser->pNext; 95} 96if(! sendFlag) 97{ 98printf("SendFailed! \n"); 99} 100 101} 102break; 103caseMesToAll: 104{ 105charMessage[1000]={0}; 106memcpy(Message,recvBuf+2,sizeof(recvBuf)-2); 107UserInfo*tempUser=gUserInfo; 108charsendMes[1002]; 109memcpy(sendMes,&MesToAll,2); 110memcpy(sendMes+2,Message,sizeof(Message)); 111while(tempUser) 112{ 113SOCKETtoSock=tempUser->userSock; 114inti=send(toSock,sendMes,strlen(sendMes)+1,0); 115if(i>0) 116{ 117printf("SendTo%sSuccess! \n",tempUser->userName); 118} 119tempUser=tempUser->pNext; 120} 121} 122break; 123caseMesError: 124//printf("TheErrorMessage! "); 125break; 126caseOnLineUser: 127{ 128 129charonLineUserBuff[1000]={0}; 130UserInfo*tempUser=gUserInfo; 131 132memcpy(onLineUserBuff,&OnLineUser,2); 133 134inti=0; 135stringuserStr=""; 136while(tempUser) 137{ 138userStr+=charToString(tempUser->userName); 139//处理方式有问题 140//memcpy(onLineUserBuff+2,tempUser->userName,32); 141//send(cliSocket,onLineUserBuff,sizeof(onLineUserBuff),0); 142tempUser=tempUser->pNext; 143} 144memcpy(onLineUserBuff+2,userStr.c_str(),userStr.length()); 145send(cliSocket,onLineUserBuff,sizeof(onLineUserBuff),0); 146 147} 148break; 149default: 150//printf("TheDefaultProcess! "); 151break; 152} 153 154} 155 156 157return0; 158} 159 160intmain() 161{ 162WORDwV
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows Socket 编程 支持多线程TCP环境VS 支持 多线程 TCP 环境 VS