首页 > 其他分享 >socket流程及相关函数接口

socket流程及相关函数接口

时间:2024-11-26 09:03:32浏览次数:9  
标签:sockaddr socket int 流程 struct 接口 接字 addr

目录

​编辑

 socket类型

socket创建流程

函数接口

socket

connect

sockaddr结构体

bind

listen

accept

recv/send

close


 socket类型

流式套接字(SOCK_STREAM)   TCP

提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。

数据报套接字(SOCK_DGRAM)  UDP

提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。

原始套接字(SOCK_RAW)

可以对较低层次协议如IP、ICMP直接访问。

socket创建流程

服务器:
   1.创建流式套接字(socket())------------------------>  有手机
   2.指定本地的网络信息(struct sockaddr_in)----------> 有号码
   3.绑定套接字(bind())------------------------------>绑定电话
   4.监听套接字(listen())---------------------------->待机
   5.链接客户端的请求(accept())---------------------->接电话
   6.接收/发送数据(recv()/send())-------------------->通话
   7.关闭套接字(close())----------------------------->挂机

客户端:
   1.创建流式套接字(socket())----------------------->有手机
   2.指定服务器的网络信息(struct sockaddr_in)------->有对方号码
   3.请求链接服务器(connect())---------------------->打电话
   4.发送/接收数据(send()/recv())------------------->通话
   5.关闭套接字(close())--------------------------- >挂机

函数接口

socket

int socket(int domain, int type, int protocol);
//作用:创建一个socket通信描述符
domain:指定通信的域(通信协议)
    AF_UNIX, AF_LOCAL   本地通信
    AF_INET  ipv4
    AF_INET6  ipv6
type:指定socket的类型
    SOCK_STREAM:流式套接字,接下来我们的通信使用TCP协议
    SOCK_DGRAM:数据报套接字,接下来我们的通信使用UDP协议
protocol:填0    

返回值:如果成功,返回创建的描述符,如果失败,返回-1

connect

int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
作用:请求连接服务器
参数:
sockfd:上面socket接口得到的描述符
addr:相当于服务器的地址(IP+port)
addrlen:地址的长度,因为前面的地址是可变的,所以要通过参数来协定地址的长度
返回值:
0 -1

sockaddr结构体

//从bind接口的帮助文档中拿到
struct sockaddr {
               sa_family_t sa_family;
               char        sa_data[14];
           }
上述地址结构是一个通用结构,我们在用实际协议进行通信的时候,需要转换成相应协议的结构体。
用man 7 ip来查看ipv4对应的结构体

struct sockaddr_in {
   sa_family_t    sin_family; /* 地址协议族,=socket接口第一个参数 */
   in_port_t      sin_port;   /* 指定端口,端口要用网络字节序(大端) */
   struct in_addr sin_addr;   /* IP地址 */
};

/* Internet address. */
struct in_addr {
   uint32_t       s_addr;     /* address in network byte order */
};


bind

int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);
作用:绑定服务器地址:IP和端口,相当于对外公开自己的IP和端口,客户端就可以连接了
addr:绑定的IP和端口结构体,注意绑定的是自己的IP和端口
    IP:取真实的某个网卡的地址,也可以直接写0.0.0.0
addrlen:地址的大小  

listen

int listen(int sockfd, int backlog);
作用:进入监听状态,以便接收客户端的连接
sockfd:上面的服务器描述符
backlog:同时能处理的客户端的连接数量,写个5 10都可以
返回值:0 -1

accept

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
接收客户端连接,注意,这是一个阻塞接口,如果没有新的连接过来,那么会等待
sockfd:上面的服务器描述符
addr:客户端的地址(来电显示)
addrlen:客户端地址的长度,是入参,传入然后可能会被接口修改

返回值:如果成功,会返回一个非负的整数,代表接收的新的连接的描述符

recv/send

//recv和send是网络的专用接口,比起read和write只是多了一个flags参数,flag一般情况下会取0,代表阻塞接受和发送
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
返回值:
    >0:接收的字节数
    <0:失败
    =0:代表对端退出了
ssize_t send(int sockfd, const void *buf, size_t len, int flags);

close

int close(int fd);
关闭套接字连接

标签:sockaddr,socket,int,流程,struct,接口,接字,addr
From: https://blog.csdn.net/cancannidshyshy/article/details/144029943

相关文章

  • 抽象类和接口
    1、抽象类定义:在面向对象的概述中,所有的对象都是通过类来描述的,但是反过来,并不是所有类都是描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。特点:1、抽象类中可以存在抽象方法,抽象方法被abstract修饰,该方法可以没有具体实现(但反过来,当一......
  • Java成员特点与接口的各种关系 牛顿迭代法计算平方根
    1.(1)importjava.util.Scanner;publicclasstest{publicstaticvoidmain(String[]args){irrl=newirr();l.method();Scannersc=newScanner(System.in);sc.next();}}(2)publicinterfaceinter{//默认在int前加......
  • 接口_演练
    参考:接口-java教程-廖雪峰的官方网站接口引入publicabstractclassPerson{privateStringname;//String是基本类型吗?如果不是,那是什么类型privateintage;publicPerson(Stringname,intage){this.name=name;this.age=age;......
  • 接口练习_动物王国
    问题描述请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口AnimalInfo,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口AnimalInfo里的方法输出一条有语句“鸟儿飞翔”,重写父类的eat()方法输出一条语句“鸟儿吃虫”。创建T......
  • 37. socketserver模块
    一、socketserver模块  SocketServer是标准库中的一个高级模块,它的目标是简化很多样板代码,它们是创建网络客户端和服务器所必须的代码。这个模块中有为你创建的各种各样的类。类描述BaseServer包含核心服务器功能和min-in类的钩子;仅用于推导,这样不会创建这个类的......
  • 第4天:基础入门-Web应用&蜜罐系统&堡垒机运维&API内外接口&第三方拓展结构&部署影响
    #知识点:1、基础入门-Web应用-蜜罐系统2、基础入门-Web应用-堡垒机运维3、基础入门-Web应用-内外API接口4、基础入门-Web应用-第三方拓展架构一、蜜罐:https://hfish.net/测试系统:Ubuntu20.04一键安装:bash<(curl-sS-Lhttps://hfish.net/webinstall.sh)1、有......
  • 【Azure 环境】从Azure AD(Entra ID)中获取的Token在访问自定义的接口应用时验证不通
    问题描述集成AzureAD(新名称MicrosoftEntraID),拿到对应的accessToken作为登录用的凭证。这个 AccessToken 能够正常返回,并作为Microsoft Graph userinfoAPI的Authorization,因为应用中会对前端传递过来的 AccessToken进行校验合法性。但目前遇见的问题时这个 Token 签......
  • 用python、JAVA等多种语言的实例代码演示教你如何免费获取股票数据(实时数据、历史数据
    ​近一两年来,股票量化分析逐渐受到广泛关注。而作为这一领域的初学者,首先需要面对的挑战就是如何获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的核心任务是从这些数据......
  • AddIPAddress添加临时IP后,socket bind失败
    问题描述在Win10\Win11下使用addIPAddress添加临时IP成功后,立即创建socket,bind失败if(!m_socket->bind(QHostAddress(m_localIP),listenPort)){qCritical()<<QString("binderror%1").arg(m_socket->errorString());return;}错误输出:binderror这个地......
  • 如何用通义灵码快速绘制流程图?
    使用通义灵码快速绘制流程图?新功能体验不想读前人“骨灰级”代码,不想当“牛马”程序员,想像看图片一样快速读复杂代码和架构?通义灵码已经支持代码逻辑可视化,可以把你的每段代码画成流程图。像个脑图工具一样帮你图文并茂画出代码逻辑和框架,再也不用迷失在代码迷宫啦!也跟......