任务目标:基于TCP,实现echo服务器和客户端
任务描述:实现echo客户端,即通过命令行输入任何字符串,等回车后发送给服务器。发送的部分要包括换行符。然后等待服务器响应,回送部分的结束也以换行符为标志。当收到换行符结束receive,并打印之。
服务器端程序:收到换行符之后将收到的字符串原样返回给客户端,并包括换行符作为结束
任务要求:
不要动态分配内存;用指针操纵接收的数据,考虑buf有限的问题;考虑客户端和服务器端谁先关闭的问题;尽量形成多个函数。
服务器端

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;#define BUF_SIZE 10    //最大接收数
#define PORT 9190
void RecvMsg(SOCKET);
void SendMsg(SOCKET);
int main(int argc, char* argv[])
{WSADATA wasdata;SOCKET ServSock, ClntSock;char message[BUF_SIZE];          //数据缓冲区SOCKADDR_IN servAdr, clntAdr;int strlen, clntAdrSize;if (WSAStartup(MAKEWORD(2, 2), &wasdata)){cout << "加载动态winsock.dll失败!";exit(1);}ServSock = socket(AF_INET, SOCK_STREAM, 0);if (ServSock == INVALID_SOCKET){cout << "创建套接字失败!";exit(1);}memset(&servAdr, 0, sizeof(servAdr));servAdr.sin_family = AF_INET;servAdr.sin_addr.s_addr = htonl(INADDR_ANY);servAdr.sin_port = htons(PORT);if (bind(ServSock, (SOCKADDR*)&servAdr, sizeof(servAdr)) == SOCKET_ERROR){cout << "绑定套接字失败! ";exit(1);}if (listen(ServSock, 5) == SOCKET_ERROR){cout << "监听套接字失败!";exit(1);}//cout << "ip: " << inet_ntoa(servAdr.sin_addr) << endl;clntAdrSize = sizeof(clntAdr);for (int i = 0; i < 5; i++){ClntSock = accept(ServSock, (SOCKADDR*)&clntAdr, &clntAdrSize);if (ClntSock == -1){cout << "接收失败!";exit(1);}elsecout << "Connected client......" << i + 1 << endl;while ((strlen = recv(ClntSock, message, BUF_SIZE - 1, 0)) != 0)send(ClntSock, message, strlen, 0);closesocket(ClntSock);cout << "退出连接" << endl;}closesocket(ServSock);WSACleanup();return 0;
}

客户端

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
#define BUF_SIZE 1024
char message[BUF_SIZE];
int SendMsg(SOCKET);
void RecvMsg(SOCKET, int);int main(int argc, char* argv[])
{WSADATA wsadata;SOCKET hSock;int str_len, recv_len, recv_cnt;SOCKADDR_IN servAdr;if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0){cout << "加载winsock.dll失败!" << endl;exit(1);}hSock = socket(AF_INET, SOCK_STREAM, 0);if (hSock == INVALID_SOCKET){cout << "创建套接字失败!" << endl;exit(1);}memset(&servAdr, 0, sizeof(servAdr));servAdr.sin_family = AF_INET;servAdr.sin_addr.s_addr = inet_addr("192.168.56.1");servAdr.sin_port = htons(9190);if (connect(hSock, (SOCKADDR*)&servAdr, sizeof(servAdr)) == SOCKET_ERROR){cout << "连接失败!" << endl;exit(1);}elsecout << "Connected......" << endl;while (1){memset(message, 0, BUF_SIZE);fputs("请输入要发送的信息[Q ot quit]:", stdout);fgets(message, BUF_SIZE, stdin);if (!strcmp(message, "q\n") || !strcmp(message, "Q\n"))break;str_len = SendMsg(hSock);RecvMsg(hSock, str_len);cout << "来自服务器端的消息是:" << message << endl;}closesocket(hSock);WSACleanup();return 0;
}int SendMsg(SOCKET Sock)
{SOCKET hSock = Sock;int str_len;str_len = send(hSock, message, strlen(message), 0);      //传输的数据长度,在echo客户端内已知return str_len;
}void RecvMsg(SOCKET Sock, int str_len)
{SOCKET hSock = Sock;int recv_len, recv_cnt;recv_len = 0;while (recv_len < str_len){recv_cnt = recv(hSock, &message[recv_len], BUF_SIZE - 1, 0);if (recv_cnt == -1)cout << "接收失败!" << endl;recv_len += recv_cnt;}message[recv_len] = 0;
}

网络编程之重构echo服务器相关推荐

  1. Python网络编程--Echo服务

    Python网络编程--Echo服务 学习网络编程必须要练习的三个小项目就是Echo服务,Chat服务和Proxy服务.在接下来的几篇文章会详细介绍. 今天就来介绍Echo服务,Echo服务是最基本的 ...

  2. Boost:以协程的方式实现重构echo服务器的实例

    Boost:以协程的方式实现重构echo服务器的实例 实现功能 C++实现代码 实现功能 boost::asio模块,以协程的方式实现重构echo服务器的实例 C++实现代码 #include < ...

  3. Qt网络编程实战之HTTP服务器-安晓辉-专题视频课程

    Qt网络编程实战之HTTP服务器-30196人已学习 课程介绍         设计了一个实用的HTTP服务器,基于Qt的网络框架实现.先详细介绍Qt的网络.IO.线程..自定义事件.配置文件等类库的 ...

  4. C++socket网络编程大全实战http服务器(支持php)视频课程-夏曹俊-专题视频课程

    C++socket网络编程大全实战http服务器(支持php)视频课程-16782人已学习 课程介绍         C++socket网络编程大全实战http服务器(支持php)视频培训教程概况:本 ...

  5. python学习(九) 网络编程学习--简易网站服务器

    python `网络编程`和其他语言都是一样的,服务器这块步骤为: `1. 创建套接字` `2. 绑定地址` `3. 监听该描述符的所有请求` `4. 有新的请求到了调用accept处理请求` Pyt ...

  6. python网络平台_python学习(九) 网络编程学习--简易网站服务器

    python `网络编程`和其他语言都是一样的,服务器这块步骤为: `1. 创建套接字` `2. 绑定地址` `3. 监听该描述符的所有请求` `4. 有新的请求到了调用accept处理请求` Pyt ...

  7. 【Java——网络编程基础之客户端服务器连接】

    网络编程 1.1软件结构 1.2 网络通信协议 1.3 协议分类 1.4网络编程三要素 协议 IP地址 端口号 TCP通信程序 2.1 概述 2.2 Socket类 构造方法 成员方法 2.3 Ser ...

  8. 网络编程_HTTP协议_Web服务器_(TCP3次握手4次挥手,长短连接,伪静态、静态和动态)

    Python高级语法--网络编程--进阶学习笔记 文中案例参考: https://github.com/FangbaiZhang/Python_advanced_learning/tree/maste ...

  9. Linux学习——网络编程基础及TCP服务器

    目录 一.网络采用分层的思想: 二.各层典型的协议: 三.网络的封包和拆包: 四.网络编程的预备知识 4.1.SOCKET 4.2 IP地址 4.3 端口号 4.4 字节序 五.TCP编程API TC ...

最新文章

  1. linux tee 命令 输出的同时写入文件
  2. 微信拦截URL,使用自己内置的web组件打开URL,为什么没人声讨?
  3. ASP.NET 3.5 新特性开发向导实践(附项目源码下载)
  4. redhat配置dns服务器bind
  5. 【算法】Floyd-Warshall算法(任意两点间的最短路问题)(判断负圈)
  6. 测试用例怎么写_如何高效组织自动化测试用例
  7. 软件毕业设计文档流程与UML图之间的关系
  8. java 顶点着色_Shader笔记_002简单顶点/片元着色器扩展
  9. 南京师范大学计算机科学与技术复试名单,2018年各学院硕士研究生复试办法及复试名单公示网址汇总表...
  10. JavaScript HTML5脚本编程——“原生拖放”的注意要点
  11. java restlet 教程_Restlet 2.0 边学边写(五)Restlet的POST、PUT和DELETE
  12. 《高性能MySQL》读书笔记
  13. Redhat Enterprise Linux磁带机简单操作
  14. 微信公众号测试号申请
  15. 科学计算机怎么用分号,350ms82ms科学计算器使用方法.docx
  16. ictclas4j java_ictclas4j 分词工具包 安装流程
  17. 登录SSH/winSCP一直显示密码错误
  18. 美国VPS服务器选择贴士
  19. NOIP2018D1T3赛道修建
  20. 简单漫画读懂联邦学习

热门文章

  1. OpenSSL 生成服务器及客户端证书
  2. basler相机采集程序
  3. python练习实例——芯片测试
  4. SAP 上传excel模板到系统
  5. k8s pod网络限速
  6. Function echartR with package recharts
  7. Django开发网页计数器统计页面浏览次数
  8. ITIL Foundation笔记(摘录)
  9. G-LAB课程 | ITIL认证培训走起
  10. ctf第二篇——give you flag(图片隐写)