网络编程之重构echo服务器
任务目标:基于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服务器相关推荐
- Python网络编程--Echo服务
Python网络编程--Echo服务 学习网络编程必须要练习的三个小项目就是Echo服务,Chat服务和Proxy服务.在接下来的几篇文章会详细介绍. 今天就来介绍Echo服务,Echo服务是最基本的 ...
- Boost:以协程的方式实现重构echo服务器的实例
Boost:以协程的方式实现重构echo服务器的实例 实现功能 C++实现代码 实现功能 boost::asio模块,以协程的方式实现重构echo服务器的实例 C++实现代码 #include < ...
- Qt网络编程实战之HTTP服务器-安晓辉-专题视频课程
Qt网络编程实战之HTTP服务器-30196人已学习 课程介绍 设计了一个实用的HTTP服务器,基于Qt的网络框架实现.先详细介绍Qt的网络.IO.线程..自定义事件.配置文件等类库的 ...
- C++socket网络编程大全实战http服务器(支持php)视频课程-夏曹俊-专题视频课程
C++socket网络编程大全实战http服务器(支持php)视频课程-16782人已学习 课程介绍 C++socket网络编程大全实战http服务器(支持php)视频培训教程概况:本 ...
- python学习(九) 网络编程学习--简易网站服务器
python `网络编程`和其他语言都是一样的,服务器这块步骤为: `1. 创建套接字` `2. 绑定地址` `3. 监听该描述符的所有请求` `4. 有新的请求到了调用accept处理请求` Pyt ...
- python网络平台_python学习(九) 网络编程学习--简易网站服务器
python `网络编程`和其他语言都是一样的,服务器这块步骤为: `1. 创建套接字` `2. 绑定地址` `3. 监听该描述符的所有请求` `4. 有新的请求到了调用accept处理请求` Pyt ...
- 【Java——网络编程基础之客户端服务器连接】
网络编程 1.1软件结构 1.2 网络通信协议 1.3 协议分类 1.4网络编程三要素 协议 IP地址 端口号 TCP通信程序 2.1 概述 2.2 Socket类 构造方法 成员方法 2.3 Ser ...
- 网络编程_HTTP协议_Web服务器_(TCP3次握手4次挥手,长短连接,伪静态、静态和动态)
Python高级语法--网络编程--进阶学习笔记 文中案例参考: https://github.com/FangbaiZhang/Python_advanced_learning/tree/maste ...
- Linux学习——网络编程基础及TCP服务器
目录 一.网络采用分层的思想: 二.各层典型的协议: 三.网络的封包和拆包: 四.网络编程的预备知识 4.1.SOCKET 4.2 IP地址 4.3 端口号 4.4 字节序 五.TCP编程API TC ...
最新文章
- linux tee 命令 输出的同时写入文件
- 微信拦截URL,使用自己内置的web组件打开URL,为什么没人声讨?
- ASP.NET 3.5 新特性开发向导实践(附项目源码下载)
- redhat配置dns服务器bind
- 【算法】Floyd-Warshall算法(任意两点间的最短路问题)(判断负圈)
- 测试用例怎么写_如何高效组织自动化测试用例
- 软件毕业设计文档流程与UML图之间的关系
- java 顶点着色_Shader笔记_002简单顶点/片元着色器扩展
- 南京师范大学计算机科学与技术复试名单,2018年各学院硕士研究生复试办法及复试名单公示网址汇总表...
- JavaScript HTML5脚本编程——“原生拖放”的注意要点
- java restlet 教程_Restlet 2.0 边学边写(五)Restlet的POST、PUT和DELETE
- 《高性能MySQL》读书笔记
- Redhat Enterprise Linux磁带机简单操作
- 微信公众号测试号申请
- 科学计算机怎么用分号,350ms82ms科学计算器使用方法.docx
- ictclas4j java_ictclas4j 分词工具包 安装流程
- 登录SSH/winSCP一直显示密码错误
- 美国VPS服务器选择贴士
- NOIP2018D1T3赛道修建
- 简单漫画读懂联邦学习