8.28网络编程作业

2023-11-11

TCP服务器端

#include<myhead.h>

#define ERR_MSG(msg) do{\
	fprintf(stderr, "__%d__:", __LINE__); \
	perror(msg);\
}while(0)

#define  PORT 8888      //端口号,范围1024~49151
#define IP  "192.168.114.71"



int main(int argc, const char *argv[])
{
	//创建流失套接字 scoket
	int sfd = socket(AF_INET, SOCK_STREAM, 0);
	if(sfd < 0)
	{
		ERR_MSG("socket");
		return -1;
	}
	printf("socket create success sfd=%d\n",sfd);

	//允许端口快速的被复用
	int reuse = -1;
	if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
	{
	    ERR_MSG("setsockopt");
		return -1;
	}
	printf("允许端口快速被复用\n");

	//填充地址信息结构体给bind函数绑定
	//真实的地址信息结构体根据地址族指定 AF_INET:man 7 ip
	struct sockaddr_in sin;
	sin.sin_family      = AF_INET;         //必须填AF_INET;
	sin.sin_port        = htons(PORT);    //端口号的网络字节序
	sin.sin_addr.s_addr = inet_addr(IP); //本机IP 


	//绑定服务器的地址信息---> 必须绑定 bind
	if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
	{
	    ERR_MSG("bind");
		return -1;
	}
	printf("bind success\n");


	//将套接字设置成被动监听状态 listen
	if(listen(sfd,128) < 0)
	{
	    ERR_MSG("listen");
		return -1;
	}
    printf("listen success\n");


	//获取一个已经完成的客户端信息,生成一个新的文件描述符 accept
    int newfd = -1;
	struct sockaddr_in cin;
	socklen_t addrlen = sizeof(cin);
	//newfd = accept(sfd, NULL, NULL);
	newfd = accept(sfd, (struct sockaddr*)&cin, &addrlen);
	if(newfd < 0)
	{
	    ERR_MSG("newfd");
		return -1;
	}
	printf("[%s:%d]客户端连接成功 newfd=%d\n",\
			inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd);
	
	char buf[128] = "";
	ssize_t res = 0;
	while(1)
	{
        bzero(buf,sizeof(buf));
	    //接收
        res = recv(newfd, buf, sizeof(buf), 0);
		if(res < 0)
		{
		    ERR_MSG("recv");
			return -1;
		}else if(0 == res)
		{
		    printf("[%s:%d]客户端下线 newfd=%d\n",\
					inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd);
			break;
		}
		printf("[%s:%d]客户端下线 newfd=%d : %s\n",\
					inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd, buf);


	    //发送
		strcat(buf,"*_*");
		if(send(newfd, buf, sizeof(buf), 0) < 0)
		{
		    ERR_MSG("send");
			return -1;
		}
		printf("send success\n");
	}


	//关闭文件描述符
	close(newfd);
	if(close(sfd) < 0 )
	{
	    ERR_MSG("close");
		return -1;
	}
	return 0;
}

TCP客户端

#include<myhead.h>


#define ERR_MSG(msg) do{\
    fprintf(stderr, "__%d__:", __LINE__);\
perror(msg);\
}while(0)

#define  PORT  8888                //服务器绑定的端口号
#define  IP    "192.168.114.71"    //服务器绑定的IP


int main(int argc, const char *argv[])
{
	//创建流失套接字 socket
	 int cfd = socket(AF_INET, SOCK_STREAM, 0);
	 if(cfd < 0)
	 {
	     ERR_MSG("socket");
		 return -1;
	 }
	 printf("socket create success cfd=%d\n", cfd);

	 //绑定客户端的地址信息--->非必须绑定
	 //当不手动绑定的时候,操作系统会自动给客户端绑定本机IP和随机端口


	 //填充服务器的地址信息结构体给connect函数连接,
	 //想连接哪个服务器,就填哪个服务器绑定的地址信息
	 //真实的地址信息结构体根据地址族指定 AF_INET:man 7 IP
	 struct sockaddr_in sin;
	 sin.sin_family      = AF_INEF;       //必须填AF_INET;
	 sin.sin_port        = htons(PORT);   //服务器绑定的端口号
	 sin.sin_addr.s_addr = inet_addr(IP); //服务器绑定的IP

	 //连接指定服务器 connect
	 if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
	 {
	     ERR_MSG("connect");
		 return -1;
	 }
	 printf("connect success\n");

	 char buf[128] = "";
	 ssize_t res = 0;
	 while(1)
	 {
	     //清空字符串
		 bzero(buf, sizeof(buf));
		 printf("请输入>>>");
		 fgets(buf, sizeof(buf), stdin);
		 buf[strlen(buf)-1] = 0;

		 //发送
		 if(send(cfd, buf, sizeof(buf), 0) < 0)
		 {
		     ERR_MSG("send");
			 return -1;
		 }
		 printf("send success\n");

		 bzero(buf,sizeof(buf));
		 //接收
		 res = recv(cfd, buf, sizeof(buf), 0);
		 if(res < 0)
		 {
		     ERR_MSG("recv");
			 return -1;
		 }else if(0 == res)
		 {
		     printf("服务器下线 cfd=%d\n",cfd);
			 break;
		 }
		 printf("cfd=%d : %s\n".cfd, buf);

	 }

	 //关闭文件描述名
	 if(close(cfd) < 0)
	 {
	     ERR_MSG("close");
		 return -1; 
	 }
	
	return 0;
}

UDP服务器端

#include<myhead.h>


#define ERR_MSG(msg)  do{\
    fprintf(stderr, "__%d__:", __LINE__);\
    perror(msg);\
}while(0)

#define PORT 8888            //服务器绑定的端口号
#define IP "192.168.114.71"  //服务器绑定的IP


int main(int argc, const char *argv[])
{
    //创建报式套接字 socket
	int sfd = socket(AF_INET, SOCK_DGRAM, 0);
	if(sfd < 0)
	{
	    ERR_MSG("socket");
		return -1;
	}
	printf("socket create success sfd=%d\n", sfd);

	//填充服务器的地址信息结构体,给bind函数使用
	//真实的地址信息结构体根据地址族指定,AF——INEF:man 7 IP
	struct sockaddr_in sin;
	sin.sin_family       = AF_INET;        //必须填AF_INET
	sin.sin_port         = htons(PORT);    //端口的网络字节序,1025~49151
	sin.sin_addr.s_addr  = inet_addr(IP);  //本机IP


	//绑定地址信息结构体---->bind
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0)
	{
	    ERR_MSG("bind");
		return -1;
	}
	printf("bind success\n");

	char buf[128] = "";
	struct sockaddr_in cin;        //存储发送方的地址信息;
	socklen_t addrlen = sizeof(cin);

	while(1)
	{
	    bzero(buf, sizeof(buf));
		//接收数据
		if(recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, &addrlen) < 0)
		{
		    ERR_MSG("recvfrom");
			return -1;
		}
		printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);

		//发送数据
		strcat(buf, "*_*");
		if(sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, sizeof(cin)) < 0)
		{
		    ERR_MSG("sendto");
			return -1;
		}
		printf("sendto success\n");

	}

	//关闭套接字
	close(sfd);


	return 0;
}

UDP客户端

#include<myhead.h>
 
#define PORT 7777            //服务器绑定的端口号
#define IP "192.168.115.23"  //服务器绑定的IP
 
 
int main(int argc, const char *argv[])
{
    //创建报式套接字 socket
	int sfd = socket(AF_INET, SOCK_DGRAM, 0);
	if(sfd < 0)
	{
	    ERR_MSG("socket");
		return -1;
	}
	printf("socket create success sfd=%d\n", sfd);
 
	//填充服务器的地址信息结构体,给bind函数使用
	//真实的地址信息结构体根据地址族指定,AF——INEF:man 7 IP
	 
	char buf[128] = "";
	struct sockaddr_in cin;        //存储发送方的地址信息;

 	cin.sin_family       = AF_INET;        //必须填AF_INET
	cin.sin_port         = htons(PORT);    //端口的网络字节序,1025~49151
	cin.sin_addr.s_addr  = inet_addr(IP);  //本机IP
	socklen_t addrlen = sizeof(cin);

	while(1)
	{
		//清空字符串
		bzero(buf, sizeof(buf));
		printf("请输入>>>");
		fgets(buf, sizeof(buf), stdin);
		buf[strlen(buf)-1] = 0;
 
     	//发送数据

		if(sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, sizeof(cin)) < 0)
		{
		    ERR_MSG("sendto");
			return -1;
		}
		printf("sendto success\n");
 
		//接收数据
		if(recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, &addrlen) < 0)
		{
		    ERR_MSG("recvfrom");
			return -1;
		}
		printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);
	}
 
	//关闭套接字
	close(sfd);
 
 
	return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

8.28网络编程作业 的相关文章

  • 如果文件名减去扩展名,.htaccess url 重写行为将被覆盖。与网址相同

    我正在尝试整理 URL 并从中删除 php 扩展名等 我位于网站的基本文件夹中 因此没有可以优先处理的父 htaccess 文件或其他文件 这是我的 htaccess 代码 RewriteEngine On RewriteRule give
  • PHPunit - 错误

    当 PHPunit 框架不希望发生的错误发生时 测试会停止 PHP 会抛出错误 但 PHPunit 不会记录这是一个错误 我如何确保 PHPunit 将其记录为错误 免责声明 我是 PHPUnit 的新手 我也试图弄清楚 发生错误时会发生什
  • MYSQL 的 Google OAuth 2.0 用户 ID 数据类型

    我正在实施 Google OAuth 2 0 并注意到 Google OAuth 返回的唯一用户 ID 是21位数字长的 我想大整数 20 足以满足这种需求 但我现在看到 Google OAuth 返回的用户 ID 的长度感到困惑 关于我应
  • 使用 md5 加密的 PHP 和 Mysql 查询出现问题

    我使用普通的 php mysql 插入查询并使用 md5 加密密码 这是插入查询 sql mysql query INSERT INTO user username password role approved values usernam
  • 压缩 zend Framework 2 的 html 输出

    我目前正在 PHP 5 4 4 上使用 Zend Framework 2 beta 开发个人 web 应用程序以用于自学目的 我想知道是否可以在 html 输出发送到浏览器之前拦截它 以便通过删除所有不必要的空格来缩小它 我怎样才能在ZF2
  • 私人聊天系统MYSQL查询显示发送者/接收者的最后一条消息

    在这里我延伸一下我之前的问题 私人聊天系统MYSQL查询ORDERBY和GROUPBY https stackoverflow com questions 10929366 private chat system mysql query o
  • php表格:每行显示3个单元格[重复]

    这个问题在这里已经有答案了 我看这里 数组放入每行 5 个单元格的表格中 https stackoverflow com questions 9099568 array into a table with 5 cells in each r
  • 重复使用相同的卷曲手柄。性能大幅提升?

    在 PHP 脚本中 我对不同的 URL 执行了许多不同的curl GET 请求 一百个 将重复使用来自curl init提高性能 还是与请求的响应时间相比可以忽略不计 我这么问是因为在当前的架构中保持相同的句柄并不容易 交叉发布自我应该关闭
  • 如何在MAMP中设置环境变量?

    如何在 MAMP 版本 3 3 中设置环境变量 我可以在我的 PHP 应用程序中使用它 我已经更新了 Applications MAMP Library bin envvars and envvars std file并添加以下行 Lice
  • Zend IMAP 搜索和过滤器

    我如何使用 Gmail 中的过滤器进行搜索 就像获取带有特定标签的电子邮件列表或来自特定电子邮件地址的邮件列表一样 我无法在文档中找到它 注意 我使用 oAuth 进行身份验证 我希望这与搜索无关 Gmail 上的标签实际上是 从 IMAP
  • 如何将 PHPMailer 与 Codeigniter 3 集成

    嗨 我正在尝试使用PHPMailer 库 https github com PHPMailer PHPMailer来自我的 Codeigniter 应用程序中的 GitHub 我下载了代码并解压到我的application library文
  • strlen()==0 和empty()之间有区别吗?

    我正在查看其他人编写的一些表单验证代码 我看到了这个 strlen 0 当测试表单变量是否为空时 我使用empty 功能 一种方法比另一种方法更好吗 它们在功能上等效吗 strlen是获取字符串中的字符数 同时empty用于测试变量是否为空
  • php - 我应该加密电子邮件地址吗?

    当用户注册时 我应该将他们的电子邮件按原样存储在数据库中还是对其进行哈希处理 我希望稍后能够解密 那么我应该使用 md5 吗 谢谢你 No md5 is 单向哈希函数 http en wikipedia org wiki Cryptogra
  • Laravel 广播:通知与事件

    我阅读了 laravel 文档Events and Notifications 似乎我们可以触发一个事件 并从该事件中触发 使用ShouldBroadcast接口 将其广播到我理解的 laravel echo 另一方面我们可以使用通知via
  • PHP 中的 Preg_replace

    我想替换 中包含的字符串中的内容content 它是多行等 preg replace 函数应该删除整个 com 没有垫子 蒙特 尝试这个 result preg replace s replacement content subject
  • 如何用javascript正确读取php cookies

    考虑这个 php 和 javascript 代码 然后我在控制台中看到的是 utma 111872281 291759993 1444771465 1445374822 1445436904 4 utmz 111872281 1444771
  • 如何在没有引用的情况下复制对象?

    PHP5 OOP 有据可查对象通过引用传递 http php net manual en language oop5 references php默认情况下 如果这是默认的 在我看来 有一种非默认的方式可以在没有参考的情况下进行复制 如何
  • mysqli bind_param 中的 NULL 是什么类型?

    我正在尝试将参数绑定到 INSERT INTO MySQLi 准备好的语句 如果该变量存在 否则插入 null 然后我知道 type variable i corresponding variable has type integer d
  • PHP cURL 在本地工作,在 AWS 服务器上出现错误 77

    最新更新 脚本作为管理员用户通过 SSH shell 作为 php script php 成功运行 当由 nginx 用户运行时 curl 命令无法执行 https 请求 所以我猜测这是nginx用户无法正确使用curl的问题 我已经检查了
  • PHP 和 NLP:嵌套括号(解析器输出)到数组?

    想要将带有嵌套括号的文本转换为嵌套数组 以下是 NLP 解析器的输出示例 TOP S NP PRP I VP VBP love NP NP DT a JJ big NN bed PP IN of NP NNS roses 原文 我喜欢一大床

随机推荐

  • 父类A a = new 子类B

    父类名 a new 子类名 子类名 b new 子类名 比较上面两种创建实例的区别 a只能调用父类的函数 和子类重写父类的方法 不能调用父类中不存在的子类的函数 因为它没有继承 a是父类的引用 指向了一个子类对象 好处如果一旦发现该B对象无
  • Jetson Orin NX install Fastdeploy

    FastDeploy jetson md at develop PaddlePaddle FastDeploy GitHub sudo apt get install gcc sudo apt get install cmake git c
  • postman-token的作用

    Postman生成的代码中的postman token是什么 What is the postman token in generated code from Postman 这主要用于绕过Chrome 等其他浏览器 中的错误 如果XMLH
  • QEMU/KVM PCI Passthrough(i350) & DPDK 网络性能测试

    QEMU KVM PCI Passthrough i350 DPDK 网络性能测试 硬件要求 CPU必须支持硬件虚拟化 Intel VT d or AMD Vi 和 IOMMU 原图链接 主机配置 设置iommu IOMMU kernel
  • kmp算法(最简单最直观的理解,看完包会)

    本文将以特殊的方式来让人们更好地理解kmp算法 不包括kmp算法的推导 接下来 我们将从朴素算法出发 在这之前 我们先设主串为S 模式串为T 我们要解决的询问是主串中是否包含模式串 即T是否为S的子串 版权声明 本文为原创文章 转载请标明出
  • c++ 继承 学习总结1 继承的基本语法

    前言 继承的作用是减少程序中重复的代码段 如果程序中有很多重复的代码段 可以考虑一下能否使用继承 继承的语法 class 子类 继承方式 父类 include
  • 特征提取-特征工程

    目录 1 定义 2 字典特征提取 3 英文 本特征提取 4 中文 本特征提取 1 定义 将任意数据 如 本或图像 转换为可 于机器学习的数字特征 2 字典特征提取 from sklearn feature extraction import
  • 【算法】树状数组维护总结

    本文仅对树状数组的使用作一个总结 并非讲解 这里的操作都对长度为 n n n 的数组 a a a 进行操作 单点修改 区间查询 暴力做法 修改
  • java使用原始套接字技术进行数据包截获_Linux零拷贝技术,看完这篇文章就懂了...

    本文讲解 Linux 的零拷贝技术 云计算是一门很庞大的技术学科 融合了很多技术 Linux 算是比较基础的技术 所以 学好 Linux 对于云计算的学习会有比较大的帮助 本文借鉴并总结了几种比较常见的 Linux 下的零拷贝技术 相关的引
  • python的pyecharts绘制各种图表详细(代码)

    环境 pyecharts库 echarts countries pypkg echarts china provinces pypkg echarts china cities pypkg 数据 2018年4月16号的全国各地最高最低和天气
  • 5.5js

    1 JavaScript简介 什么是JavaScript JavaScript 是 种客户端脚本语 脚本语 是 种轻量级的编程语 JavaScript 通常被直接嵌 HTML 由浏览器解释执 JavaScript 是 种解释性语 就是说 代
  • Deepin 手动分区记录

    起初安装Deepin 采用手动分区 总是安装失败 经过以下分区就成功安装了 efi 分区 默认300m boot 分区 默认 512m 交换分区 swap 等于你的内存大小 分区 15G home 分区剩余全部容量 home可以设置也可以不
  • brpc组件bvar源码解析(三)Variable、Reducer和Adder

    1 Variable类 Variable是所有bvar的基类 是一个纯虚类 拥有的唯一的成员变量是 name Variable类中的接口分为几类 描述相关的 子类实现纯虚函数describe 目的是将bvar的值写入ostream get
  • 验证码倒计时

    获取验证码倒计时 return second 120 getCodeFn let flag true if this user phone this http isPhone this user phone false this http
  • 斐讯 K2 路由器 无线中继 无线扩展设置教程图文

    斐讯 K2 路由器无线扩展设置教程 1 连接上k2路由器无线网络 2 登录k2路由器管理页面 192 168 2 1 3 上网设置 4 无线设置 5 设置k2无线扩展功能 6 选择主路由器无线网络 7 设置无线网络信息wifi名称 wifi
  • 详解redis的哨兵模式(1)

    目录 1 背景 2 实现过程 2 1 初始化服务器 2 2 将普通Redis服务器使用的代码替换成Sentinel专用代码 2 3初始化Sentinel状态 2 4初始化sentinel状态的masters属性 2 5创建连向主服务器的网络
  • 视频重编码为h265重新封装MP4并截断

    MP4 重编码重封装 分辨率和编码格式 转为h265 调整 XFormat h pragma once include
  • 抽象工厂模式-Abstract Factory Pattern

    抽象工厂模式 Abstract Factory Pattern 抽象工厂模式 Abstract Factory Pattern 提供一个创建一系列相关或相互依赖对象的接口 而无须指定它们具体的类 抽象工厂模式又称为Kit模式 它是一种对象创
  • SQL Server为数据表增加列(字段)的SQL语句

    下面是一个示例 ALTER TABLE TableName ADD NewField DECIMAL 18 2 NOT NULL DEFAULT 0 上面的代码为 TableName 表增加了一个名为 NewField 的列 字段 其数据类
  • 8.28网络编程作业

    TCP服务器端 include