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;i123cout<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;i18tempStr+=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