网络编程day02(socket套接字)

news2024/11/27 11:31:25

今日任务:

TCP\UDP服务端客户端通信

TCP:代码

服务端:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

//自定义报错提示
#define ERR_MSG(msg) do{\
		fprintf(stderr,"__%d__",__LINE__);\
		perror(msg);\
}while(0)
#define SER_PORT 8888
#define SER_IP "192.168.125.2"
/*
 * function:    TCP服务端
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int main(int argc, const char *argv[])
{
	//1.创建socket套接字,
	int sfd=socket(AF_INET,SOCK_STREAM,0);
	if(sfd<0){
		ERR_MSG("socket");
		return -1;
	}
	puts("socket create");

	//允许端口快速复用
	int reuse = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }
    printf("允许端口快速复用成功\n");
	//2.绑定服务器IP和端口号bind
	struct sockaddr_in addr;
	addr.sin_family=AF_INET;
	addr.sin_port=htons(SER_PORT);
	addr.sin_addr.s_addr=inet_addr(SER_IP);
	if(bind(sfd,(struct sockaddr*)&addr,sizeof(addr))<0){
		ERR_MSG("bind");
		return -1;
	}
	puts("bind success");


	//3.建立监听listen
	if(listen(sfd,128)<0){
		ERR_MSG("listen");
		return -1;
	}
	puts("listen suucess");
	//4.等待客户端连接, accept
	struct sockaddr_in cli_addr;
	socklen_t cli_addrlen=sizeof(cli_addr);
	
	int cfd=accept(sfd,(struct sockaddr*)&cli_addr,&cli_addrlen);
	if(cfd<0){
		ERR_MSG("accept");
		return -1;
	}
	puts("accept");

	//5.接受发送消息recv;send
	char buf[128];
	while(1){
		bzero(buf,sizeof(buf));
		int recv_res=recv(cfd,buf,sizeof(buf),0);

		if(recv_res<0){
			ERR_MSG("recv");
			return -1;
		}else if(recv_res==0){
			printf("socket peer has shutdown\n");
			break;
		}
		puts("recv success");
		printf("[%s:%d]:%s\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port),buf);
		if(strcmp(buf,"quit")==0)
			break;

		strcat(buf,"-----i has received");
		int send_res=send(cfd,buf,sizeof(buf),0);
		if(send_res<0){
			ERR_MSG("send");
			return -1;
		}
		puts("send success");
	}
	
	//6.关闭
	close(cfd);
	close(sfd);
	
	return 0;
}

客户端

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

//自定义报错提示
#define ERR_MSG(msg) do{\
		fprintf(stderr,"__%d__",__LINE__);\
		perror(msg);\
}while(0)
#define SER_PORT 8888
#define SER_IP "192.168.125.2"
/*
 * function:    TCP客户端
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int main(int argc, const char *argv[])
{
	//1.创建socket套接字,
	int cfd=socket(AF_INET,SOCK_STREAM,0);
	if(cfd<0){
		ERR_MSG("socket");
		return -1;
	}
	puts("socket create");

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

	//2.连接服务端connect
	struct sockaddr_in addr;
	addr.sin_family=AF_INET;
	addr.sin_port=htons(SER_PORT);
	addr.sin_addr.s_addr=inet_addr(SER_IP);
	if(connect(cfd,(struct sockaddr*)&addr,sizeof(addr))<0){
		ERR_MSG("connect");
		return -1;
	}
	puts("connect success");
	//5.接受发送消息recv;send
	char buf[128];
	while(1){
		bzero(buf,sizeof(buf));
		printf("请输入>>>");
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf)-1]='\0';

		if(strcmp(buf,"quit")==0)
			break;

		int send_res=send(cfd,buf,sizeof(buf),0);
		if(send_res<0){
			ERR_MSG("send");
			return -1;
		}
		puts("send success");

		bzero(buf,sizeof(buf));
		int recv_res=recv(cfd,buf,sizeof(buf),0);

		if(recv_res<0){
			ERR_MSG("recv");
			return -1;
		}else if(recv_res==0){
			printf("socket peer has shutdown\n");
			break;
		}
		puts("recv success");
		printf("[%s:%d]:%s\n",SER_IP,SER_PORT,buf);

		}
	
	//6.关闭
	close(cfd);
	
	return 0;
}

运行结果:

UDP:代码

服务端:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <strings.h>

//自定义报错提示
#define ERR_MSG(msg) do{\
		fprintf(stderr,"__%d__",__LINE__);\
		perror(msg);\
}while(0)

#define SER_PORT 8888
#define SER_IP "192.168.125.2"


int main(int argc, const char *argv[])
{
	//1.创建socket套接字
	int sfd=socket(AF_INET,SOCK_DGRAM,0);
	if(sfd<0){
		ERR_MSG("socket");
		return -1;
	}
	puts("socket success");
	
	//2.绑定IP和端口号
	struct sockaddr_in addr;
	addr.sin_family=AF_INET;
	addr.sin_port=htons(SER_PORT);
	addr.sin_addr.s_addr=inet_addr(SER_IP);
	if(bind(sfd,(struct sockaddr*)&addr,sizeof(addr))<0){
		ERR_MSG("bind");
		return -1;
	}
	puts("bind success");


	//3.接受和发送消息
	//
	struct sockaddr_in src_addr;
	socklen_t addrlen=sizeof(src_addr);
	char buf[128];
	while(1){

		bzero(buf,sizeof(buf));
		int recv_res=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&src_addr,&addrlen);
		if(recv_res<0){
			ERR_MSG("recvfrom");
			return -1;
		}
		puts("recvfrom success");
		printf("[%s:%d]:%s\n",inet_ntoa(src_addr.sin_addr),ntohs(src_addr.sin_port),buf);

		
		if(strcmp(buf,"quit")==0)
			break;
		
		strcat(buf,"-----i has received");
		int send_res=sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&src_addr,addrlen);
		if(send_res<0){
			ERR_MSG("sendto");
			return -1;
		}
		puts("sendto success");


		}
	//4.关闭
	close(sfd);
	return 0;
}

客户端

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <strings.h>

//自定义报错提示
#define ERR_MSG(msg) do{\
		fprintf(stderr,"__%d__",__LINE__);\
		perror(msg);\
}while(0)

#define SER_PORT 8888
#define SER_IP "192.168.125.2"


int main(int argc, const char *argv[])
{
	//1.创建socket套接字
	int cfd=socket(AF_INET,SOCK_DGRAM,0);
	if(cfd<0){
		ERR_MSG("socket");
		return -1;
	}
	puts("socket success");
	
	
	//3.接受和发送消息
	//目标地址信息
	struct sockaddr_in addr;
	addr.sin_family=AF_INET;
	addr.sin_port=htons(SER_PORT);
	addr.sin_addr.s_addr=inet_addr(SER_IP);
	socklen_t addrlen=sizeof(addr);

	//记录接受信息的目标地址信息
	struct sockaddr_in recv_addr;
	socklen_t recv_addrlen=sizeof(recv_addr);
	char buf[128];
	while(1){
		
		printf("请输入>>>");
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf)-1]='\0';
		

	
		int send_res=sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&addr,addrlen);
		if(send_res<0){
			ERR_MSG("sendto");
			return -1;
		}
		puts("sendto success");
		if(strcmp(buf,"quit")==0)
			break;

		bzero(buf,sizeof(buf));
		int recv_res=recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&recv_addr,&recv_addrlen);
		if(recv_res<0){
			ERR_MSG("recvfrom");
			return -1;
		}
		puts("recvfrom success");
		printf("[%s:%d]:%s\n",inet_ntoa(recv_addr.sin_addr),ntohs(recv_addr.sin_port),buf);	

		}
	//4.关闭
	close(cfd);
	return 0;
}

运行结果:

今日思维导图:

somthing error:UDP的客户端处

一开始addrlen只有定义没有赋值,白天的时候有报错给他加了一个初始值;晚上突然一下可以一下不可以,找了找错误改了医改,应该也是这个;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目提交按钮没防抖,差点影响了验收

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 表妹一键制作自己的五星红旗国庆头像&#xff0c;超好看 前言 一个运行了多年的ToB的项目&#xff0c;由于数据量越来越大&#xff0c;业务越来越复杂&…

【HarmonyOS】【DevEco Studio】盘点DevEco Studio日志获取途径

【关键词】 DevEco Studio、日志获取 【问题背景】 在收到IDE工单的时候&#xff0c;很多时候开发者出现的问题都需要提供一些日志&#xff0c;然后根据日志分析&#xff0c;那么你知道IDE各种日志的获取方式么&#xff1f;往下看 【获取方法】 一、idea.log获取 IDE界面H…

滴滴一面:说说MySQL主从数据同步机制

说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如滴滴、阿里、汽车之家、极兔、有赞、希音、百度、网易、滴滴的面试资格&#xff0c;遇到一几个很重要的主从同步面试题&#xff1a; 说说MySQL主从同步的流程说说MySQL主从同步…

添加一个仅管理员可见的页面

例如我新加一个页面 申请一个路由 《插播》 前端是如何知道我们是管理员的呢&#xff0c;ant-design框架会帮我们存到InitialState里&#xff0c;做为全局变量 在access.ts里我们获取到了用户是否为管理员 &#xff08;用户存在且为管理员&#xff09; 框架为我们打通了个路由…

【深度学习实验】前馈神经网络(二):使用PyTorch实现不同激活函数(logistic、tanh、relu、leaky_relu)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 定义激活函数 logistic(z) tanh(z) relu(z) leaky_relu(z, gamma0.1) 2. 定义输入、权重、偏置 3. 计算净活性值 4. 绘制激活函数的图像 5. 应用激活函数并…

MySQL基础—从零开始学习MySQL

01.MySQL课程介绍_哔哩哔哩_bilibili 1、MySQL安装 以管理员身份运行cmd net start mysql80net stop mysql80 客户端连接 1). 方式一&#xff1a;使用MySQL提供的客户端命令行工具 2). 方式二&#xff1a;使用系统自带的命令行工具执行指令 mysql [-h 127.0.0.1] [-P 3…

mysql知识大全

MySQL知识大全&#xff08;2&#xff09; MySqL 基础为1—7&#xff08;增删改查基础语法&#xff09;&#xff0c;MySQL进阶知识为8—11&#xff08;约束、数据库设计、多表查询、事务&#xff09; 1、数据库相关概念 以前我们做系统&#xff0c;数据持久化的存储采用的是文件…

【二叉树】二叉树展开为链表-力扣 114 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

【云原生】k8s-----集群调度

目录 1.k8s的list-watch机制 1.1 list-watc机制简介 1.2 根据list-watch机制&#xff0c;pod的创建流程 2.scheduler的调度策略 2.1 scheduler的调度策略简介 2.2 Scheduler预选策略的算法 2.3 Scheduler优选策略的算法 3. k8s中的标签管理及nodeSelector和nodeName的 调…

win10 安装 Langchain-Chatchat 避坑指南(2023年9月18日v0.2.4版本,包含全部下载内容!)

网上教程都是基于外网或者翻墙的&#xff0c;而且细节极其不清晰&#xff0c;尤其是最关键的模型下载。 另外提一句&#xff0c;我的显卡是&#xff1a;3080Ti 16GB版本&#xff0c;运行之后&#xff0c;显存占用13-14GB 1、安装Anaconda&#xff08;这个就不啰嗦了&#xff0c…

【SpringMVC】JSON注解全局异常处理机制

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Spring MVC》。&#x1f3…

Nue JS 造全新的 Web 生态

Nue JS 是最近开源的 Web 前端项目&#xff0c;用于构建用户界面&#xff0c;体积非常小&#xff08;压缩后 2.3kb&#xff09;。Nue JS 支持服务器端渲染 (SSR)、反应式组件和 “同构” 组合 ("isomorphic" combinations)。 Vue.js、React.js 或 Svelte&#xff0c;…

Day 01 python学习笔记

1、引入 让我们先写第一个python程序&#xff08;如果是纯小白的话&#xff09; 因为我们之前安装了python解释器 所以我们直接win r ---->输入cmd&#xff08;打开运行终端&#xff09; >python #&#xff08;在终端中打开python解释器&#xff09;>>>pri…

CSDN博客可以添加联系方式了

csdn博客一直不允许留一些联系方式&#xff0c;结果是官方有联系方式路径 在首页&#xff0c;往下拉&#xff0c;左侧就有 点击这个即可添加好友了~ 美滋滋&#xff0c;一起交流&#xff0c; 学习技术 ~

详细介绍如何微调 YOLOv8 姿势模型以进行动物姿势估计--附完整源码

动物姿势估计是计算机视觉的一个研究领域,是人工智能的一个子领域,专注于自动检测和分析图像或视频片段中动物的姿势和位置。目标是确定一只或多只动物身体部位的空间排列,例如头部、四肢和尾巴。这项技术具有广泛的应用,从研究动物行为和生物力学到野生动物保护和监测。 …

CS 创世SD NAND FLASH 存储芯片,比TF卡更小巧轻便易用的大容量存储,TF卡替代方案

文章目录 介绍创世SD卡引脚与NOR Flash存储比较 介绍 SD NAND FLASH&#xff08;Secure Digital NAND Flash&#xff09;是一种安全数字 NAND 闪存技术&#xff0c;通常用于存储数据&#xff0c;并且具有一些额外的安全特性。这种技术结合了 NAND 闪存的高密度存储能力和安全性…

JavaScript 期约与异步函数的学习笔记

同步与异步的概念 JavaScript 是一门单线程的语言&#xff0c;这意味着它在任何给定的时间只能执行一个任务。 然而&#xff0c;JavaScript 通过异步编程技术来处理并发操作&#xff0c;以避免阻塞主线程的情况。 在上图中&#xff0c;同步行为的进程 A 因为等待进程 B 执行完…

敏捷开发的优势

在现今这个快速变化的时代&#xff0c;企业对于软件开发的需求也在不断变化。为了满足市场需求&#xff0c;开发出高质量、具有竞争力的软件产品&#xff0c;越来越多的企业开始采用敏捷开发方法。 敏捷开发的优势在于其能够灵活响应变化&#xff0c;提升软件项目的成功率。 敏…

中国艺术溟㠭篆刻作品《止语》

孙溟㠭先生篆刻作品《止语》&#xff1a;“一出生先学说话&#xff0c;却用一生来学闭口&#xff0c;知者不言&#xff0c;言者不知&#xff0c;智者语迟&#xff0c;愚着话多&#xff0c;人不贵牙尖嘴硬&#xff0c;而贵在耳聪目明&#xff0c;癸卯秋月寒舍小窗下溟㠭刊。” 孙…

JDK21发布了!面试官:来,谈下jdk21的新特性!

1.前言 JDK21 计划23年9月19日正式发布&#xff0c;尽管一直以来都是“版随意出&#xff0c;换 8 算我输”&#xff0c;但这么多年这么多版本的折腾&#xff0c;若是之前的 LTS 版本JDK17你还觉得不错&#xff0c;那 JDK21还是有必要关注一下&#xff0c;因为会有一批重要更新…