Socket编程接口API并实现简单的TCP网络编程

news2024/9/20 20:50:09

#include <sys/types.h>
#include <sys/socket.h>
socket()创建套接字,成功返回套接字的文件描述符,失败返回-1
domain: 设置套接字的协议簇, AF_UNIX AF_INET AF_INET6
type: 设置套接字的服务类型 SOCK_STREAM SOCK_DGRAM
protocol: 一般设置为 0,表示使用默认协议
int socket(int domain, int type, int protocol);


bind()将 sockfd 与一个 socket 地址绑定,成功返回 0,失败返回-1
sockfd 是网络套接字描述符
addr 是地址结构
addrlen 是 socket 地址的长度
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);


listen()创建一个监听队列以存储待处理的客户连接,成功返回 0,失败返回-1
sockfd 是被监听的 socket 套接字
backlog 表示处于完全连接状态的 socket 的上限
int listen(int sockfd, int backlog);


accept()从 listen 监听队列中接收一个连接,成功返回一个新的连接 socket,
该 socket 唯一地标识了被接收的这个连接,失败返回-1
sockfd 是执行过 listen 系统调用的监听 socket
addr 参数用来获取被接受连接的远端 socket 地址
addrlen 指定该 socket 地址的长度
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);


connect()客户端需要通过此系统调用来主动与服务器建立连接,成功返回 0,失败返回-1
sockfd 参数是由 socket()返回的一个 socket。
serv_addr 是服务器监听的 socket 地址
addrlen 则指定这个地址的长度
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);


close()关闭一个连接,实际上就是关闭该连接对应的 socket
int close(int sockfd);


TCP 数据读写:
recv()读取 sockfd 上的数据,buff 和 len 参数分别指定读缓冲区的位置和大小
send()往 socket 上写入数据,buff 和 len 参数分别指定写缓冲区的位置和数据长

flags 参数为数据收发提供了额外的控制
ssize_t recv(int sockfd, void *buff, size_t len, int flags);
ssize_t send(int sockfd, const void *buff, size_t len, int flags);


UDP 数据读写:
recvfrom()读取 sockfd 上的数据,buff 和 len 参数分别指定读缓冲区的位置和大

src_addr 记录发送端的 socket 地址
addrlen 指定该地址的长度
sendto()往 socket 上写入数据,buff 和 len 参数分别指定写缓冲区的位置和数据长

dest_addr 指定接收数据端的 socket 地址
addrlen 指定该地址的长度
ssize_t recvfrom(int sockfd, void *buff, size_t len, int flags,
struct sockaddr* src_addr, socklen_t *addrlen);
ssize_t sendto(int sockfd, void *buff, size_t len, int flags,
struct sockaddr* dest_addr, socklen_t addrlen);

TCP:面向连接的,可靠的字节流服务。

可靠性:应答确认,超时重传,去重,乱序重排,滑动窗口(进行流量控制)

服务端

 

#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<arpa/inet.h>
int main()
{
    int sockfd = socket(AF_INET,SOCK_STREAM,0);//创建套接字
    if(socfd == -1)
    {
        exit(1);
    }
    struct sockaddr_in  saddr;//创建服务端和客户端专用地址
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = AF_INET;//地址族
    saddr.sin_port = htons(6000);//端口号
    saddr.sin_addr.s_addr = inet_addr("127.0.0.1");//127.0.0.1相当于自己的主机
    int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));//指定套接字的地址(ip port)
    if(res == -1)
    {
        perror("bind err\n");
    	exit(1);
    }
    listen(sockfd,5);//5的意义:在linux系统上,设置已完成三次握手的监听队列大小  
    while(1)
    {
        struct sockaddr_in  caddr;//accept会初始化caddr,所以传参是以指针方式
        int len = sizeof(caddr);
        int c = accept(sockfd,(struct sockaddr*)&caddr,&len);//客户端的描述符
        if(c<0)
        {
            continue;
        }
        printf("accept c=%d,ip=%s,port=%d\n",c,inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port));//打印客户端的IP地址和端口
        while(1)
        {
            char buff[128] = {0};
        	int n = recv(c,buff,127,0);//接收数据
            if(n<=0)//客户端关闭的唯一标志返回值等于0
            {
                break;
            }
        	printf("buff=%s\n",buff);
        	send(c,"ok",2,0);//发送数据
        }
        close(c);
    }
    close(sockfd);
    exit(0);
}

客户端

 

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

int main()
{
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(sockfd == -1)
    {
        exit(1);
    }
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(6000);
    saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    int res = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if(res == -1)
    {
        perror("connect err\n");
        exit(1);
    }
    while(1)
    {
        printf("input:\n");
        char buff[128]={0};
    	fgets(buff,128,stdin);
        if(strncmp(buff,"end",3)==0)
        {
            break;
        }
    	send(sockfd,buff,strlen(buff),0);
        memset(buff,0,128);
    	int n=recv(sockfd,buff,127,0);//ok
        if(n<=0)
        {
            break;
        }
    	printf("buff=%s\n",buff);
    }
    close(sockfd);
    exit(0);
}

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

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

相关文章

云计算运维工程师需要会哪些技术

目前处于云年代&#xff0c;云计算运维工程师的工作远景还是十分广泛的。像是阿里云计算&#xff0c;滴滴&#xff0c;抖音等等互联网大厂目前都在使用云计算技能。 云计算运维工程师的薪资水平也十分可观。 运维工程师(Operations)&#xff0c;在国内又称为运维开发工程师(D…

一文弄懂Java日志框架

文章目录 日志的概念日志门面JUL日志框架JUL架构入门案例日志的级别Logger之间的父子关系日志的配置文件日志原理解析 LOG4J日志框架Log4j入门Log4j组件LoggersAppendersLayouts Layout的格式Appender的输出自定义Logger JCL日志门面JCL入门JCL原理 SLF4J日志门面SLF4J入门绑定…

风控策略基本功 | 授信额度(上)

通过调整额度&#xff0c;银行可以根据客户的实际情况和风险水平&#xff0c;灵活地匹配资金需求和风险承受能力。有助于确保风险控制、提高资金利用效率&#xff0c;并满足客户的需求。有效的额度调整能够避免过度或不足的授信&#xff0c;最大程度地降低违约风险&#xff0c;…

水印抹除算法总结

基本是从图片抹水印和视频抹水印两个方向 Video Inpainting&#xff1a;https://paperswithcode.com/task/video-inpaintingImage Inpainting&#xff1a;https://paperswithcode.com/task/image-inpainting 请根据目录查看 图片 Partial Conv 部分卷积层 源自于Image In…

Github Pages

官方教程&#xff1a;https://pages.github.com/ 1 创建仓库 命名为 你的名字.github.io 克隆项目 git clone https://github.com/username/username.github.io加入index.html页面 在克隆的项目中&#xff0c;加入一个index.html html文件简单写几个dom <!DOCTYPE html…

Redis - 附近商铺、用户签到、UV统计

文章目录 附近商铺、用户签到、UV统计一、附近商铺1.1 GEO数据结构1.2 导入店铺数据到GEO1.3 实现附近商户功能 二、用户签到2.1 BitMap2.2 签到功能2.3 统计连续签到2.3.1 分析2.3.2 代码实现 三、UV统计3.1 HyperLogLog用法3.2 测试百万数据的统计 附近商铺、用户签到、UV统计…

康复锻炼改善帕金森病人的功能障碍,你知道多少?快来学习!

帕金森病是一种神经系统退行性疾病&#xff0c;主要特征是肌肉僵硬、震颤和运动障碍等症状。虽然这个病无法彻底治愈&#xff0c;但通过康复锻炼可以显著改善患者的功能障碍。 首先&#xff0c;康复锻炼可以改善帕金森病人的肌肉僵硬。这种运动障碍是由于黑斑核和大脑皮层之间的…

RV1126笔记三十八:PaddleOCR部署到RV1126

若该文为原创文章&#xff0c;转载请注明原文出处。 一、环境 1、硬件&#xff1a;正点原子RV1126开发板 2、环境&#xff1a;ubuntu16.04 二、模型转换 训练后的模型不能直接使用在RV1126,需要转换一下模型 1、PaddlePaddle的模型转成推理模型 在前面有提过了&#xf…

三次样条曲线的偏移计算方法比较

最近&#xff0c;我不得不想出一种方法&#xff0c;从三次 Hermite 样条曲线创建平行曲线&#xff0c;例如铁路车道。 首先&#xff0c;我只是沿着法线方向移动它们的开始/结束控制点&#xff0c;同时保持相同的开始/结束切线。 它在大多数情况下工作得很好&#xff0c;因为我的…

Qt画图框架,实现自己的画图框架

前面也讲到Qt提供画图框架&#xff0c;经典MVC模型&#xff0c;也没有什么问题。但Qt仅提供框架性东西&#xff0c;很难落地&#xff0c;很难应用在实际项目当中&#xff0c;一般需要自己捋一遍&#xff0c;这样才能理解好 什么view&#xff0c;canvas都好理解&#xff0c;只要…

Elasticsearch【文档操作、搜索操作、入门案例】(五)-全面详解(学习总结---从入门到深化)

目录 原生JAVA操作ES_文档操作 原生JAVA操作ES_搜索操作 SpringDataES_入门案例 原生JAVA操作ES_文档操作 新增&修改文档 Test public void addDocument() throws IOException {// 1.创建客户端对象&#xff0c;连接ESRestHighLevelClient client new RestHighLevelC…

API安全基础理论

1.什么是API API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。通过淘宝API&#xff0c;就…

测试完OLED屏对比LCD屏后:液晶面板拥趸们无话可说了

关于笔记本的屏幕&#xff0c;从大的技术上来分类可以分成两类&#xff0c;一种是OLED材质&#xff0c;另外一种是LCD材质。前些年的笔记本基本都采用的是LCD材质&#xff0c;但近几年随着OLED屏幕的崛起&#xff0c;大多数笔记本都采用了OLED材质。 那么&#xff0c;你知道LCD…

ChatGPT能为留学生做什么?错误使用有何后果?

随着AI人工智能行业的迅速发展&#xff0c;越来越多的学生开始利用ChatGPT等软件来获得更高效便利的论文和作业辅助。 然而&#xff0c;我们需要认识到一个严肃的问题&#xff1a;学生是否过度依赖AI助手来完成毕业论文。 近期出现的Turnitin AI Detector是一个用于帮助教师确…

Xamarin.Android | 界面跳转到手机自带的自启动管理界面,引导用户将APP加入自启动

Xamarin.Android | 界面跳转到手机自带的自启动管理界面&#xff0c;引导用户将APP加入自启动 文章目录 Xamarin.Android | 界面跳转到手机自带的自启动管理界面&#xff0c;引导用户将APP加入自启动前言示例代码自启动界面URI字典打开自启动管理界面 结束语 前言 很多 Androi…

【算法 -- LeetCode】(14) 最长公共前缀

1、题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例 1&#xff1a; 输入&#xff1a;strs [“flower”,“flow”,“flight”] 输出&#xff1a;“fl” 示例 2&#xff1a; 输入&#xff1a;strs [“dog”,“…

【unity实战】使用shader和shader Graph实现2d图片描边效果(附源码)

文章目录 前言Shader1. 内描边2. 外描边 Shader Graph1. 2d图片描边2. 带炫光的2d图片描边 最终演示效果源码参考完结 前言 最近在学习shader Graph相关内容&#xff0c;其实关于实现2d图片描边效果&#xff0c;网上可以看到很多教程&#xff0c;但是我发现大多数都是基于比较…

2023最新整理的 Elasticsearch 21道面试题

1、为什么要使用 Elasticsearch? 系统中的数据&#xff0c; 随着业务的发展&#xff0c; 时间的推移&#xff0c; 将会非常多&#xff0c;而业务中往往采用模糊查询进行数据的 搜索&#xff0c;而模糊查询会导致查询引擎放弃索引&#xff0c; 导致系统查询数据时都是全表扫描&…

Unity3D 场景添加obj模型

有一个立方体的obj模型&#xff1b;将其拖到Assets文件夹节点上&#xff0c;在此节点放手&#xff0c;资源被加入项目&#xff1b; 在右侧显示出对象概览&#xff1b; 点击箭头&#xff0c;显示此模型下的子对象&#xff1b; 然后按住Assets面板中的cube1对象&#xff0c;拖动…

3分钟阿里云轻量应用服务器和云服务器的区别对比

阿里云服务器ECS和轻量应用服务器有什么区别&#xff1f;云服务器ECS是明星级云服务器&#xff0c;轻量应用服务器可以理解为简化版的云服务器ECS&#xff0c;轻量适用于单机应用&#xff0c;云服务器ECS适用于集群类高可用高容灾应用&#xff0c;阿里云百科来详细说下阿里云轻…