网络编程第二天

1.基于TCP的通信(面向连接的通信)

服务器代码实现:

#include <myhead.h>
#define IP "192.168.126.91"
#define PORT 9999
int main(int argc, const char *argv[])
{
	//1、创建套接字
	int sfd=-1;
	if((sfd=socket(AF_INET,SOCK_STREAM,0))==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("sfd=%d\n",sfd);

	//2、绑定
    //将服务器的地址信息结构体绑定到sfd文件描述符中
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(PORT);
	sin.sin_addr.s_addr=inet_addr(IP);
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
	{
		perror("bind error");
		return -1;
	}

	//设置监听
	if(listen(sfd,128)==-1)
	{
		perror("listen error");
		return -1;
	}

	//accept连接
    //创建连接之后的客户端地址信息结构体
	struct sockaddr_in cin;
	socklen_t socklen=sizeof(cin);
	int newfd=accept(sfd,(struct sockaddr*)&cin,&socklen);
	if(newfd==-1)
	{
		perror("accept error");
		return -1;
	}
	printf("[%s:%d]连接成功\n",inet_ntoa(cin.sin_addr)\
				,ntohs(cin.sin_port));

	//进行数据的收发
	char rbuf[128]="";
	while(1)
	{
        //接收客户端的消息
		bzero(rbuf,sizeof(rbuf));
		int res=recv(newfd,rbuf,sizeof(rbuf),0);
		if(res==0||strcmp(rbuf,"quit")==0)
		{
			printf("客户端下线\n");
			break;
		}
		printf("[%s:%d]:发送的消息为%s\n",inet_ntoa(cin.sin_addr)\
				,ntohs(cin.sin_port),rbuf);
        
        //发送消息到客户端
		strcat(rbuf,"*_*");
		send(newfd,rbuf,sizeof(rbuf),0);
	}

    //关闭文件描述符
	close(sfd);
	close(newfd);


	return 0;
}

客户端的代码实现:

#include <myhead.h>
#define IP "192.168.126.91"
#define PORT 9999
int main(int argc, const char *argv[])
{
	int cfd=-1;
	if((cfd=socket(AF_INET,SOCK_STREAM,0))==-1)
	{
		perror("socket error");
		return -1;
	}
	
	//连接服务器
	struct sockaddr_in cin;
	cin.sin_family=AF_INET;
	cin.sin_port=htons(PORT);
	cin.sin_addr.s_addr=inet_addr(IP);
	if(connect(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1)
	{
		perror("connect error");
		return -1;
	}

	char wbuf[128]="";
	while(1)
	{
		bzero(wbuf,sizeof(wbuf));
		printf("请输入>>>");
		fgets(wbuf,sizeof(wbuf),stdin);
		wbuf[strlen(wbuf)-1]=0;
		send(cfd,wbuf,strlen(wbuf),0);
		if(strcmp("quit",wbuf)==0)
		{
			printf("客户端下线\n");
			break;
		}

		//接收的数据
		bzero(wbuf,sizeof(wbuf));
		recv(cfd,wbuf,sizeof(wbuf),0);
		printf("收到的消息是:%s\n",wbuf);
	}
	return 0;
}

运行结果:

2.基于UDP的通信(面向无连接的通信)

服务器端代码实现:

#include <myhead.h>
#define PORT 3333
#define IP "192.168.126.91"
int main(int argc, const char *argv[])
{
	//创建套接字
	int sfd=-1;
	if((sfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("sfd=%d\n",sfd);

	//绑定端口号和ip
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(PORT);
	sin.sin_addr.s_addr=inet_addr(IP);
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
	{
		perror("bind error");
		return -1;
	}

	//创建对端地址信息结构体
	struct sockaddr_in cin;
	socklen_t socklen=sizeof(cin);
	char rbuf[128]="";
	while(1)
	{
		bzero(rbuf,sizeof(rbuf));
		if(recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cin,&socklen)==-1)
		{
			perror("recvfrom error");
			return -1;
		}
		if(strcmp(rbuf,"quit")==0)
		{
			printf("客户端下线\n");
			break;
		}
		printf("收到的消息是:%s\n",rbuf);

		//给客户端回一个消息
		//bzero(rbuf,sizeof(rbuf));
		strcat(rbuf,"*_*");
		if(sendto(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cin,socklen)==-1)
		{
			perror("sendto error");
			return -1;
		}	
	}
	close(sfd);

	return 0;
}

客户端代码实现:

#include <myhead.h>
#define PORT 3333
#define IP "192.168.126.91"
int main(int argc, const char *argv[])
{
	//创建套接字
	int cfd=-1;
	if((cfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("cfd=%d\n",cfd);


	//创建对端地址信息结构体
	struct sockaddr_in cin;
	cin.sin_family=AF_INET;
	cin.sin_port=htons(PORT);
	cin.sin_addr.s_addr=inet_addr(IP);
	socklen_t socklen=sizeof(cin);
	char wbuf[128]="";
	while(1)
	{
		bzero(wbuf,sizeof(wbuf));
		printf("请输入>>>");
		fgets(wbuf,sizeof(wbuf),stdin);
		wbuf[strlen(wbuf)-1]=0;
		if(sendto(cfd,wbuf,sizeof(wbuf),0,(struct sockaddr*)&cin,socklen)==-1)
		{
			perror("sendto error");
			return -1;
		}
		if(strcmp(wbuf,"quit")==0)
		{
			printf("客户端下线\n");
			break;
		}
		bzero(wbuf,sizeof(wbuf));
		if(recvfrom(cfd,wbuf,sizeof(wbuf),0,(struct sockaddr*)&cin,&socklen)==-1)
		{
			perror("recvfrom error");
			return -1;
		}

		printf("收到服务器的消息为%s\n",wbuf);
	}
	close(cfd);

	return 0;
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/417004.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python学习DAY09_文件和异常

文件和异常 实际开发中常常会遇到对数据进行持久化操作的场景&#xff0c;而实现数据持久化最直接简单的方式就是将数据保存到文件中。 在 Python 中实现文件的读写操作其实非常简单&#xff0c;通过 Python 内置的 open 函数&#xff0c;我们可以指定文件名、操作模式、编码信…

定时任务调动框架Quartz+SpringBoot集成

Quartz 是一个基于 Java 的广泛使用的开源的任务调度框架 官网&#xff1a; http://www.quartz-scheduler.org/ 源码&#xff1a; https://github.com/quartz-scheduler/quartz 整个 Quartz 的代码流程基本基本如下&#xff1a; 1、首先需要创建我们的任务(Job)&#xff0c…

【重要公告】BSV区块链协会宣布将启动多项动态安全增强措施

​​发表时间&#xff1a;2024年2月16日 2024年2月16日&#xff0c;瑞士楚格 - BSV区块链协议的管理机构BSV区块链协会&#xff08;以下简称“BSV协会”&#xff09;宣布对其运营模式实施全新的安全架构&#xff0c;其中包括引入网络访问规则和数字资产找回协议&#xff0c;以及…

【Go语言】Go语言中的字典

Go语言中的字典 字典就是存储键值对映射关系的集合&#xff0c;在Go语言中&#xff0c;需要在声明时指定键和值的类型&#xff0c;此外Go语言中的字典是个无序集合&#xff0c;底层不会按照元素添加顺序维护元素的存储顺序。 如下所示&#xff0c;Go语言中字典的简单示例&…

Linux系统Docker部署Nexus Maven并实现远程访问本地管理界面

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具&#xff0c;用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关&#xff0c;可…

如果大数据中多头借贷风险严重怎么办呢?

在大数据报告中&#xff0c;多头借贷风险、逾期风险、联系人风险、司法风险等是大数据评分评级的重要组成部分&#xff0c;大数据多头借贷风险也是很多银行和金融平台比较看重的&#xff0c;那如果大数据中多头借贷风险严重怎么办呢?本文详细为大家讲讲。 大数据多头风险是什么…

Niginx介绍和安装使用

Nginx是什么&#xff1f; Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一…

代码随想录算法训练营第二十一天|530.二叉搜索树的最小绝对差、 501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差 题目链接/文章讲解&#xff1a; 代码随想录 视频讲解&#xff1a;二叉搜索树中&#xff0c;需要掌握如何双指针遍历&#xff01;| LeetCode&#xff1a;530.二叉搜索树的最小绝对差_哔哩哔哩_bilibili 1.方法1 1.1分析及思路 了解到差值最小的数…

DevEco Studio下载与安装(Windows)

下载地址&#xff1a; HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 安装时直接点击 next 即可。 运⾏已安装的DevEco Studio&#xff0c;⾸次使⽤&#xff0c;请选择Do not import settings&#xff0c;单击OK。 1.安装Node.js 如果本地有下载&#xff0c;可以…

C程序的编译过程

目录 一、GCC编译器 二、编译过程 1、预处理&#xff08;Preprocessing&#xff09; 2、编译&#xff08;Compilation&#xff09; 3、汇编&#xff08;Assembly&#xff09; 4、链接&#xff08;Linking&#xff09; 三、秋招真题演练 一、GCC编译器 在这里&#xf…

linux系统Jenkins工具web配置

Jenkins工具配置 插件配置系统配置系统工具配置 插件配置 下载 Maven Integration Pipeline Maven lntegration gitlab Generic webhook Trigger nodejs Blue ocean系统配置 系统配置结束系统工具配置

androidframework开发面试,阿里P8成长路线

字节跳动Android面经 一面问的 Java 和 Android 基础 1、Jvm虚拟机 2、messageQueue会不会阻塞ui线程 3、对象锁和类锁 4、之字形打印树 5、还有其他的 《Android学习笔记总结最新移动架构视频大厂安卓面试真题项目实战源码讲义》 **完整开源项目&#xff1a;docs.qq.com/doc…

Linux命名管道

Linux匿名管道-CSDN博客 目录 1.原理 2.接口实现 3.模拟日志 Linux匿名管道-CSDN博客 这上面叫的是匿名管道&#xff0c;不要将两者搞混&#xff0c;匿名管道说的是两个有血缘关系的进程相互通信&#xff0c;但是命名管道就是两个没有关系的管道相互通信。 1.原理 和匿名…

解密犯罪时间 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 警察在侦破一个案件时&#xff0c;得到了线人给出的可能犯罪时间&#xff0c;形如 HH:MM 表示的时刻。 根据警察和线人的约定&#xff0c;为了隐蔽&#xff0c;该…

RabbitMQ实战学习

RabbitMQ实战学习 文章目录 RabbitMQ实战学习RabbitMQ常用资料1、安装教程2、使用安装包3、常用命令4、验证访问5、代码示例 一、RabbitMQ基本概念1.1. MQ概述1.2 MQ 的优势和劣势1.3 MQ 的优势1. 应用解耦2. 异步提速3. 削峰填谷 1.4 MQ 的劣势1.5 RabbitMQ 基础架构1.6 JMS 二…

图形系统开发实战课程:进阶篇(上)——8.图形样式

图形开发学院&#xff5c;GraphAnyWhere 课程名称&#xff1a;图形系统开发实战课程&#xff1a;进阶篇(上)课程章节&#xff1a;“图形样式”原文地址&#xff1a;https://www.graphanywhere.com/graph/advanced/2-8.html 第八章 图形样式 1. 填充和描边 \quad 在图形系统实战…

vision mamba 运行训练记录,解决bimamba_type错误

下载vision mamba github上的项目后&#xff0c;解压&#xff0c;进入文件夹项目&#xff0c;然后配环境 unzip Vim-main.zip cd Vim-mainconda create -n mamba python3.10.13conda activate mamba pip install torch2.1.1 torchvision0.16.1 torchaudio2.1.1 --index-url ht…

java面试(网络)

TCP和UDP有什么区别&#xff1f;TCP三次握手不是两次&#xff1f; TCP&#xff1a;面向连接&#xff0c;可靠的&#xff0c;传输层通信协议。点对点&#xff0c;占用资源多&#xff0c;效率低。 UDP&#xff1a;无连接&#xff0c;不可靠&#xff0c;传输层通信协议。广播&…

照片中不想要的部分怎么去除?教你几个小妙招

照片在我们的生活中占据着无可替代的地位。它们是我们生活的缩影&#xff0c;定格住我们的瞬间&#xff0c;记录着我们的记忆&#xff0c;让我们可以随时随地回顾过去的美好时光。无论是家庭聚会、旅行、婚礼还是其他重要的场合&#xff0c;我们都会用照片来捕捉这些珍贵的时刻…

springboot 实现本地文件存储

springboot 实现本地文件存储 实现过程 上传文件保存文件&#xff08;本地磁盘&#xff09;返回文件HTTP访问服务器路径给前端&#xff0c;进行效果展示 存储 服务端接收上传的目的是提供文件的访问服务&#xff0c;对于SpringBoot而言&#xff0c;其对静态资源访问提供了很…