网络编程——TCP

socket

在这里插入图片描述

socket类型

流式套接字(SOCK_STREAM) TCP
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复、无丢失、无失序的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。
数据报套接字(SOCK_DGRAM) UDP
提供无连接服务、不可靠。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。
原始套接字(SOCK_RAW)
可以对较低层次协议如IP、ICMP直接访问。

函数接口

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */int socket(int domain, int type, int protocol);
作用:创建一个通信的节点(创建一个socket文件描述符)
参数:domain:AF_UNIX, AF_LOCAL   本地通信(进程的第七种通信)            unix(7)AF_INET             借助ipv4进行通信			          	ip(7)AF_INET6            借助ipv6进行通信          			ipv6(7)type:SOCK_STREAM:用TCP进行通信SOCK_DGRAM:使用UDP进行通信protocol: 0返回值:成功返回一个socket文件描述符失败的话返回-1

TCP的编程流程

在这里插入图片描述
connect

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
作用:客户端的socket连接服务器
参数:sockfd:socket接口返回的文件描述符addr:服务器的地址,帮助文档的接收在bind里,protocol: 0返回值:第二个参数struct sockaddr *addr的解释
struct sockaddr {sa_family_t sa_family;   //同socket接口的domain参数char        sa_data[14];
}上面的接口类型只是socket接口族为了兼容多种协议,定义的一个通用的结构体,实际编程的时候,
需要你根据具体的协议类型,使用具体协议的结构体,对于ipv4来讲,需要看ip的第7个手册(man 7 ip)
就能得到下面这个地址struct sockaddr_in {sa_family_t    sin_family; /* address family: AF_INET */in_port_t      sin_port;   /* 端口:网络字节序 */struct in_addr sin_addr;   /* IP地址:网络字节序 */
};/* Internet address. */
struct in_addr {uint32_t       s_addr;     /* ip地址:网络字节序 */
};addrlen:地址的长度返回值:0 -1

recv/send

#include <sys/types.h>
#include <sys/socket.h>ssize_t recv(int sockfd, void *buf, size_t len, int flags);
作用:接收网络的数据
参数:sockfd:文件描述符buf:数据的存放缓冲区len:buf缓冲区的最大长度flags:默认填0 阻塞接收
返回值:成功会返回实际接收到的字节个数失败返回-1如果返回0的话,代表对端退出ssize_t send(int sockfd, const void *buf, size_t len, int flags);
作用:发送网络的数据
参数:sockfd:文件描述符buf:数据的发送缓冲区len:发的缓冲区大小flags:默认填0返回值:成功会返回实际发送成功的字节个数失败返回-1

bind

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
作用:绑定服务器地址(只允许绑定本机器的网卡地址)
参数:
sockfd:描述符
addr:代表的是本机的IP地址和端口
addrlen:地址的长度返回值:0 -1

listen

int listen(int sockfd, int backlog);
作用:监听socket连接
参数:sockfd:描述符backlog:同时能处理的客户端的个数,随便赋值  5 10 15
返回值:0 -1

accept

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
作用:接收一个客户端的连接,它是一个阻塞接口,直到有客户端连入的时候,会退出阻塞
参数:sockfd:服务器的描述符addr:入参(你传入,接口给你赋值)addrlen:地址的长度
返回值:错误-1成功的话,会返回一个新的描述符,这个描述符代表的是客户端的一条链路

实例代码

客户端:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <strings.h>#define N 64int main(int argc, char *argv[])
{if(argc < 3){printf("usage:%s <ip> <port>\n", argv[0]);return -1;}// 0定义变量int sockfd;char buf[N];int addrlen = sizeof(struct sockaddr);struct sockaddr_in serveraddr;// 1创建一个套接字--socketsockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd < 0){perror("socket err");exit(-1);}// 2指定服务器地址--sockaddr_inbzero(&serveraddr, addrlen);serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = inet_addr(argv[1]);serveraddr.sin_port = htons(atoi(argv[2]));// 3连接服务器--connectif(connect(sockfd, (struct sockaddr *)&serveraddr, addrlen) < 0){perror("connect err");exit(-1);}// 4收发数据--recv/sendwhile (1) {gets(buf);if(strcmp(buf, "quit") == 0){break;}send(sockfd, buf, N, 0);//接收服务器的消息bzero(buf, N);int len = recv(sockfd, buf, N, 0);if(len < 0){perror("recv err");break;}else if(len == 0){printf("server exit\n");break;}else{printf("recv server = %s\n", buf);}}// 5关闭连接--closeclose(sockfd);
}

服务器

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <netinet/ip.h> /* superset of previous */
#include <string.h>
#include <unistd.h>int main(int argc, char const *argv[])
{//创建套接字int serverfd = socket(AF_INET, SOCK_STREAM, 0);if(serverfd < 0){perror("socket err");return -1;}//绑定自己的地址struct sockaddr_in myaddr;socklen_t addrlen = sizeof(myaddr);memset(&myaddr, 0, addrlen);myaddr.sin_family = AF_INET;myaddr.sin_port = htons(8888);
#if 0    myaddr.sin_addr.s_addr = inet_addr("192.168.51.193");
#elsemyaddr.sin_addr.s_addr = INADDR_ANY;
#endifint ret = bind(serverfd, (struct sockaddr *)&myaddr, addrlen);if(ret < 0){perror("bind err");return -1;}//启动监听ret = listen(serverfd, 5);if(ret < 0){perror("bind err");return -1;}//接收客户端的连接//定义代表客户端的结构体变量struct sockaddr_in cliaddr;int clifd = accept(serverfd, (struct sockaddr *)&cliaddr, &addrlen);if(clifd < 0){perror("accept err");return -1;}printf("新的连接过来了\n");printf("ip = %s, port = %d\n", inet_ntoa(cliaddr.sin_addr), \ntohs(cliaddr.sin_port)); #define N 64    char buf[N] = {0};while (1){//接收客户端的消息,如果客户端退出的话,服务器也退出//接收服务器的消息bzero(buf, N);int len = recv(clifd, buf, N, 0);if(len < 0){perror("recv err");break;}else if(len == 0){printf("client exit\n");break;}else{//回发给客户端printf("recv client = %s\n", buf);send(clifd, buf, N, 0);}}close(clifd);close(serverfd);return 0;
}

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

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

相关文章

SpringBoot - java.lang.NoClassDefFoundError: XXX

问题描述 以 json-path 为例&#xff1a;java.lang.NoClassDefFoundError: com/jayway/jsonpath/Configuration 原因分析 编译不报错&#xff0c;但是运行时报错。 遇到这样类似的问题&#xff0c;首先就要想到是不是 Jar 包冲突引起的&#xff0c;或者引入的不是理想的 Jar…

机器学习(三)之监督学习2

前言&#xff1a; 本专栏一直在更新机器学习的内容&#xff0c;欢迎点赞收藏哦&#xff01; 笔者水平有限&#xff0c;文中掺杂着自己的理解和感悟&#xff0c;如果有错误之处还请指出&#xff0c;可以在评论区一起探讨&#xff01; 1.支持向量机&#xff08;Support Vector Ma…

Agent AI智能体在未来,一定与你我密不可分

随着Agent AI智能体的逐渐成熟&#xff0c;人工智能应用的不断深入与拓展&#xff0c;相信在不久的将来&#xff0c;他与你我的生活一定是密不可分的。 目录 ​编辑 1 Agent AI智能体是什么&#xff1f; 2 Agent AI在语言处理方面的能力 2.1 情感分析示例 2.2 文本分类任…

电脑已经有了一个Windows10,再多装一个Windows10组成双系统

前言 前段时间已经讲过一次双Windows系统的安装教程&#xff0c;但是小白重新去看了一下&#xff0c;发现写的内容太多&#xff0c;怕小伙伴看了之后一脸萌。 所以今天咱们就重新再来讲讲&#xff1a;在同一台机器上安装Windows10双系统的教程。 注意哦&#xff01;这里的Wi…

[论文笔记]SEARCHING FOR ACTIVATION FUNCTIONS

引言 今天带来另一篇激活函数论文SEARCHING FOR ACTIVATION FUNCTIONS的笔记。 作者利用自动搜索技术来发现新的激活函数。通过结合详尽的搜索和基于强化学习的搜索&#xff0c;通过实验发现最佳的激活函数 f ( x ) x ⋅ sigmoid ( β x ) f(x) x \cdot \text{sigmoid}(βx…

盲人旅行新纪元:科技之眼助力无障碍探索之旅

作为一名资深记者&#xff0c;我有幸深入探究并分享一项创新技术如何改变盲人群体的旅行体验。这篇文章聚焦于一款名为蝙蝠避障的辅助应用&#xff0c;它以盲人旅行伙伴的角色&#xff0c;通过实时避障与拍照识别功能&#xff0c;赋予使用者独立、自信地畅游世界的可能。让我们…

acwing算法提高之数据结构--树状数组

目录 1 介绍2 训练3 参考 1 介绍 本专题用来记录树状数组相关题目。 lowbit(x)操作&#xff0c;求数 x二进制表示中最低位的1的值&#xff0c; int lowbit(int x) {return x & -x; }树状数组&#xff1a;用来快速计算动态前缀和的数据结构。 c[x]的表示原数组以第x个数…

Visual Studio Code使用

目录 1.python的调试 2.c的运行 方法1&#xff1a; 方法2&#xff1a; 3.c的调试 3.1调试方法一&#xff1a;先生成执行文件&#xff0c;再调试 3.2调试方法二&#xff1a;同时生成执行文件&#xff0c;调试 4.tasks.json 与launch.json文件的参考 4.1C生成执行文件tas…

ZDOCK linux 下载(无需安装)、配置、使用

ZDOCK 下载 使用 1. 下载1&#xff09;教育邮箱提交申请&#xff0c;会收到下载密码2&#xff09;选择相应的版本3&#xff09;解压 2. 使用方法Step 1&#xff1a;将pdb文件处理为ZDOCK可接受格式Step 2&#xff1a;DockingStep 3&#xff1a;创建所有预测结构 1. 下载 1&…

ubuntu22.04 CH340/CH34x 驱动安装

CH34x驱动地址&#xff1a;CH341SER_LINUX.ZIP - 南京沁恒微电子股份有限公司 1、卸载旧驱动&#xff08;如果存在&#xff09; sudo rmmod ch341.ko 2、解压进入 driver 目录 unzip CH341SER_LINUX.ZIP cd CH341SER_LINUX/driver 3、编译 make 可能错误&#xff1a; make[1]…

WS-BAN模型(细粒度图像分类)

WS-BAN模型&#xff08;细粒度图像分类&#xff09; 摘要Abstract1. WS-BAN1.1 文献摘要1.2 背景1.3 创新点1.4 WS-BAN方法1.4.1 弱监督注意学习1.4.2 注意力丢弃 1.5 实验1.5.1 数据集1.5.2 实施细节1.5.3 对比试验结果 2. Transformer代码学习3. 细粒度图像分类代码复现 摘要…

ArcGIS Pro3.0软件破解版安装教程

软件名称&#xff1a;ArcGIS Pro 3.0 安装环境&#xff1a;Windows 软件大小&#xff1a;7.3GB 硬件要求&#xff1a;CPU2GHz&#xff0c;内存4G(或更高) 百度云下载链接 &#xff1a; https://pan.baidu.com/s/1CXy1MSwdQXdVnJoV2X422A 提 取 码 &#xff1a;r0w1 教学内…

mysql数据库navicat数据同步时误删除部分数据

背景介绍 听说过删库跑路被抓的&#xff0c;今天就碰到升级服务器&#xff08;Alibaba Cloud Linux ----> Ubuntu&#xff09;原因是taos3.2不支持Alibaba Cloud Linux系统&#xff01; 为了保险起见把现在这个数据库里的数据都备份一份&#xff0c;为了不耽误同事们继续开…

Zynq 7000 系列中的BootROM流程及BootROM Header简介

BootROM Code是在系统复位后执行的一段代码&#xff0c;用于配置PS&#xff08;处理器系统&#xff09;。本文将详细解释BootROM的启动过程及BootROM Header的格式。 1 BootROM流程 Zynq 7000在系统复位后进行配置。整个启动过程在图6-1中进行了说明&#xff0c;而BootROM的执…

公司服务器中的kafka消息中间件挂了,我是如何修复的?

今天的公司的system系统服务在运行过程中&#xff0c;提示连接不上kafuka的消息中间件。但是负责kafka的同事已经离职了&#xff0c;询问公司开发也不知道如何处理&#xff0c;我是如何重启kafka消息中间件使system系统服务正常运行&#xff1f; 查看kafka的安装位置 在下面的…

高扬程水泵的性能与应用领域 /恒峰智慧科技

在现代社会中&#xff0c;科技的发展为我们的生活带来了无数便利和可能性。其中&#xff0c;高扬程水泵作为一种高效能的水泵&#xff0c;其独特的设计使其在各个领域都有着广泛的应用&#xff0c;尤其是在森林消防中。 一、高扬程水泵的性能 1. 高扬程&#xff1a;高扬程水泵…

制造型企业 如何实现便捷的机台文件统一管理?

机台文件统一管理&#xff0c;这是生产制造型企业都需要去做的&#xff0c;机台文件需要统一管理的原因主要包括以下几点&#xff1a; 1、提高效率&#xff1a;统一管理可以简化文件的访问和使用过程&#xff0c;提高工作效率&#xff0c;尤其是在需要频繁访问或更新机台文件的…

在 Vue 中预加载组件

在 Vue 中&#xff0c;利用 VueRouter 可以轻松的实现两个组件&#xff08;页面&#xff09;之间的切换&#xff0c;有个常用的设计就是需要在登录页登录后跳转至一个内容页&#xff0c;通常的做法是在登录校验完成之后立即切换路由至内容页&#xff0c;接着内容页发送网络请求…

SpringBoot (批量)生成二维码工具类多种方法示例

一、引入依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.4.1</version> </dependency><dependency><groupId>com.google.zxing</groupId><artifactId…

Jmeter05:配置环境变量

1 Jmeter 环境 1.1 什么是环境变量&#xff1f;path什么用&#xff1f; 系统设置之一&#xff0c;通过设置PATH&#xff0c;可以让程序在DOS命令行直接启动 1.2 path怎么用 如果想让一个程序可以在DOS直接启动&#xff0c;需要将该程序目录配置进PATH 1.3 PATH和我们的关系…