前言

  不得不承认作为一个前端开发,仍有一个后台开发的梦。从socket通信开始学习,在工作之余补充学习点相关知识,记录下学习的过程。

服务端

  服务器代码如下,在设置listen之后,通过accept获取对应的socket连接并创建线程进行通信,通信完成后关闭对应线程。

  1. // socket_service.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <stdio.h>
  6. #include <Winsock2.h>
  7. #pragma comment(lib, "ws2_32.lib")
  8.  
  9. #define LISTEN_MAX_COUNT 5
  10.  
  11. DWORD WINAPI AnswerThread(LPVOID lparam)
  12. {
  13. printf("Thread ID:%4d create!\n", GetCurrentThreadId());
  14. int ret;
  15. char buf[] = { };
  16. char sendBuf[] = { };
  17. SOCKET clientSocket = (SOCKET)(LPVOID)lparam;
  18. while (true)
  19. {
  20. memset(buf, , sizeof(buf));
  21. ret = recv(clientSocket, buf, sizeof(buf), );
  22. if (ret<=)
  23. {
  24. break;
  25. }
  26. printf("revc: %s\n", buf);
  27. sprintf_s(sendBuf, "Thread ID:%4d revced", GetCurrentThreadId());
  28. ret = send(clientSocket, sendBuf, strlen(sendBuf) + sizeof(char), );
  29. if (ret <= )
  30. {
  31. break;
  32. }
  33. }
  34. printf("Thread ID:%4d stop!\n", GetCurrentThreadId());
  35. closesocket(clientSocket);
  36. return ;
  37. }
  38.  
  39. int _tmain(int argc, _TCHAR* argv[])
  40. {
  41.  
  42. WORD wVersionRequested;
  43. WSADATA wsaData;
  44. wVersionRequested = MAKEWORD(, );
  45. if (WSAStartup(wVersionRequested, &wsaData) == INVALID_SOCKET)
  46. {
  47. return ;
  48. }
  49.  
  50. if (LOBYTE(wsaData.wVersion) != ||
  51. HIBYTE(wsaData.wVersion) != ) {
  52. WSACleanup();
  53. return ;
  54. }
  55. SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, );
  56. int len = sizeof(SOCKADDR);
  57. SOCKADDR_IN clientAddr;
  58. SOCKADDR_IN serviceAddr;
  59. serviceAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
  60. serviceAddr.sin_family = AF_INET;
  61. serviceAddr.sin_port = htons();
  62.  
  63. if (bind(sockSrv, (SOCKADDR*)&serviceAddr, len) == INVALID_SOCKET)
  64. {
  65. printf("failed bind!\n");
  66. closesocket(sockSrv);
  67. WSACleanup();
  68. return ;
  69. }
  70. if (listen(sockSrv, LISTEN_MAX_COUNT) == SOCKET_ERROR) {
  71. printf("Listen failed with error: %ld\n", WSAGetLastError());
  72. closesocket(sockSrv);
  73. WSACleanup();
  74. return ;
  75. }
  76.  
  77. SOCKET sockClient;
  78. HANDLE hThread = NULL;
  79. DWORD dwThreadId;
  80. while ()
  81. {
  82. sockClient = accept(sockSrv, (SOCKADDR*)&clientAddr, &len);
  83. Sleep();
  84. hThread = CreateThread(NULL, NULL, AnswerThread, (LPVOID)sockClient, , &dwThreadId);
  85. if (hThread == NULL)
  86. {
  87. printf("CreatThread AnswerThread() failed.\n");
  88. }
  89. }
  90.  
  91. closesocket(sockSrv);
  92. WSACleanup();
  93. return ;
  94. }
客户端

   客户端代码如下,在连接成功后,循环输入进行通信对话。

  1. // socket_client.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <stdio.h>
  6. #include <Winsock2.h>
  7.  
  8. #pragma comment( lib, "ws2_32.lib" )
  9.  
  10. int _tmain(int argc, _TCHAR* argv[])
  11. {
  12.  
  13. WORD wVersionRequested;
  14. WSADATA wsaData;
  15. int err;
  16.  
  17. wVersionRequested = MAKEWORD(, );
  18. if (WSAStartup(wVersionRequested, &wsaData) == INVALID_SOCKET)
  19. {
  20. return -;
  21. }
  22.  
  23. if (LOBYTE(wsaData.wVersion) != ||
  24. HIBYTE(wsaData.wVersion) != ) {
  25. WSACleanup();
  26. return -;
  27. }
  28.  
  29. SOCKET sockClient = socket(AF_INET, SOCK_STREAM, );
  30. int len = sizeof(SOCKADDR);
  31.  
  32. SOCKADDR_IN local;
  33. local.sin_addr.S_un.S_addr = inet_addr("192.168.1.15");
  34. local.sin_family = AF_INET;
  35. local.sin_port = htons();
  36.  
  37. if (connect(sockClient, (SOCKADDR*)&local, len) == INVALID_SOCKET)
  38. {
  39. printf("connect error/n");
  40. return ;
  41. }
  42.  
  43. char inputBuf[];
  44. char recvBuf[];
  45. int ret;
  46. // while (scanf_s("%s", inputBuf, sizeof(inputBuf)) != EOF)
  47. while (gets_s(inputBuf))
  48. {
  49. if (strcmp(inputBuf, "stop") ==)
  50. {
  51. break;
  52. }
  53. ret = send(sockClient, inputBuf, strlen(inputBuf) + sizeof(char), );
  54. if (ret<=)
  55. {
  56. printf("send failed!\n");
  57. break;
  58. }
  59. ret = recv(sockClient, recvBuf, sizeof(recvBuf), );
  60. if (ret <= )
  61. {
  62. printf("recv failed!\n");
  63. break;
  64. }
  65. printf("my reply is : %s\n", recvBuf);
  66. //printf("%s\n", inet_ntoa(local.sin_addr));
  67. }
  68.  
  69. closesocket(sockClient);
  70. WSACleanup();
  71. return ;
  72. }
测试

  Hello World!!

1、开启多个客户端,可以看到服务器如下输出多个线程的创建。

  

2、客户端输入hello world!,可以得到服务器回复,并告知哪个服务器线程接收了消息。

  

3、关闭其中一个客户端,可以看到对应线程也关闭了。

4、关闭服务端后,可以端输入任意内容,可以看到客户端也收到提示发送失败并关闭。

C++的socket编程学习的更多相关文章

  1. socket编程学习step1

    socket学习参考链接,赞一个:http://blog.csdn.net/hguisu/article/details/7445768 sockets(套接字)编程有三种,流式套接字(SOCK_ST ...

  2. JAVA Socket 编程学习笔记(二)

    在上一篇中,使用了 java Socket+Tcp/IP  协议来实现应用程序或客户端--服务器间的实时双向通信,本篇中,将使用 UDP 协议来实现 Socket 的通信. 1. 关于UDP UDP协 ...

  3. JAVA Socket 编程学习笔记(一)

    1. Socket 通信简介及模型 Java Socket 可实现客户端--服务器间的双向实时通信.java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的cli ...

  4. Socket编程学习之道:揭开Socket编程的面纱

    对TCP/IP.UDP.Socket编程这些词你不会非常陌生吧?随着网络技术的发展.这些词充斥着我们的耳朵. 那么我想问: 1.         什么是TCP/IP.UDP? 2.         S ...

  5. LInux下socket编程学习笔记

    1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...

  6. 记一次:Windows的Socket编程学习和分析过程

    Socket编程依赖于:WS2_32.dll --- 服务端 --- .导入我们需要的函数 #incldue <windows.h> //#include<WinSock2.h> ...

  7. Android Socket编程学习笔记

    http://blog.csdn.net/eyu8874521/article/details/8847173 度娘给出的描述:通常也称作"套接字",用于描述IP地址和端口,是一个 ...

  8. BSD socket编程学习

    1.socket简介 BSD是实现TCP/IP协议通信的软件系统,socket是应用编程接口,为app提供使用TCP/IP协议通信的接口. 网络层IP提供点到点服务(IP地址标识),传输层TCP和UD ...

  9. socket编程学习

    socket: 也称作套接字,应用程序通常通过套接字向网络发出请求或者应答网络请求. 常用的套接字API函数: 1.socket(): 函数原型为:int socket(int domain, int ...

随机推荐

  1. 六,ESP8266 TCP Client

    今天不知道是不是让我姐挺失望.......很多时候都不知道自己努力的方向对不对,,以后能不能带给家人最美好的期盼...... Init.lua 没啥改变,,就改了一下加载Client.lua gpio ...

  2. 团队作业4----第一次项目冲刺(Alpha版本)4.24

    a.提供当天站立式会议照片 会议内容: ①:对数据库的设计存在问题的进一步讨论 ②:讨论需求分析中的存在的难解决的问题,比如要做到较好的反应用户的行为. ③:分配今天的任务 b. 每个人的工作 工作完 ...

  3. 团队作业8——第二次项目冲刺(Beta阶段)--第七天

    会议照片: 燃尽图: 项目进展: 所有项目都已完成 进行app测试即使用情况评估 团队贡献比: 队员 角色 团队贡献比 陈麟凤 PM 17% 张志杰 DEV 18% 黄海鸿 TEST 16% 康建灿 ...

  4. [转载] java中静态代码块的用法 static用法详解

    一.java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序 ...

  5. 201521123013 《Java程序设计》第8周学习总结

    1. 本章学习总结 2. 书面作业 Q1.List中指定元素的删除(题目4-1) 1.1 实验总结 while(list.contains(str)) list.remove(str); Q2.统计文 ...

  6. 201521123014 《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 1.2 可选:使用常规方法总结其他上课内容. GUI与Sw ...

  7. 201521123111《Java程序设计》第4周学习总结

    1. 本章学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. Answer: - 上课还讲了tostring的使用,般toString用于返回表示对象值的 ...

  8. Python[小甲鱼005Python的数据类型]

    一.数值类型 整形 布尔类型        True 和 False  即1和0 浮点型 e记法                e ,例如      1.5e11 = 150000000000     ...

  9. 201521123104 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 1.1 建立数据库,将自己的姓名.学号作为一条记录插入.(截图, ...

  10. Linux入门_1

    Linux入门 目录  Root用户  终端  交互式接口(图形化界面和命令行)  什么是Shell(bash)  命令提示符  内部命令和外部命令 enable,hash  命令别名 ...