C Socket客户端

Code:
  1. #include"windows.h"
  2. #include"winsock.h"
  3. #include"resource.h"
  4. #include"PROCESS.H"
  5. #defineSTATUS_SEND0
  6. #defineSTATUS_REVE1
  7. #defineSTATUS_DONE2
  8. #defineWM_MESSAGE_REVED(WM_USER+0)
  9. #defineWM_MESSAGE_SENDED(WM_USER+1)
  10. #definePORTNUM5000//端口号
  11. #defineHOSTNAME"localhost"//服务器名字
  12. //根据服务器的不同,更改上面的名字
  13. typedefstruct
  14. {
  15. HWNDhwnd;
  16. BOOLbContinue;
  17. SOCKETServerSock;
  18. }
  19. PARAMS,*PPARAMS;
  20. //===FunctionPrototypes====================================================
  21. BOOLWINAPIMainDlgProc(HWND,UINT,WPARAM,LPARAM);
  22. voidNetworkThread(PVOIDpvoid);
  23. //===GlobalVariables=======================================================
  24. HINSTANCEhInst;
  25. charszClientA[100];//ASCII码串
  26. TCHARszClientW[100];//Unicode串
  27. TCHARszSendBuffer[100];
  28. TCHARszError[100];//出错消息串
  29. //===ApplicationEntryPoint================================================
  30. intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPrev,LPSTRlpCmd,
  31. intnShow)
  32. {
  33. WNDCLASSwc;
  34. GetClassInfo(NULL,WC_DIALOG,&wc);//Getdialogboxclassinfo
  35. wc.hInstance=hInstance;
  36. wc.lpszClassName="Client";//so'swecansuperclassit
  37. wc.lpfnWndProc=DefDlgProc;//allthisforanicon...sheesh
  38. wc.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(100));
  39. wc.cbWndExtra=DLGWINDOWEXTRA;
  40. if(!RegisterClass(&wc))//Quitifregistrationfails
  41. return(FALSE);
  42. hInst=hInstance;//Nowjuststartthemaindialogandexit
  43. DialogBox(hInstance,MAKEINTRESOURCE(ID_CLIENT),NULL,MainDlgProc);
  44. return(FALSE);
  45. }
  46. //===MainDialogBox========================================================
  47. BOOLWINAPIMainDlgProc(HWNDhDlg,UINTmsg,WPARAMwParam,LPARAMlParam)
  48. {
  49. staticSOCKETServerSock=INVALID_SOCKET;//服务器的socket
  50. staticSOCKADDR_INdestination_sin;//服务器的socket地址
  51. staticPHOSTENTphostent=NULL;//指向服务器的HOSTENT结构
  52. staticWSADATAWSAData;//包含了Winsocket执行后的细节
  53. staticPARAMSparams;
  54. switch(msg)
  55. {
  56. caseWM_INITDIALOG:
  57. {
  58. if(WSAStartup(MAKEWORD(1,1),&WSAData)!=0)
  59. {
  60. wsprintf(szError,TEXT("WSAStartupfailed.Error:%d"),
  61. WSAGetLastError());
  62. MessageBox(NULL,szError,TEXT("Error"),MB_OK);
  63. returnFALSE;
  64. }
  65. return0;
  66. }
  67. caseWM_PAINT://PaintdialogboxbackgroundCOLOR_BTNFACE
  68. {
  69. PAINTSTRUCTps;
  70. HDChDC;
  71. RECTRect;
  72. hDC=BeginPaint(hDlg,&ps);
  73. GetClientRect(hDlg,&Rect);
  74. FillRect(hDC,&Rect,GetProp(hDlg,"BRUSH"));
  75. EndPaint(hDlg,&ps);
  76. return0;
  77. }
  78. caseWM_MESSAGE_REVED:
  79. {
  80. SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),szClientW);
  81. return0;
  82. }
  83. caseWM_COMMAND:
  84. {
  85. if(wParam==IDC_CONNECT)//连接服务器
  86. {
  87. if((ServerSock=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)
  88. {
  89. wsprintf(szError,TEXT("Allocatingsocketfailed.Error:%d"),
  90. WSAGetLastError());
  91. MessageBox(NULL,szError,TEXT("Error"),MB_OK);
  92. returnFALSE;
  93. }
  94. //把服务器的socket的地址信息填入
  95. destination_sin.sin_family=AF_INET;
  96. //通过主机名取得主机信息
  97. if((phostent=gethostbyname(HOSTNAME))==NULL)
  98. {
  99. wsprintf(szError,TEXT("Unabletogetthehostname.Error:%d"),
  100. WSAGetLastError());
  101. MessageBox(NULL,szError,TEXT("Error"),MB_OK);
  102. closesocket(ServerSock);
  103. returnFALSE;
  104. }
  105. //分配socketIP地址
  106. memcpy((charFAR*)&(destination_sin.sin_addr),
  107. phostent->h_addr,
  108. phostent->h_length);
  109. //转化端口字段为大终点
  110. destination_sin.sin_port=htons(PORTNUM);
  111. //建立一个到服务器socket的连接.
  112. if(connect(ServerSock,
  113. (PSOCKADDR)&destination_sin,
  114. sizeof(destination_sin))==SOCKET_ERROR)
  115. {
  116. wsprintf(szError,
  117. TEXT("Connectingtotheserverfailed.Error:%d"),
  118. WSAGetLastError());
  119. MessageBox(NULL,szError,TEXT("Error"),MB_OK);
  120. closesocket(ServerSock);
  121. returnFALSE;
  122. }
  123. params.hwnd=hDlg;
  124. params.bContinue=TRUE;
  125. params.ServerSock=ServerSock;
  126. _beginthread(NetworkThread,0,¶ms);
  127. }
  128. elseif(wParam==IDC_SEND)
  129. {
  130. GetWindowText(GetDlgItem(hDlg,IDC_EDIT),
  131. szSendBuffer,GetWindowTextLength(GetDlgItem(hDlg,IDC_EDIT)));
  132. if(send(ServerSock,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. //EndofMainDlgProc()
  151. voidNetworkThread(PVOIDpvoid)
  152. {
  153. volatilePPARAMSpparams;
  154. intindex=0,//索引
  155. iReturn;//recv函数的返回值
  156. pparams=(PPARAMS)pvoid;
  157. for(;;)
  158. {
  159. //从服务器接收信息
  160. iReturn=recv(pparams->ServerSock,szClientA,sizeof(szClientA),0);
  161. //如果接收到服务器信息,显示之
  162. if(iReturn==SOCKET_ERROR)
  163. {
  164. wsprintf(szError,TEXT("Nodataisreceived,recvfailed.")
  165. TEXT("Error:%d"),WSAGetLastError());
  166. MessageBox(NULL,szError,TEXT("Client"),MB_OK);
  167. break;
  168. }
  169. elseif(iReturn==0)
  170. {
  171. MessageBox(NULL,TEXT("Finishedreceivingdata"),TEXT("Client"),
  172. MB_OK);
  173. break;
  174. }
  175. else
  176. {
  177. //把ASCII码字符串转换成Unicode码字符串
  178. for(index=0;index<=sizeof(szClientA);index++)
  179. szClientW[index]=szClientA[index];
  180. //显示从服务器接收到的字符串
  181. //MessageBox(NULL,szClientW,TEXT("ReceivedFromServer"),MB_OK);
  182. SendMessage(pparams->hwnd,WM_MESSAGE_REVED,0,0);
  183. }
  184. }
  185. //禁止服务器发送信息
  186. shutdown(pparams->ServerSock,0x00);
  187. //关闭服务器socket.
  188. closesocket(pparams->ServerSock);
  189. WSACleanup();
  190. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值