C Socket服务器

Code:
  1. #include<windows.h>
  2. #include<winsock.h>
  3. #include"resource.h"
  4. #include"PROCESS.H"
  5. #definePORTNUM5000//端口号
  6. #defineMAX_PENDING_CONNECTS4//等待连接队列的最大长度
  7. #defineWM_MESSAGE_REVED(WM_USER+0)//接收到数据包消息
  8. #defineWM_MESSAGE_SENDED(WM_USER+1)//发送出到数据包消息
  9. //主线程向负责接收和发送的线程传递参数
  10. typedefstruct
  11. {
  12. HWNDhwnd;//主线程的窗口句柄
  13. BOOLbContinue;//状态指示参数
  14. SOCKETWinSocket;//监听socket
  15. SOCKADDR_INlocal_sin,//本地socket地址
  16. accept_sin;//接收连接的socket地址
  17. }
  18. PARAMS,*PPARAMS;
  19. charszServerA[100];//ASCIIstring
  20. TCHARszServerW[100];//Unicodestring
  21. TCHARszError[100];//Errormessagestring
  22. TCHARszSendBuffer[100];//线程间共享缓冲池
  23. SOCKETClientSock=INVALID_SOCKET;//服务器和客户端通信的Socket
  24. BOOLWINAPIMainDlgProc(HWNDhDlg,UINTmsg,WPARAMwParam,LPARAMlParam);
  25. voidNetworkThread(PVOIDpvoid);
  26. intWINAPIWinMain(
  27. HINSTANCEhInstance,//实例句柄
  28. HINSTANCEhPrevInstance,//NULL
  29. LPTSTRlpCmdLine,//用于运行程序的命令行
  30. intnCmdShow)//程序的最初的显示方式
  31. {
  32. WNDCLASSwc;
  33. GetClassInfo(NULL,WC_DIALOG,&wc);//Getdialogboxclassinfo
  34. wc.hInstance=hInstance;
  35. wc.lpszClassName="Client";//so'swecansuperclassit
  36. wc.lpfnWndProc=DefDlgProc;//allthisforanicon...sheesh
  37. wc.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(100));
  38. wc.cbWndExtra=DLGWINDOWEXTRA;
  39. if(!RegisterClass(&wc))//Quitifregistrationfails
  40. return(FALSE);
  41. //hInst=hInstance;//Nowjuststartthemaindialogandexit
  42. DialogBox(hInstance,MAKEINTRESOURCE(ID_CLIENT),NULL,MainDlgProc);
  43. returnTRUE;
  44. }
  45. //===MainDialogBox========================================================
  46. BOOLWINAPIMainDlgProc(HWNDhDlg,UINTmsg,WPARAMwParam,LPARAMlParam)
  47. {
  48. staticSOCKADDR_INlocal_sin,//本地socket地址
  49. accept_sin;//接收连接对象的地址
  50. staticSOCKADDR_INdestination_sin;//服务器的socket地址
  51. staticPHOSTENTphostent=NULL;//指向服务器的HOSTENT结构
  52. staticWSADATAWSAData;//包含了Winsocket执行后的细节
  53. staticPARAMSparams;
  54. staticSOCKETWinSocket=INVALID_SOCKET;//Windowsocket
  55. switch(msg)
  56. {
  57. caseWM_INITDIALOG://初始化对话框消息
  58. {
  59. //初始化Winsocket.
  60. if(WSAStartup(MAKEWORD(1,1),&WSAData)!=0)
  61. {
  62. wsprintf(szError,TEXT("WSAStartupfailed.Error:%d"),
  63. WSAGetLastError());
  64. MessageBox(NULL,szError,TEXT("Error"),MB_OK);
  65. returnFALSE;
  66. }
  67. //创建一个TCP/IPsocket,WinSocket.
  68. if((WinSocket=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)
  69. {
  70. wsprintf(szError,TEXT("Allocatingsocketfailed.Error:%d"),
  71. WSAGetLastError());
  72. MessageBox(NULL,szError,TEXT("Error"),MB_OK);
  73. returnFALSE;
  74. }
  75. //填写本地socket地址信息
  76. local_sin.sin_family=AF_INET;
  77. local_sin.sin_port=htons(PORTNUM);
  78. local_sin.sin_addr.s_addr=htonl(INADDR_ANY);
  79. //把本地地址绑定到WinSocket.
  80. if(bind(WinSocket,
  81. (structsockaddr*)&local_sin,
  82. sizeof(local_sin))==SOCKET_ERROR)
  83. {
  84. wsprintf(szError,TEXT("Bindingsocketfailed.Error:%d"),
  85. WSAGetLastError());
  86. MessageBox(NULL,szError,TEXT("Error"),MB_OK);
  87. closesocket(WinSocket);
  88. returnFALSE;
  89. }
  90. //建立一个socket监听到来的连接
  91. if(listen(WinSocket,MAX_PENDING_CONNECTS)==SOCKET_ERROR)
  92. {
  93. wsprintf(szError,
  94. TEXT("Listeningtotheclientfailed.Error:%d"),
  95. WSAGetLastError());
  96. MessageBox(NULL,szError,TEXT("Error"),MB_OK);
  97. closesocket(WinSocket);
  98. returnFALSE;
  99. }
  100. params.hwnd=hDlg;
  101. params.bContinue=TRUE;
  102. params.WinSocket=WinSocket;
  103. params.accept_sin=accept_sin;
  104. params.local_sin=local_sin;
  105. _beginthread(NetworkThread,0,¶ms);
  106. }
  107. caseWM_PAINT://对话框绘制消息
  108. {
  109. PAINTSTRUCTps;
  110. HDChDC;
  111. RECTRect;
  112. hDC=BeginPaint(hDlg,&ps);
  113. GetClientRect(hDlg,&Rect);
  114. FillRect(hDC,&Rect,GetProp(hDlg,"BRUSH"));
  115. EndPaint(hDlg,&ps);
  116. return0;
  117. }
  118. caseWM_MESSAGE_REVED://辅助线程接收到消息
  119. {
  120. //把接收到的消息在对话框中显示
  121. SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),szServerW);
  122. return0;
  123. }
  124. caseWM_COMMAND://处理从控件传递来的消息
  125. {
  126. if(wParam==IDC_SEND)
  127. {
  128. //如果用户点击发送,从输入框中取得文本
  129. GetWindowText(GetDlgItem(hDlg,IDC_EDIT),
  130. szSendBuffer,GetWindowTextLength(GetDlgItem(hDlg,IDC_EDIT)));
  131. //发送文本
  132. if(send(ClientSock,szSendBuffer,strlen(szSendBuffer)+1,0)
  133. ==SOCKET_ERROR)
  134. {
  135. wsprintf(szError,
  136. TEXT("Sendingdatatotheserverfailed.Error:%d"),
  137. WSAGetLastError());
  138. MessageBox(NULL,szError,TEXT("Error"),MB_OK);
  139. }
  140. }
  141. elseif(wParam==IDCANCEL)
  142. {
  143. EndDialog(hDlg,TRUE);
  144. }
  145. return(TRUE);
  146. }
  147. }
  148. returnFALSE;
  149. }
  150. //辅助线程,负责socket通信
  151. voidNetworkThread(PVOIDpvoid)
  152. {
  153. volatilePPARAMSpparams;
  154. intindex=0,//索引
  155. iReturn;
  156. intaccept_sin_len;//accept_sin的长度
  157. pparams=(PPARAMS)pvoid;
  158. accept_sin_len=sizeof(pparams->accept_sin);
  159. //接收来自发送到WinSocket的连接请求
  160. ClientSock=accept(pparams->WinSocket,
  161. (structsockaddr*)&(pparams->accept_sin),
  162. (int*)&accept_sin_len);
  163. //停止接收客户端的连接请求
  164. closesocket(pparams->WinSocket);
  165. if(ClientSock==INVALID_SOCKET)
  166. {
  167. wsprintf(szError,TEXT("Acceptingconnectionwithclientfailed.")
  168. TEXT("Error:%d"),WSAGetLastError());
  169. MessageBox(NULL,szError,TEXT("Error"),MB_OK);
  170. }
  171. for(;;)
  172. {
  173. //从客户端接收数据
  174. iReturn=recv(ClientSock,szServerA,sizeof(szServerA),0);
  175. //如果有数据,就显示之
  176. if(iReturn==SOCKET_ERROR)
  177. {
  178. wsprintf(szError,TEXT("Nodataisreceived,recvfailed.")
  179. TEXT("Error:%d"),WSAGetLastError());
  180. MessageBox(NULL,szError,TEXT("Server"),MB_OK);
  181. break;
  182. }
  183. elseif(iReturn==0)
  184. {
  185. MessageBox(NULL,TEXT("Finishedreceivingdata"),TEXT("Server"),
  186. MB_OK);
  187. break;
  188. }
  189. else
  190. {
  191. //把ASCII码字符串转换成Unicode码字符串
  192. for(index=0;index<=sizeof(szServerA);index++)
  193. szServerW[index]=szServerA[index];
  194. //显示从服务器接收到的字符串
  195. //MessageBox(NULL,szClientW,TEXT("ReceivedFromServer"),MB_OK);
  196. SendMessage(pparams->hwnd,WM_MESSAGE_REVED,0,0);
  197. }
  198. }
  199. //发送一条消息到客户端
  200. //禁止ClientSock的接收和发送端口.
  201. shutdown(ClientSock,0x02);
  202. //关闭ClientSock.
  203. closesocket(ClientSock);
  204. WSACleanup();
  205. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值