飞道的博客

实现基于 TCP/IP 协议简单的客户端、服务器通信程序实例

523人阅读  评论(0)

本篇文章实现了一个基于TCP 的一个非常简单的客户/服务器通信程序实例。该程序中通讯协议使用的是面向连接的TCP协议SOCK_STREAM, 服务器的ip地址为本地地址即:

127.0.0.1,端口号为自定义的5099(大于1024即可),服务端的功能只要有客户端连接请求,服务端就接受连接,在连接成功后向客户端发送数据,并且接受客户端发送的

数据。客户端在向服务端发出请求后接受并显示服务端的数据,并且给服务端也发送数据。

以下代码是服务端程序代码:

 


  
  1. #include <WinSock2.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #pragma comment(lib, "ws2_32.lib")
  5. void main()
  6. {
  7. WSADATA wsaData;
  8. int port = 5099;
  9. char buf[] = "Server: hello, I am a server.....";
  10. if(WSAStartup(MAKEWORD( 2, 2), &wsaData) != 0)
  11. {
  12. printf( "Failed to load Winsock");
  13. return;
  14. }
  15. //创建用于监听的套接字
  16. SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
  17. SOCKADDR_IN addrSrv;
  18. addrSrv.sin_family = AF_INET;
  19. addrSrv.sin_port = htons(port); //1024以上的端口号
  20. addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
  21. int retVal = bind(sockSrv, (LPSOCKADDR)&addrSrv, sizeof(SOCKADDR_IN));
  22. if(retVal == SOCKET_ERROR){
  23. printf( "Failed bind:%d\n", WSAGetLastError());
  24. return;
  25. }
  26. if(listen(sockSrv, 10) ==SOCKET_ERROR){
  27. printf( "Listen failed:%d", WSAGetLastError());
  28. return;
  29. }
  30. SOCKADDR_IN addrClient;
  31. int len = sizeof(SOCKADDR);
  32. while( 1)
  33. {
  34. //等待客户请求到来
  35. SOCKET sockConn = accept(sockSrv, (SOCKADDR *) &addrClient, &len);
  36. if(sockConn == SOCKET_ERROR){
  37. printf( "Accept failed:%d", WSAGetLastError());
  38. break;
  39. }
  40. printf( "Accept client IP:[%s]\n", inet_ntoa(addrClient.sin_addr));
  41. //发送数据
  42. int iSend = send(sockConn, buf, sizeof(buf) , 0);
  43. if(iSend == SOCKET_ERROR){
  44. printf( "send failed");
  45. break;
  46. }
  47. char recvBuf[ 100];
  48. memset(recvBuf, 0, sizeof(recvBuf));
  49. // //接收数据
  50. recv(sockConn, recvBuf, sizeof(recvBuf), 0);
  51. printf( "%s\n", recvBuf);
  52. closesocket(sockConn);
  53. }
  54. closesocket(sockSrv);
  55. WSACleanup();
  56. system( "pause");
  57. }


接下来是客户端代码:

 

 


  
  1. #include <WinSock2.h>
  2. #include <stdio.h>
  3. #pragma comment(lib, "ws2_32.lib")
  4. void main()
  5. {
  6. //加载套接字
  7. WSADATA wsaData;
  8. char buff[ 1024];
  9. memset(buff, 0, sizeof(buff));
  10. if(WSAStartup(MAKEWORD( 2, 2), &wsaData) != 0)
  11. {
  12. printf( "Failed to load Winsock");
  13. return;
  14. }
  15. SOCKADDR_IN addrSrv;
  16. addrSrv.sin_family = AF_INET;
  17. addrSrv.sin_port = htons( 5099);
  18. addrSrv.sin_addr.S_un.S_addr = inet_addr( "127.0.0.1");
  19. //创建套接字
  20. SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
  21. if(SOCKET_ERROR == sockClient){
  22. printf( "Socket() error:%d", WSAGetLastError());
  23. return;
  24. }
  25. //向服务器发出连接请求
  26. if(connect(sockClient, (struct sockaddr*)&addrSrv, sizeof(addrSrv)) == INVALID_SOCKET){
  27. printf( "Connect failed:%d", WSAGetLastError());
  28. return;
  29. } else
  30. {
  31. //接收数据
  32. recv(sockClient, buff, sizeof(buff), 0);
  33. printf( "%s\n", buff);
  34. }
  35. //发送数据
  36. char buff = "hello, this is a Client....";
  37. send(sockClient, buff, sizeof(buff), 0);
  38. //关闭套接字
  39. closesocket(sockClient);
  40. WSACleanup();
  41. }

 

运行结果:

 

 

 

 


转载:https://blog.csdn.net/shenjie12345678/article/details/28321969
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场