文章目录

  • 1 建立能够持续请求的CS网络程序
    • 1.1 概述
    • 1.2 服务端代码
    • 1.3 客户端代码

1 建立能够持续请求的CS网络程序

1.1 概述

我们在上一次的代码基础,建立能够持续请求的CS网络程序:

用Socket API建立简易TCP服务端:

  1. 建立一个socket
  2. 绑定接受客户端连接的端口 bind
  3. 监听网络端口 listen
  4. 等待新客户端连接 accept
  5. 等待客户端请求 recv
  6. 向客户端返回请求的数据send
    //–循环5-6
  7. 关闭socket closesocket

用Socket API建立简易TCP客户端

  1. 建立一个socket
  2. 连接服务器 connect
  3. 向服务端发送请求 send
  4. 接收服务器返回的数据 recv
    //–循环3-4
  5. 关闭socket closesocket

1.2 服务端代码

server.cpp:

#include <iostream>#define WIN32_LEAN_AND_MEAN#include <Windows.h>
#include <WinSock2.h>#pragma comment(lib, "ws2_32.lib")using namespace std;int main()
{WSADATA data;WORD version = MAKEWORD(2, 2);// 初始化Sokcet库WSAStartup(version, &data);//-- 用Socket API建立简易TCP服务端// 1 建立一个socketSOCKET _sock;_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (INVALID_SOCKET == _sock){cout << "server : create socket error !" << endl;WSACleanup();return -1;}else{cout << "server : create socket success !" << endl;}// 2 bind 绑定用于接受客户端连接的网络端口sockaddr_in _sockaddr;_sockaddr.sin_family = AF_INET;_sockaddr.sin_port = htons(4567);_sockaddr.sin_addr.S_un.S_addr = ADDR_ANY; //inet_addr("127.0.0.1");int ret = bind(_sock, (sockaddr*)&_sockaddr, sizeof(sockaddr_in));if (SOCKET_ERROR == ret){cout << "server : bind error!" << endl;WSACleanup();return -1;}else{cout << "server : bind success !" << endl;}// 3 listen 监听网络端口ret = listen(_sock, 5);if (SOCKET_ERROR == ret){cout << "server : listen error !" << endl;WSACleanup();return -1;}else{cout << "server : listen success !" << endl;}sockaddr_in _sockaddr_in;int len = sizeof(sockaddr_in);// 4 accept 等待接受客户端连接SOCKET clientSock = accept(_sock, (sockaddr*)&_sockaddr_in, &len);if (INVALID_SOCKET == clientSock){cout << "server : accept bad socket!" << endl;}else{cout << "server : new client join, IP : " << inet_ntoa(_sockaddr_in.sin_addr) << endl;}char buffer[] = "hello, client! I am server !";while (true){// 5 从客户端接收数据并处理int recvLen = recv(clientSock, buffer, sizeof(buffer), 0);if (recvLen > 0){cout << "recv : " << buffer << endl;if (0 == strcmp(buffer, "getName")){char msgBuffer[] = "lemon";send(clientSock, msgBuffer, strlen(msgBuffer) + 1, 0);}else if (0 == strcmp(buffer, "getAge")){char msgBuffer[] = "18";send(clientSock, msgBuffer, strlen(msgBuffer) + 1, 0);}else{char msgBuffer[] = "??? What are you want to ask?";send(clientSock, msgBuffer, strlen(msgBuffer) + 1, 0);}}else{cout << "client quit ..." << endl;break;}}// 6 关闭套节字closesocketclosesocket(_sock);// 对Socket资源进行处理WSACleanup();getchar();return 0;
}

1.3 客户端代码

client.cpp:

#include <iostream>#define WIN32_LEAN_AND_MEAN#include <Windows.h>
#include <WinSock2.h>#pragma comment(lib, "ws2_32.lib")using namespace std;int main()
{WSADATA data;WORD version = MAKEWORD(2, 2);// 初始化Sokcet库WSAStartup(version, &data);//------------//-- 用Socket API建立简易TCP客户端// 1 建立一个socketSOCKET _sock;_sock = socket(AF_INET, SOCK_STREAM, 0);  // 客户端的协议类型可以直接给0if (INVALID_SOCKET == _sock){cout << "client : create socket error !" << endl;WSACleanup();return -1;}else{cout << "client : create socket success !" << endl;}// 2 连接服务器 connectsockaddr_in _sockaddr;_sockaddr.sin_family = AF_INET;_sockaddr.sin_port = htons(4567);_sockaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");int ret = connect(_sock, (sockaddr*)&_sockaddr, sizeof(sockaddr_in));if (SOCKET_ERROR == ret){cout << "client : connect error !" << endl;WSACleanup();return -1;}else{cout << "client : connect success !" << endl;}char cmdBuffer[128] = { 0 };char recvBuffer[128] = { 0 };while (true){// 3 接收用户输入并发送到服务器,然后接收回应cin >> cmdBuffer;if (0 == strcmp(cmdBuffer, "quit")){break;}send(_sock, cmdBuffer, strlen(cmdBuffer) + 1, 0);int len = recv(_sock, recvBuffer, sizeof(recvBuffer), 0);if (len > 0){cout << "client recv : " << recvBuffer << endl;}else{break;}}// 4 关闭套节字closesocketclosesocket(_sock);// 对Socket资源进行处理WSACleanup();getchar();return 0;
}

参考资料:

  1. C++ 百万并发网络通信引擎架构与实现 (服务端、客户端、跨平台) Version 1.0

建立能够持续请求的CS网络程序相关推荐

  1. 十年一遇的奇葩故障--Windows网络编程接口故障:telnet显示无法加载或初始化请求的服务提供程序...

    现象:某同事的笔记本win7x64系统,当初故障是无法使用小乌龟连接到svn服务器,但又可以正常上网,并且svn服务器端是正常的. 后来我进一步测试,发觉该电脑也不能连接到远程windows. net ...

  2. 基于TCP协议的网络程序(基础学习)

    下图是基于TCP协议的客户端/服务器程序的一般流程: 图 37.2. TCP协议通讯流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听 ...

  3. 如何使用TCP/IP开发网络程序

    摘要:进行TCP协议网络程序的编写,关键在于ServerSocket套接字的熟练使用,TCP通信中所有的信息传输都是依托ServerSocket类的输入输出流进行的. 本文分享自华为云社区<Ja ...

  4. Visual C#.Net网络程序开发-Tcp篇(1)

    Visual C#.Net 网络程序开发-Socket篇 Visual C#.Net网络程序开发-Tcp篇(1) Visual C#.Net网络程序开发-Tcp篇(2) Visual C#.Net网络 ...

  5. 分别基于IO、NIO、Netty的Java网络程序

    分别基于IO.NIO.Netty的Java网络程序 IDE:IntelliJ IDEA 文章目录 分别基于IO.NIO.Netty的Java网络程序 一.Java NIO 1.1 NIO与传统IO对比 ...

  6. 黑马程序员——网络编程(二)--TCP网络程序、访问Internet网络资源

    -------  android培训.java培训.期待与您交流! ---------- 第一部分 TCP网络程序 一.TCP网络程序的工作原理 TCP客户端程序与TCP服务器程序的交互过程: (1) ...

  7. C#毕业设计——基于C#+asp.net+cs的CS应用程序平台多语种技术设计与实现(毕业论文+程序源码)——平台多语种技术

    基于C#+asp.net+cs的CS应用程序平台多语种技术设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于C#+asp.net+cs的CS应用程序平台多语种技术设计与实现,文章末尾附有本毕 ...

  8. 摘要: Nginx 网络多并发请求的TCP网络参数做简单说明。

    摘要: Nginx 网络多并发请求的TCP网络参数做简单说明. 需要修改/etc/sysctl.conf来更改内核参数 #原有字段 net.ipv4.tcp_syncookies = 1 #新增字段 ...

  9. c获取当前程序的路径_漏洞挖掘|使用AFL Fuzzing网络程序

    AFL基于代码插桩来生成测试用例,这样生成的样本就比较的好,而且针对 linux 做了许多性能优化使得速度也非常快. AFL(American Fuzzy Lop)是由安全研究员Michał Zale ...

最新文章

  1. Monthly update for Dynamics 365 for Operation
  2. elasticSearch6源码分析(1)启动过程
  3. linux sar 历史负载,查看负载、vmstat、top、sar以及nload命令
  4. java中的强制类型转换注意事项_浅谈Java中强制类型转换的问题
  5. 快速从mysqldump文件中恢复一个表
  6. Windows安装nginx服务
  7. 在ASP.NET中自动给URL加上超级链接
  8. oracle11数据库下载地址并安装使用
  9. 数据管理平台(DMP)简介
  10. Java虚拟机周志明Eason-zhang解读
  11. 算法成华纳旗下歌手?背景音乐经济
  12. 邮箱个性签名html模板,邮件个性签名大全_邮件的经典个性签名模板
  13. C#实现邮箱发送的多种方式
  14. 婴儿体重不用计算机怎么算,测量宝宝体重计算器
  15. usb设备检测linux,Linux下USB设备检测全教程(转)
  16. (转)银河麒麟V10sp1服务器系统安装redis不能使用的解决办法
  17. 机器人学基础--位形空间(二)
  18. poj 3666 Making the Grade zoj 3512 Financial Fraud 左偏树 or dp
  19. Java 反射6-动态代理模式
  20. java pdm 解析_GitHub - resgain/PDMParser: PDMParser是一个用来解析Powerdesigner pdm文件的一个简单工具...

热门文章

  1. lwip 开发 sntp 与 tcp 不能同时工作的奇怪问题
  2. axr_Lab1_scan_top_down_flow(下)
  3. Android4.0 修改系统屏幕分辨率方法
  4. 【预告】新房装修网络规划网络布局学习笔记,家庭网络需求文章内容及结构...
  5. FPGA篇(一) 基于verilog的定点开方运算(1)-逐次逼近算法
  6. 基于FPGA的图像增强系统的verilog开发(3000+字)
  7. AMDF换成ACF和AMDF合作算法
  8. nohup 命令(设置后台进程): appending output to ‘nohup.out’ 问题
  9. Winform开发几个常用的开发经验及知识积累(一)
  10. Hibernate之一级缓存和二级缓存