9月9日

TCP
服务器端

#include <myhead.h>
#define  SER_PORT  8888        //服务器端口号
#define SER_IP  "192.168.108.179"   //服务器IP地址 

int main(int argc, const char *argv[])
{
//创建一个用于连接的套接字文件描述符
int sfd  = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sfd)
{
perror("socket  error");
return -1;
}

    printf("socket 成功 sfd = %d\n", sfd);


//封装地址信息结构体变量
struct sockaddr_in sin;        //地址信息结构体变量
sin.sin_family = AF_INET;      //IPV4
sin.sin_port = htons(SER_PORT);   //端口号,主机转网络字节序
sin.sin_addr.s_addr = inet_addr(SER_IP);  //ip地址转网络字节序

//给套接字绑定ip地址和端口号
if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) ==-1)
{
perror("bind  error");
return -1;
}
printf("bind success\n");


//将套接字启动监听
if(listen(sfd, 128) == -1)
{
perror("listen  error");
return -1;
}
printf("listen success\n");

    //阻塞等等客户端的连接,如果有新客户端连接,则创建一个用于通信的新套接字
struct sockaddr_in cin;            //用于接受客户端套接字信息
socklen_t addrlen = sizeof(cin);   //用于接受客户端套接字的长度

    int new_fd = accept(sfd, (struct sockaddr*)&cin, &addrlen);
if(-1 == new_fd)
{
perror("accept error");
return -1;
}
printf("[%s:%d]发来连接,new_fd = %d\n", inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),new_fd);

    //使用新套接字跟客户端进行通信
while(1)
{
//从套接字中读取消息
char rbuf[128] = "";          //存放接受消息的容器
int res = recv(new_fd, rbuf, sizeof(rbuf), 0);
if(res == 0)
{
printf("客户端已下线\n");
close(new_fd);
break;
}
if(res == -1)
{
perror("recv error");
close(new_fd);
close(sfd);
return -1;
}
printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);

        //给当前消息加个笑脸还回去
strcat(rbuf, "*_*");

        //向套接字中写入消息
send(new_fd, rbuf, strlen(rbuf), 0);

printf("发送成功\n");
close(new_fd);

    }

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

    
return 0;
}

客户端

#include <myhead.h>
#define  SER_PORT 8888               //服务器端口号
#define SER_IP "192.168.108.179"     //服务器ip地址
#define CLIENT_PORT 9999             //客户端端口号
#define CLIENT_IP "192.168.108.179" //客户端ip地址

int main(int argc, const char *argv[])
{
//创建一个用于通信的套接字文件描述符
int cfd = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == cfd)
{
perror("socket error");
return -1;
}
printf("socket success   cfd = %d\n", cfd);

//封装服务器的地址信息结构体
struct sockaddr_in sin;
sin.sin_family = AF_INET;            //通信域
sin.sin_port = htons(SER_PORT);     //服务器端口号
sin.sin_addr.s_addr = inet_addr(SER_IP);    //服务器ip地址

//连接服务器
if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin)) == -1)
{
perror("connect  error");
return -1;
}
printf("连接成功\n");

    
//数据收发
while(1)
{
char wbuf[128] = "";            //用于发送数据的容器
fgets(wbuf, sizeof(wbuf), stdin);    //从终端获取消息
wbuf[strlen(wbuf)-1] = '\0';         //将换行改成'\0'
if(strcmp(wbuf, "quit") == 0)
{
break;
}

        //将数据发送给服务器
send(cfd, wbuf, strlen(wbuf), 0);
printf("发送成功\n");

        //接收服务器发送的消息
recv(cfd, wbuf, sizeof(wbuf), 0);
printf("收到的消息为:%s\n", wbuf);
}

//关闭套接字
close(cfd)


return 0;

UDP

服务器端

#include <myhead.h>
#define SER_IP "192.168.108.179"
#define SER_PORT 8888        


int main(int argc, const char *argv[])
{
//创建服务器套接字文件描述符
int sfd = socket(AF_INET, SOCK_DGRAM, 0);
if(-1 == sfd)
{
perror("socket error");
return -1;
}
printf("socket success  sfd = %d\n", sfd);   


填充地址信息结构体
struct sockaddr_in sin;
sin.sin_family = AF_INET;          //配置通信域
sin.sin_port = htons(SER_PORT);      //配置端口号
sin.sin_addr.s_addr = inet_addr(SER_IP);   //配置ip地址
//绑定操作
if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1)
{
perror("bind  error");
return -1;
}
printf("bind  success\n");

    //数据收发
//定义用于接收对端地址信息结构体
struct sockaddr_in cin;
socklen_t addrlen = sizeof(cin);     //接收地址信息的大小

    while(1)
{
char rbuf[128] = "";         //定义接收消息的容器
//接收客户端消息
recvfrom(sfd, rbuf, sizeof(rbuf), 0, (struct sockaddr*)&cin, &addrlen);
printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);

        //给消息加个笑脸还回去
strcat(rbuf, "*_*");

        //向客户端发送消息
sendto(sfd, rbuf, strlen(rbuf), 0, (struct sockaddr*)&cin, sizeof(cin));
printf("发送成功\n");

    }

    //4、关闭服务器
close(sfd);

return 0;
}

客户端

#include<myhead.h>

#define SER_IP "192.168.108.179"       //服务器ip地址
#define SER_PORT 8888                  //服务器端口号
#define CLI_IP  "192.168.108.179"      //客户端ip地址
#define CLI_PORT 9999                  //客户端端口号

int main(int argc, const char *argv[])
{
//创建用于通信的套接字文件描述符
int cfd = socket(AF_INET, SOCK_DGRAM, 0);
if(-1 == cfd)
{
perror("socket error");
return -1;
}
printf("socket success  cfd = %d\n", cfd);


填充客户端地址信息结构体
struct sockaddr_in cin;
cin.sin_family = AF_INET;                //通信域
cin.sin_port = htons(CLI_PORT);          //客户端端口号
cin.sin_addr.s_addr = inet_addr(CLI_IP);  //客户端ip地址


//进行绑定工作
if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1)
{
perror("bind error");
return -1;
}
printf("bind  success\n");

    //数据收发
//封装服务器的地址信息结构体
struct sockaddr_in sin;             //服务器地址信息结构体
sin.sin_family = AF_INET;
sin.sin_port = htons(SER_PORT);         //服务器端口号
sin.sin_addr.s_addr = inet_addr(SER_IP);  //服务器ip地址
socklen_t addrlen = sizeof(sin);          //地址信息结构体的大小
while(1)
{
char wbuf[128] = "";
//从终端获取一个字符串
fgets(wbuf, sizeof(wbuf), stdin);
wbuf[strlen(wbuf)-1] = 0;

        //将消息发送给服务器
sendto(cfd, wbuf, strlen(wbuf), 0, (struct sockaddr*)&sin, addrlen);

printf("发送成功\n");

        //接收服务器回复的消息
recv(cfd, wbuf, sizeof(wbuf), 0,NULL,NULL);
printf("收到消息为:%s\n", wbuf);

    }

    //4、关闭客户端
close(cfd);

return 0;
}

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

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

相关文章

Docker生产部署

目录 一、准备工作&#xff1a;理解 Docker 与 Spring Boot 的关系 1. Docker 是什么&#xff1f; 2. Spring Boot 为什么适合 Docker&#xff1f; 二、编写Dockerfile 三、配置管理 挂载外部配置文件 四、用 docker-compose 编排多服务 一、准备工作&#xff1a;理解 Do…

ARM 基础(3)

ARM汇编与C语言函数的相互调用及参数传递汇编调用C函数参数传递规则 前4个参数通过寄存器 R0-R3 传递&#xff0c;超出部分从右向左压栈。32位返回值存于 R0&#xff0c;64位整数用 R0 和 R1&#xff0c;浮点数通过 S0/D0 返回。示例&#xff1a;ARM汇编调用C函数.global _star…

OpenCV计算机视觉笔记合集

参考课程&#xff1a; 【黑马程序员 OpenCV入门教程】 [https://www.bilibili.com/video/BV1Fo4y1d7JL] ZZHow(ZZHow1024) 学习路线 基本的图像处理方法&#xff1a;几何变换&#xff0c;形态学变换&#xff0c;图像平滑&#xff0c;直方图操作&#xff0c;模板匹配&#…

Mybatis-12 第三方缓存-EhCache

配置文档 Ehcache配置文件ehcache.xml Java Ehcache缓存的timeToIdleSeconds和timeToLiveSeconds区别 基本介绍 1.EhCache是一个纯Java的缓存框架&#xff0c;具有快速、精干等特点 2.MyBatis有自己默认的二级缓存&#xff08;前面我们已经使用过了&#xff09;&#xff0c;…

元器件--电容器

文章目录一、技术理论  1、电容定义  2、定义式  3、单位换算  4、电容作用  5、电容特性二、组成结构  1、极板&#xff08;电极&#xff09;​​  ​​2、介质&#xff08;绝缘层&#xff09;​​  3、引线&#xff08;电极引出端&#xff09;​​  4、封装…

【Leetcode hot 100】146.LRU缓存

问题链接 146.LRU缓存 问题描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关…

MySQL超大数据量查询与删除优化

引言 在处理TB级数据时&#xff0c;传统SQL操作可能导致性能崩溃。本文揭示MySQL超大数据量场景下的核心优化策略&#xff0c;通过生产环境案例展示如何将亿级数据删除耗时从8小时压缩至8分钟&#xff0c;并附完整监控方案与容灾措施。 深度剖析海量数据操作痛点 1. 传统删除操…

【内存管理】常用的页表映射函数

1、pgd_addr_end 根据当前虚拟地址 addr 和目标结束地址 end&#xff0c;计算当前 PGD 项 能够覆盖的最大虚拟地址范围的结束地址 next。 如果 addr 和 end 跨越多个 PGD 项&#xff08;即 end 超出当前 PGD 项的地址范围&#xff09;&#xff0c;则返回当前 PGD 项的地址边界。…

XR数字融合工作站赋能新能源汽车专业建设的创新路径

XR数字融合工作站作为集PC、VR、MR技术于一体的软硬件集成平台&#xff0c;凭借其多维交互、虚实融合、智能管理等特性&#xff0c;为新能源汽车专业的教学改革与创新提供了全新解决方案。一、教学场景革新&#xff1a;构建沉浸式、互动化学习环境XR数字融合工作站通过多形态拼…

C语言通用链表终章:优雅的收尾 - 清空与销毁

各类资料学习下载合集 ​https://pan.quark.cn/s/8c91ccb5a474​ 经过前面的学习,我们已经从零构建了一个功能强大的通用链表,它能自如地进行节点的插入和删除。我们的“数据火车”已经可以驰骋在内存的世界里。然而,旅途终有终点,当火车完成任务后,如何安全、彻底地让…

MATLAB R2025a安装配置及使用教程(超详细保姆级教程)

文章目录前言什么是MATLAB&#xff1f;了解这款数据分析利器matlab安装前准备工作MATLAB R2025a下载完整MATLAB R2025a安装步骤MATLAB进阶应用技巧前言 全网最新最全的MATLAB R2025a安装教程来了&#xff01;2025年版本完整图文指南&#xff0c;包含软件下载、详细安装、密钥激…

在Mybatis plus中如何使用自定义Sql

在演示UpdateWrapper的案例中&#xff0c;我们在代码中编写了更新的SQL语句&#xff1a;Test void testUpadateWrapper(){List<Long> ids List.of(1L,2L,4L);//生成SQLUpadateWrapper<User> wrapper new UpdateWrapper<User> ().setSql("balance balan…

Deepoc科技之暖:智能助盲设备如何为视障家人点亮生活

作为一名视障人士的家属&#xff0c;我们或许都经历过这样的时刻&#xff1a;看着亲人在书架前摸索&#xff0c;却无法独自获取文字信息&#xff1b;担心他们外出时遇到障碍物或交通危险&#xff1b;心疼他们因找不到日常物品而不得不一次次求助。这些细微的日常困境&#xff0…

大模型食材识别技术革新:AI重构精准营养管理

随着健康意识的提升&#xff0c;饮食管理需求激增&#xff0c;但传统手动记录易出错、效率低。大模型食材识别技术的突破&#xff0c;让AI通过多模态输入精准识别食材种类与重量&#xff0c;结合营养数据库&#xff0c;系统可快速生成营养报告&#xff0c;实现从“经验驱动”到…

使用 Altair RapidMiner 将机器学习引入您的 Mendix 应用程序

Altair RapidMiner 使机器学习更加容易&#xff1a;无论您喜欢使用 Python 编码&#xff0c;还是在 Workflow Studio 中进行可视化工作&#xff0c;Altair AI Cloud 都能为团队提供快速构建和部署 ML 模型的工具。 将机器学习与 Mendix 集成很简单&#xff1a;通过 Mendix 的低…

EasyExcel:快速读写Excel的工具类

EasyExcel&#xff1a;快速读写Excel的工具类 项目介绍 ​EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性能、内存的等因素的情况下&#xff0c;快速完成Excel的读、写等功能。 pom地址 ‍ <!--exel--> <depe…

WSL Ubuntu Docker 代理自动配置教程

WSL Ubuntu Docker 代理自动配置教程 WSL Ubuntu Docker 代理自动配置教程 背景说明 在 WSL2 环境下使用 Docker 时&#xff0c;由于网络环境限制&#xff0c;经常需要通过 Windows 主机上的代理来访问 Docker Hub。但每次 Windows 重启后&#xff0c;WSL 获取到的主机 IP 地址…

踩坑实录:Django继承AbstractUser时遇到的related_name冲突及解决方案

一、问题现象分析 咱们在用Django开发时&#xff0c;有时候需要扩展用户模型&#xff0c;就会去继承AbstractUser。但这么做的时候&#xff0c;要是没处理好groups和user_permissions这两个多对多字段的反向查询名称&#xff0c;就会遇到这样的报错&#xff1a;主要就是这种错误…

push pop 和 present dismiss

push/pop 和 present/dismiss 文章目录push/pop 和 present/dismiss前言push / poppresent普通的present多层present多层present后的父子关系问题多层弹出会遇到的问题showViewController 和 showDetailViewControllershowViewControllershowDetailViewControllerdismiss模态化…

服务器异常负载排查手册 · 隐蔽进程篇

适用范围 适用于 Linux 3.10 生产环境&#xff0c;发现 load 高但用户态 CPU 接近 0 % 的场景。1. 现场冻结目标&#xff1a;在 rootkit 干预前保存易失数据。#!/bin/bash # freeze.sh TS$(date %s) mkdir -p /srv/ir/${TS} cd /srv/ir/${TS}# 1.1 进程树&#xff08;busybox 静…