tcp通信,客户端服务端

news2025/1/19 14:24:32

进行过程 

//TCP通信的流程

//服务器端(被动接受连接的角色)

1.创建一个用于监听的套接字

        -监听:监听有客户端的连接

        -套接字:这个套接字其实就是一个文件描述符

2.将这个监听文件描述符和本地的IP和端口绑定(IP和端口就是服务器的地址信息)

        -客户端连接服务器的时候使用的就是这个IP和端口

3.设置监听,监听的fd开始工作

4.阻塞等待,当有客户端发起连接,解除阻塞,接受客户端的连接,会得到一个和客户端通信的套接字(fd)

5.通信

        -接收数据

        -发送数据

6.通信结束,断开连接

//客户端

1.创建一个用于通信的套接字(fd)

2.连接服务器,需要指定连接的服务器和IP和端口

3.连接成功了,客户端可以直接和服务器端通信

             -接收数据

             -发送数据

4.通信结束,断开连接

 

字节序转换函数

发送端总是把要发送的数据转换成大端字节序数据后再发送,而接收端直到对方传送过来的数据总数采用大端字节序,所以接收端可以自身采用的字节序决定是否对接收到的数据进行转换(小端机转换,大端机不转换)

网络字节序采用大端

 

 

IP地址转化

 比如用点分十进制字符串表示 IPv4 地址,以及用 十六进制字符串表示 IPv6 地址。但编程中我们需要先把它们转化为整数(二进制数)方能使用。而记录 日志时则相反,我们要把整数表示的 IP 地址转化为可读的字符串

 

 

tcp/ip协议族

struct sockaddr_in
  {
    sa_family_t sin_family;     /*__SOCKADDR_COMMON (sin_)*/
    in_port_t sin_port;			/* Port number.  */
    struct in_addr sin_addr;		/* Internet address.  */

    /* Pad to size of `struct sockaddr'.  */
    unsigned char sin_zero[sizeof (struct sockaddr) -
			   __SOCKADDR_COMMON_SIZE -
			   sizeof (in_port_t) -
			   sizeof (struct in_addr)];
  };


struct in_addr
{
    in_addr_t s_addr;
};

 端口复用

 

 套接字函数

 

 

 show me the Code

客户端代码

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

using namespace std;

int main() {
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd == -1) {perror("socket"); return -1;}

    struct sockaddr_in seaddr;
    inet_pton(AF_INET, "127.0.0.1",&seaddr.sin_addr.s_addr);
    seaddr.sin_family = AF_INET;
    seaddr.sin_port = htons(9999);
    int ret = connect(fd, (struct sockaddr*)&seaddr,sizeof(seaddr));    
    if (ret == -1) {perror("connect"); return -1;}

    while(1) {
        char sendBuf[1024] = {0};
        fgets(sendBuf, sizeof(sendBuf), stdin);

        write(fd, sendBuf, strlen(sendBuf) + 1);

        //接收
        int len = read(fd, sendBuf, sizeof(sendBuf));
        if (len==-1) {
            perror("read");
            return -1;
        }else if(len > 1) {
            printf("read buf = %s\n", sendBuf);
        }else {
            printf("服务器已经断开连……\n");
            break;
        }
    }

    close(fd);
    return 0;


    return 0;
}

服务端代码

#include <stdio.h>
#include <ctype.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main() {
    //创建socket
    int lfd = socket(AF_INET, SOCK_STREAM, 0);
    if (lfd == -1) {
        perror("socket");
        return -1;
    }

    struct sockaddr_in seraddr;
    seraddr.sin_family = AF_INET;
    seraddr.sin_addr.s_addr = INADDR_ANY;
    seraddr.sin_port = htons(9999);

    //端口复用,防止服务器重启时之前绑定的端口还没有释放
    //程序突然退出而系统没有释放端口
    int optval = 1;
    setsockopt(lfd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval));
    
    //绑定
    int ret = bind(lfd, (struct sockaddr*)&seraddr, sizeof(seraddr));
    if(ret == -1) {
        perror("bind");
        return -1;
    }

    //监听
    ret = listen(lfd, 8);
    if(ret == -1) {
        perror("listen");
        return -1;
    }

    //接收客户端连接
    struct sockaddr_in cliaddr;
    socklen_t len = sizeof(cliaddr);
    int cfd = accept(lfd, (struct sockaddr*)&cliaddr, &len);
    if(cfd == -1) {
        perror("accept");
        return -1;
    }

    //获取客户端信息
    char clilp[16];
    inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, clilp, sizeof(clilp));
    int cliPort = ntohs(cliaddr.sin_port);
    //printf("client's ip is%s, ans port is %d\n", clilp, cliPort);

    //接收客户端发来的数据
    char recvBuf[1024] = {0};
    while(1) {
        int len = recv(cfd, recvBuf, sizeof(recvBuf), 0);
        if(len == -1) {
            perror("recv");
            return -1;
        }else if(len == 0) {
            printf("客户端已经断开连接……\n");
            break;
        }else if(len > 0) {
            printf("read buf = %s\n", recvBuf);
        }

        char sendBuf[1024] = {0};
        fgets(sendBuf, sizeof(sendBuf), stdin);

        //大写字符串发送给客户端
        ret = send(cfd, sendBuf, strlen(sendBuf) + 1, 0);
        if(ret == -1) {
            perror("send");
            return -1;
        }
    }

    close(cfd);
    close(lfd);
    return 0;
}

在linux编译即可

g++  客户端.cpp -o a.out

g++  服务端.cpp -o b.out

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

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

相关文章

飞凌嵌入式AM62x核心板,赋能新一代HMI

HMI&#xff08;人机界面&#xff09;是系统和用户之间进行交互和信息交换的媒介&#xff0c;凡是涉及人机信息交流的领域都离不开人机界面&#xff0c;因此在许多行业内都能见到HMI的身影。随着技术的进步HMI也在持续发展和演进&#xff0c;除了数据收集、控制和显示外&#x…

在采购过程中保持供应商诚实的5种方法

不信任潜在供应商的心理在B2B买家中很常见。据报告称&#xff0c;供应商和买家之间存在着信任差距。这不是针对个人&#xff0c;而是健康的怀疑态度。谁不会对他们企业的潜在六七位数技术投资持怀疑态度&#xff1f; 企业和其供应商之间的关系通常是决定成败的关键。为此&…

SQL 条件函数 日期函数 文本函数 窗口函数

玩了几天&#xff0c;劳逸结合&#xff0c;继续复习刷题sql 一、条件函数 1.题目&#xff1a;现在运营想要将用户划分为25岁以下和25岁及以上两个年龄段&#xff0c;分别查看这两个年龄段用户数量&#xff08;age为null 也记为 25岁以下&#xff09; user_profile 期望结果&…

【论文阅读】MAMIL

1、基本信息 misc{Konstantinov_Utkin, title{Multi-Attention Multiple Instance Learning}, author{Konstantinov, AndreiV. and Utkin, LevV.} }2、摘要 本文提出了基于多注意力的MIL问题求解方法&#xff0c;该方法考虑了包中每个被分析实例的相邻实例。在该方法中&…

如何还原min.js文件

最近在看别人给的一个代码包&#xff0c;但是有一些文件是 xx.min.js ,这种文件在vscode中打开后是这样的 这种怎么阅读&#xff0c;太难了&#xff0c;于是全选&#xff0c;右键格式化文档&#xff0c;不管用 通过咨询群友&#xff0c;学到了&#xff1a; 回答一&#xff1…

vscode开发常用的工具栏选项,查看源码技巧以及【vscode常用的快捷键】

一、开发常用的工具栏选项 1、当前打开的文件快速在左侧资源树中定位&#xff1a; 其实打开了当前的文件已经有在左侧资源树木定位了&#xff0c;只是颜色比较浅 2、打开太多文件的时候&#xff0c;可以关闭 3、设置查看当前类或文件的结构 OUTLINE 相当于idea 查看当前类或接…

【计算机网络-数据链路层】流量控制与可靠传输机制

文章目录1 停止-等待协议1.1 无差错情况1.2 有差错情况——数据帧出错或丢失1.3 有差错情况——ACK 丢失1.4 有差错情况——ACK 迟到1.5 性能分析1.6 相关例题2 后退 N 帧协议&#xff08;GBN&#xff09;2.1 无差错情况2.2 超时重传、回退 N 帧2.3 相关例题3 选择重传协议&…

AX7A200教程(6): 串口接收图片数据,通过hdmi接口输出显示

本章节主要使用uart接收图片数据&#xff0c;然后通过ddr3缓存&#xff0c;最后通过hdmi接口显示输出&#xff0c;功能框图如下图所示 uart接收的图片数据位1024*768*3分辨率大小的数据&#xff0c;一共2359296个字节&#xff0c;输入图片如下图所示 图片属性 串口接收数据&…

基于matlab分析卫星星座对通信链路的干扰

一、前言此示例说明如何分析从中地球轨道 &#xff08;MEO&#xff09; 中的卫星星座到位于太平洋的地面站的下行链路上的干扰。干扰星座由低地球轨道&#xff08;LEO&#xff09;的40颗卫星组成。此示例确定下行链路闭合的时间、载波噪声加干扰比以及链路裕量。此示例需要卫星…

锚框+ssd v2 整合笔记

13.4. 锚框 — 动手学深度学习 2.0.0 documentation 13.7. 单发多框检测&#xff08;SSD&#xff09; — 动手学深度学习 2.0.0 documentation 锚框 一.归一化推导公式 目标检测SSD | Lee的个人博客 之前笔记有点错误 https://mp.csdn.net/mp_blog/creation/editor/129528…

输入电阻、输出电阻、特性阻抗、阻抗匹配

一、输入阻抗和输出阻抗 1.输入阻抗 输入阻抗&#xff08;input impedance)是指一个电路输入端的等效阻抗。在输入端上加上一个电压源U&#xff0c;测量输入端的电流I&#xff0c;则输入阻抗Rin就是U/I。你可以把输入端想象成一个电阻的两端&#xff0c;这个电阻的阻值&#…

云原生助力数字原生企业业务快速迭代|阿里云峰会精彩回顾

导语&#xff1a; 4月11日&#xff0c;2023 阿里云峰会如期举行。一直以来&#xff0c;阿里云都积极融入企业数字原生创新发展的新浪潮&#xff0c;是中小企业走向数字原生坚实的支持者。阿里云坚持以数据和智能驱动&#xff0c;与合作伙伴、企业客户一起专注于技术创新&#x…

《Scikit Learn | MorvanZhou 》learning notes

学习资源 https://scikit-learn.org/stable/https://morvanzhou.github.io/tutorials/machine-learning/sklearn/ 文章目录1 Why Scikit Learn2 通用学习模式&#xff08;牛刀小试 pipeline&#xff09;3 sklearn 强大数据库&#xff08;Loaders / Sample Generator&#xff0…

new/delete内存分配操作符

目录 一、C/C的内存分布 二、new与delete操作符 1.new/delete 的使用 2.new申请失败抛异常 3.new/delete操作内置类型 4.new/delete 操作自定义类型 三、operator new与operator delete函数 四、new和delete的实现原理 1.对于内置类型 2.对于自定义类型 ①new的实现…

Prophet学习(四)趋势Changepoints

目录 趋势Changepoints&#xff08;Trend Changepoints&#xff09; Prophet中的自动更改点检测&#xff08;Automatic changepoint detection in Prophet&#xff09; 调整趋势灵活性&#xff08;Adjusting trend flexibility&#xff09; 指定变更点的位置&#xff08;Spe…

DnCNN-pytorch版本代码运行环境配置

一、DnCNN-pytorch相关下载 (1)DnCNN-pytorch版本代码下载 https://download.csdn.net/download/qq_41104871/87457414 (2)GPU版本的torch0.4.1下载 https://download.csdn.net/download/qq_41104871/87658469 (3)相对应的torchvision0.2.1下载 https://download.csdn…

Redis多级缓存搭建(结合案例学习)

文章目录一. JVM进程缓存1. 在docker中安装Mysql服务2. 向数据库中导入数据和导入案例代码3. 在dokcer中部署nginx服务器实现方向代理4. 在nginx目录下导入主页面5. 配置nginx实现反向代理6. 初步认识Caffine7. 使用Caffeine实现本地进程缓存8. 总结二. LUA语法1. 初识Lua2. 基…

TCP并发服务器模型

文章目录1. 循环服务器2. 并发服务器2.1 多进程并发服务器2.2 多线程并发服务器3. 基于TCP的文件传输服务(目前只有下载)1.tftp下载模型2.TFTP通信过程总结3.tftp下载协议分析1. 循环服务器 一次只能处理一个客户端&#xff0c;等这个客户端退出后&#xff0c;才能处理下一个客…

vue大坑:v-for的key以及props传参不当导致的闭包

为什么props传参在模版中使用没问题&#xff0c;在函数中使用不变化 场景 当我们点击上方的月份时&#xff0c;会改变下方加载的卡片信息 代码&#xff1a; 父组件&#xff1a; <divv-for"(item, index) in vocalStore.getCardMonthData":key"index"…

电梯导航案例

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>小兔鲜儿 - 新鲜 惠民 快捷!</title><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"render…