Windows Socket 编程支持多线程TCP环境VS.docx

上传人:b****8 文档编号:11474136 上传时间:2023-03-01 格式:DOCX 页数:20 大小:22.26KB
下载 相关 举报
Windows Socket 编程支持多线程TCP环境VS.docx_第1页
第1页 / 共20页
Windows Socket 编程支持多线程TCP环境VS.docx_第2页
第2页 / 共20页
Windows Socket 编程支持多线程TCP环境VS.docx_第3页
第3页 / 共20页
Windows Socket 编程支持多线程TCP环境VS.docx_第4页
第4页 / 共20页
Windows Socket 编程支持多线程TCP环境VS.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

Windows Socket 编程支持多线程TCP环境VS.docx

《Windows Socket 编程支持多线程TCP环境VS.docx》由会员分享,可在线阅读,更多相关《Windows Socket 编程支持多线程TCP环境VS.docx(20页珍藏版)》请在冰豆网上搜索。

Windows Socket 编程支持多线程TCP环境VS.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1