4、网络编程——TCP相关的API及其实现的步骤

目录

一、API

1、listen(连接套接字)

2、accept(等待连接)

注意

3、send(向TCP套接字发送数据)

4、recv(从TCP套接字收取数据)

5、connect(连接对端监听套接字)

二、使用步骤

1、服务端

2、客户端

三、代码

1、服务器(接收端)

2、客户端(发送方)

一、API

1、listen(连接套接字)

将带连接套接字设置为监听套接字,并设置最大同时接收连接请求个数

int listen(int sockfd, int backlog);
参数:
    sockfd:待连接套接字
    backlog:最大同时接收连接请求个数
返回值:
    成功:0,并将 sockfd 设置为监听套接字
    失败:-1

由于历史原因,各种系统对 backlog 的理解并不一致,以 LINUX 为例,监听端能同时接收的 最大连接请求个数为 backlog+4

2、accept(等待连接)

​
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数:
    sockfd:监听套接字
    addr:通用地址结构体,用以存储对端地址(IP+PORT)
    addrlen:参数 addr 的存储区域大小
返回值:
    成功:已连接套接字(非负整数)
    失败:-1

​

注意

        该函数是用来等待客户端连接的, 如果有新的客户端连接上来那么该函数会返回一个新的sockfd 作为该客户端的连接套接字。

        如果把accept 写在循环体内部, 该函数会造成阻塞, 同时如果有多个客户端连接那么该函数会返 回这些客户所对应的多个已连接套接字。

3、send(向TCP套接字发送数据)

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
参数:
    sockfd:已连接套接字
    buf:即将被发送的数据
    len:数据长度
    flags:发送标志。
        MSG_NOSIGNAL:当对端已关闭时,不产生 SIGPIPE 信号
        MSG_OOB:发送紧急(带外)数据,只针对 TCP 连接
返回值:
    成功:已发送字节数
    失败:-1

当 flags 为 0 时,send 与 write 作用相同。

4、recv(从TCP套接字收取数据)

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
参数:
    sockfd:已连接套接字
    buf:存储数据缓冲区
    len:缓冲区大小
    flags:接收标志
        MSG_OOB:接收紧急(带外)数据
返回值:
    成功:已接收字节数
    失败:-1

注意:当 flags 为 0 时,recv 与 read 作用相同。

5、connect(连接对端监听套接字)

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数:    
    sockfd:待连接套接字
    addr:包含对端地址(IP+PORT)的通用地址结构体的指针
    addrlen:地址结构体大小
返回值:
    成功:0
    失败:-1

二、使用步骤

1、服务端

(1)创建实现通信的工具(socket)

(2)设置IP+端口号

(3)绑定端口号等信息(bind)

(4)设置监听(listen)

(5)等待客户端连接(accept)

(6)互相聊天(send、recv)

(7)关闭聊天(套接字)

2、客户端

(1)创建实现通信的工具(socket)

(2)设置需要连接的服务区的IP地址以及端口号

(3)尝试连接服务器(connect)

(4)相互聊天(send、recv)

(5)关闭聊天(套接字)

三、代码

1、服务器(接收端)

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>  // 包含了地址结构体的定义声明
#include <netinet/in.h>
#include <pthread.h>
#include <stdbool.h>


int main(int argc, char const *argv[])
{
    // 创建一个套接字 (购买一台手机)
    //IPV4、流式套接字
    int sock_fd = socket( AF_INET , SOCK_STREAM , 0 ); // 使用IPV4协议簇, 流式套接字(TCP)
    if (-1 == sock_fd)
    {
        perror("socket rror");
        return -1 ;
    }
    

    // 配置自己的IP和端口号等信息
    // struct sockaddr_in   // IPV4地址结构体
    // {
    //     u_short sin_family;// 地址族
    //     u_short sin_port;// 端口
    //     struct in_addr sin_addr;// IPV4 地址
    //     char sin_zero[8];
    // };
    int addrlen = sizeof(struct sockaddr_in);
    struct sockaddr_in my_addr = {
        .sin_addr.s_addr = htonl(INADDR_ANY) , // 设置服务器的地址, INADDR_ANY 指本机中任何一个地址
        .sin_family = AF_INET , // 使用 IPV4 协议簇
        .sin_port = htons(65000) // 设置服务器的端口号为  65000 
    };

    // 绑定地址信息 (IP + 端口号 + 协议簇)
    int ret_val =  bind(  sock_fd,  (struct sockaddr *)&my_addr, addrlen);
    if (ret_val == -1 )
    {
        perror("bind error");
        return -1 ;
    }else{
        printf(" bind succeed !!\n") ;
    }
    
    // 设置监听 (打开铃声)
    if(listen( sock_fd,  5 )) // 设置sock_fd 为监听套接字, 同时可以接收连接请求数为  5 + 4(默认值) 
    {
        perror("listen error");
        return -1 ;
    }

    // 等待连接
    struct sockaddr_in from_addr; 
    int connect_fd = accept( sock_fd , (struct sockaddr *)&from_addr, &addrlen);
    if (connect_fd == -1 )
    {
        perror("connect error");
        return -1 ;
    }
    else{
        printf("connect succeed !!\n");
    }
    
    // 聊天
    char * msg = calloc(128,1);
    while(1)
    {
        bzero(msg , 128 );
        ret_val =  recv(connect_fd , msg , 128 , 0 );
        if ( ret_val != -1 )
        {
            printf("recv msg : %s " , msg );
        }
        else{
            perror("recv error !!");
        }
    }
    // 关闭套接字
    close(sock_fd);
   
    return 0;
}

2、客户端(发送方)

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>  // 包含了地址结构体的定义声明
#include <netinet/in.h>
#include <pthread.h>
#include <stdbool.h>


int main(int argc, char const *argv[])
{
    // 创建一个套接字 (购买一台手机)
    int sock_fd = socket( AF_INET , SOCK_STREAM , 0 ); // 使用IPV4协议簇, 流式套接字(TCP)
    if (-1 == sock_fd)
    {
        perror("socket rror");
        return -1 ;
    }
    

    // 配置自己的IP和端口号等信息
    // struct sockaddr_in   // IPV4地址结构体
    // {
    //     u_short sin_family;// 地址族
    //     u_short sin_port;// 端口
    //     struct in_addr sin_addr;// IPV4 地址
    //     char sin_zero[8];
    // };
    int addrlen = sizeof(struct sockaddr_in);
    struct sockaddr_in server_addr = {
        .sin_addr.s_addr = inet_addr("192.168.102.2") , // 设置服务器的地址
        .sin_family = AF_INET , // 使用 IPV4 协议簇
        .sin_port = htons(65000) // 设置服务器的端口号为  65000 
    };

  
    // 连接服务器
    if( connect(sock_fd , (const struct sockaddr *)&server_addr, addrlen))
    {
        perror("connect error");
        return -1 ;
    }

    
    // 聊天
    char * msg = calloc(128,1);
    while(1)
    {
        bzero(msg , 128 );
        fgets(msg , 128 , stdin);
        int ret_val =  send(sock_fd , msg , strlen(msg) , 0 );
        if ( ret_val != -1 )
        {
            printf("send msg succeed : %d byte \n" , ret_val );
        }
        else{
            perror("send error !!");
        }
    }

    // 关闭套接字
    close(sock_fd);
    

    return 0;
}

上述程序缺点

若客户端突然掉线,服务器奔溃(需要三次握手)

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

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

相关文章

Agisoft Metashape 坐标系选择 坐标转换

Metashape 坐标系选择 坐标转换 文章目录 Metashape 坐标系选择 坐标转换前言一、软件设置二、坐标系选择1.有带号坐标系选择2.无带号坐标系选择二、坐标转换(以WGS84转CGCS2000投影坐标系为例)1.保存目标坐标系2.坐标转换前言 随着无人机技术的不断发展,越来越多的无人机搭…

Docker快速搭建SkyWalking[ OAP UI[登录] Elasticsearch]

文章目录[前置]&#xff1a;搭建ELasticsearch相关[零]&#xff1a;虚拟机开放SkyingWalking和ES相关端口[一]&#xff1a;拉取SkyWalking-oap和SkyWalking-ui镜像[二]&#xff1a; 运行SkyWalking的oap和ui 容器 2.1 - 运行Skywalking-oap容器 ---- 注意oap运行参数异常 no pr…

分享89个ASP影音娱乐源码,总有一款适合您

分享89个ASP影音娱乐源码&#xff0c;总有一款适合您 89个ASP影音娱乐源码下载https://pan.baidu.com/s/1rg1dDz51zFiocnrl6lIqTw?pwdg7q9 提取码&#xff1a;g7q9 import os import shutilimport requests from bs4 import BeautifulSoupfrom framework.base.BaseFrame i…

【AI面试】BN(Batch Norm)批量归一化

在提到批量归一化的面试问题时候&#xff0c;一般会以以下几种形式提问&#xff1a; 为什么要引入BN&#xff1f;BN解决了什么问题&#xff1f;BN的公式是怎样的&#xff1f;BN公式中&#xff0c;有哪些参数是可学的&#xff1f;BN中&#xff0c;均值和方差的尺寸shape是什么样…

学习系统编程No.14【动静态库】

引言&#xff1a; 北京时间&#xff1a;2023/4/3/7:06&#xff0c;刚刚晨跑回来&#xff0c;为了摆脱困意&#xff0c;刷了一下视屏&#xff0c;哈哈哈&#xff01;我发现我每次刷视屏都是被迫的&#xff0c;都是看到某个感兴趣的标题&#xff0c;然后点进去一看&#xff0c;就…

计算机组成原理 --- 数据的表示和运算

一.进位计数制 1.由位置确定的权重为位权 --- 比如个位的位权是10的0次方&#xff0c;十位的位权是10的1次方... 1.十进制的基数是 --- 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;8&#xff0c;9 &#xff…

硬件工程师需要掌握的PCB设计常用知识点

一个优秀的硬件工程师设计的产品一定是既满足设计需求又满足生产工艺的&#xff0c;某个方面有瑕疵都不能算是一次完美的产品设计。规范产品的电路设计&#xff0c;工艺设计&#xff0c;PCB设计的相关工艺参数&#xff0c;使得生产出来的实物产品满足可生产性、可测试性、可维修…

五分钟了解三门问题是什么?贝叶斯公式和蒙提霍尔问题有什么关联?

五分钟了解三门问题是什么&#xff1f;贝叶斯公式和蒙提霍尔问题有什么关联&#xff1f;1. 导读2. 题目描述3. 蒙提霍尔问题4. 朴素分析4.1 不换的1/2派4.2 调换的2/3派4.3 分歧所在5. 数学分析5.1 独立事件的概率和条件概率5.2 贝叶斯公式5.3 先验概率和后验概率6. 贝叶斯公式…

C++ 每日一练

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 C 每日一练前言一、因数-数字游戏二、通货膨胀-x国货币三、熊孩子拜访前言 突然想起了C&#xff0c;很久没用过了&#xff0c;python真香&#xff0c;为了做个正经程序人&am…

ChatGPT全球大封号!数10万企业停摆:第一批玩AI的人,被AI给玩了

观点| Mr.K 主笔| Wendy.L 编辑| Emma来源| 技术领导力(ID&#xff1a;jishulingdaoli)3月31日&#xff0c;Open AI就开始无征兆的进行全球大封号&#xff0c;其中亚洲是重灾区&#xff0c;官方没有给出任何声明&#xff0c;具体原因不得而知。并且暂停了这些地区新账号的注…

【数据结构】线性表(顺序存储和链式存储)两种方法,细节满满,保你学会

⭐⭐⭐⭐⭐⭐ &#x1f38a;专栏【数据结构】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【勋章】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; ⭐⭐⭐⭐⭐⭐ 目录 ⭐定义&#xff1a; ⭐ 理解&…

node Mongodb 修改数据库返回的值

需求&#xff1a; 获取”topic”表的数据&#xff0c;再根据话题id查询“article表”中对应话题的文章的数量 文章目录初始写法问题分析解决方案完整代码总结其他文件初始写法 看pushArticleNum 中的********************重点部分&#xff1a;会发现我虽然赋值了&#xff0c;…

HulaCWMS呼啦企业网站管理系统 v3.0.4

HulaCWMS(呼啦企业网站管理系统)是基于ThinkPHP5框架开发&#xff0c;安全高效&#xff0c;包括ThinkPHP5的所有特性。专注于企业、政府单位网站建设&#xff0c;以免费开源的方式&#xff0c;帮助广大站长、个人或企业开发者大大降低了开发成本和维护成本。快速锁定意向客户&a…

vscode设置选中代码自定义高亮颜色

vscode设置选中代码自定义高亮颜色 按照如下步骤&#xff0c;点击步骤3的小图标&#xff0c;进入settings.json 在文件的末尾填充如下代码 "workbench.colorCustomizations": {"editor.selectionBackground": "#62CDFF"}就像是这样 其中"…

4个令人惊艳的ChatGPT项目,开源了!AIGC也太猛了...

大家好啊&#xff5e; 自从 ChatGPT、Stable Diffusion 发布以来&#xff0c;各种相关开源项目百花齐放&#xff0c;着实让人应接不暇。 今天&#xff0c;我将着重挑选几个优质的开源项目&#xff0c;对我们的日常工作、学习生活&#xff0c;都会有很大的帮助。 今天整理分享…

【vue2.0后台项目之登陆】01登陆开发流程分析

登陆开发流程1.前言2.vue-admin-template模板介绍3. vue-admin-template模板结构分析4.axios的二次封装5.请求后端接口6.表单验证7.派发action&#xff0c;在action中发起请求8.token的用处1.前言 本文将致力于描述一个vue2.0后台系统的登陆业务流程&#xff0c;从后台项目常用…

剑指 Offer 56 - I. 数组中数字出现的次数

理想的人物不仅要在物质需要的满足上&#xff0c;还要在精神旨趣的满足上得到表现。 —— 黑格尔 目录 方法1&#xff1a;排序指针 方法2&#xff1a;异或整个数组 题目&#xff1a; 一个整型数组 nums 里除两个数字之外&#xff0c;其他数字都出现了两次。请写程序…

理想汽车的雷达在无人陵园内看到鬼?网友:按一下喇叭看会不会聚过来!

‍数据智能产业创新服务媒体——聚焦数智 改变商业一般而言&#xff0c;科学与鬼神是毫不沾边的。但是&#xff0c;在自动驾驶领域&#xff0c;他们却产生了联系。日前&#xff0c;一位辽宁沈阳的理想汽车车主在社交媒体发布视频称&#xff0c;自己的理想L9在空无一人的陵园道…

Python 高级编程(文件操作)

文件&#xff1a;存储在某种长期存储设备上的数据&#xff01;&#xff01;包括&#xff08;硬板 u 盘 移动硬盘 光盘&#xff09; 计算机中临时的数据&#xff1a; 存储在内存中&#xff0c;一旦操作结束&#xff0c;内存中的空间就会被释放 文件&#xff08;特指普通文本&am…

TCP / IP 模型

TCP / IP 模型&#x1f50e;TCP / IP 模型应用层传输层网络层数据链路层物理层&#x1f50e;结尾&#x1f50e;TCP / IP 模型 应用层 只关注传输过来的数据做什么 (上层协议调用下层协议,下层协议为上层协议提供支持) 传输层 不考虑中间节点, 只关注起点和终点 举个栗子&am…
最新文章