首页 > 其他分享 >day01

day01

时间:2023-08-22 18:44:35浏览次数:130  
标签:addr struct sockaddr int day01 sockfd socket

一、进程间通信-socket套接字     基本特征:socket是一种接口技术,被抽象成一种文件的操作,可以让同一计算机中的不同进程之间通信,也可以让不同计算机中的进程进行通信(网络通信)         本地进程间通信编程模型:                 进程A                     进程B              创建socket对象            创建socket对象       准备通信地址(本地socket文件)       准备通信地址             绑定socket和地址                ···                 监听                       ···                等待连接                    连接              接收、发送数据             发送、接收数据              关闭socket                 关闭socket              删除socket
        注意:底层需要借助socket文件,才能进行同一计算机中不同进程的通信
        int socket(int domain,int type,int protocol)         功能:创建socket对象             domain:                 AF_UNIX/AF_LOCAL    本地通信,进程间通信                 AF_INET             基于IPv4地址通信                 AF_INET6            基于IPv6地址通信             type:                 SOCK_STREAM         数据流协议(本地) tcp                 SOCK_DGRAM          数据报协议             protocol:                 特殊通信协议,一般不用,写0即可         返回值:成功返回socket描述符,失败返回-1
        int bind(int sockfd, const struct sockaddr *addr,                 socklen_t addrlen);         功能:绑定socket和通信地址(文件路径、网络地址)             sockfd:socket描述符             addr:地址结构体                 实际使用传递的地址结构体    sockaddr_un或者sockaddr_in,但是传参时要把它们转换成sockaddr类型,C中没有自动类型识别转换,因此要强转                     本地通信使用                 #include <sys/un.h>                 struct sockaddr_un{                     __kernel_sa_family_t sun_family;    //domain写啥它写啥                     char sun_path[UNIX_PATH_MAX];       //socket文件路径                 };                     网络通信使用                 #include <netinet/in.h>                 struct sockaddr_in{                     __kernel_sa_family_t sin_family;    //domain写啥它写啥                     __be16      sin_port;               //端口号(需要大端数据)                     struct in_addr     sin_addr;        //IP地址                 };                     struct in_addr{                         __be32  s_addr; //IP地址数据                     }             addrlen:地址结构体的字节数,用于区分是sockaddr_un还是sockaddr_in         返回值:成功0,失败-1
        int listen(int sockfd, int backlog);         功能:监听已经绑定好的socket             sockfd:socket描述符               backlog:监听的等待连接的排队数量   默认最大128         返回值:成功0,失败-1
        int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);         功能:等待连接             sockfd:socket描述符             addr:获取连接者的通信地址,不想获取可以给NULL             addrlen:获取连接者的通信地址结构体字节数         返回值:成功返回一个针对该连接的新的socket描述符,失败-1         注意:如果没有连接,该函数会阻塞等待              如果要获取连接者的地址,后两个参数都需要传递              addrlen要获取时,先要输入addr的字节数,才能获取连接者的IP
        int connect(int sockfd, const struct sockaddr *addr,                    socklen_t addrlen);         功能:连接socket             sockfd:socket描述符             addr:目标地址             addrlen:目标地址结构体的字节数         返回值:成功0,失败-1
        ssize_t send(int sockfd, const void *buf, size_t len, int flags);         功能:向建立连接后的socket发送数据,数据流通信使用             sockfd:建立连接后的socket描述符             buf:待发送的数据内存首地址             len:要发送的字节数             flags:一般写0即可(阻塞发送)                 MSG_DONTWAIT 不阻塞         返回值:成功返回成功发送的字节数、失败-1
        ssize_t recv(int sockfd, void *buf, size_t len, int flags);         公共:从建立连接的socket中接收数据,数据流通信使用             sockfd:建立连接之后的socket描述符             buf:存储接收的数据的内存首地址             len:buf的字节数             flags:一般写0即可(阻塞发送)                 MSG_DONTWAIT 不阻塞         返回值:成功返回成功接收的字节数、-1出现错误、正常断开返回0
        close(fd)         功能:关闭socket
二、基于TCP协议的网络通信     TCP网络通信编程模型:                 计算机S                   计算机C              创建socket对象            创建socket对象            准备通信地址(自己的IP)       准备通信地址(计算机S的IP,与C在同一个局域网,或者S是公网IP)             绑定socket和地址                ···                 监听                       ···                等待连接                    连接              接收、发送数据             发送、接收数据              关闭socket                 关闭socket                   本地字节序与网络字节序转换(大小端转换)         #include <arpa/inet.h>         uint32_t htonl(uint32_t hostlong);         功能:把4字节的本地字节序转换成网络字节序         uint16_t htons(uint16_t hostshort);         功能:把2字节的本地字节序转换成网络字节序         uint32_t ntohl(uint32_t netlong);         功能:把4字节的网络字节序转换成本地字节序         uint16_t ntohs(uint16_t netshort);         功能:把2字节的网络字节序转换成本地字节序                     网络通信使用                 #include <netinet/in.h>                 struct sockaddr_in{                     __kernel_sa_family_t sin_family;    //domain写啥它写啥                     __be16      sin_port;               //端口号(需要大端数据)                     struct in_addr     sin_addr;        //IP地址结构体                 };                     struct in_addr{                         __be32  s_addr; //IP地址数据(大端整数)                     }             点分十进制字符串的IP地址转换成小端整数、然后需要转大端
            IP地址与整数的转换             in_addr_t inet_addr(const char *cp);             功能:把字符串形式的点分十进制的IP地址转换成大端的整数形式的IP地址             char *inet_ntoa(struct in_addr in);             功能:把大端的IP整数转换成以字符串形式的点分十进制的IP地址
三、UDP网络通信     UDP网络通信编程模型:         计算机S                 计算机C        创建socket              创建socket       准备通信地址(自己的)     准备通信地址(计算机S)       绑定socket和通信地址      ·······         接收、发送数据          发送、接收数据         关闭socket              关闭socket
        ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,                       const struct sockaddr *dest_addr, socklen_t addrlen);         功能:UDP专用的数据发送             sockfd:socket描述符             buf:待发送的数据内存首地址             len:要发送的字节数             flags:一般写0即可(阻塞发送)             dest_addr:发送目标的地址结构体             addrlen:地址结构体的字节数         返回值:成功返回成功发送的字节数、错误-1
    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,                         struct sockaddr *src_addr, socklen_t *addrlen);         功能:UDP专用的数据接收             sockfd:socket描述符             buf:待发送的数据内存首地址             len:buf的大小             flags:一般写0即可(阻塞发送)             src_addr:获取发送者的地址             addrlen:先要输入才能输出发送者的地址         返回值:成功接收到的字节数、错误-1、关闭通信0

标签:addr,struct,sockaddr,int,day01,sockfd,socket
From: https://www.cnblogs.com/ymy1/p/17649419.html

相关文章

  • 标准C++ -- day01
    一、C++介绍本贾尼.斯特劳斯特卢普,于1979年在贝尔实验室负责分析UNIX系统内核流量的分布情况时,特别希望有一种更加模块化的工具,于1979.10开始着手研发一款新的编程语言,在C语言的基础上增加了面向对象的机制,也就是C++,1983年完成了C++的第一个版本C++与C的关联和重要区别:(面试题)......
  • Java学习IO流Day01
    io一、File2.1FIle概述File用来表示文件系统中的一个文件或者目录java.io包下2.2方法构造方法File(Stringpathname):通过指定路径名称创建一个新的FIle实例Filefile=newFile("D:\\demo.txt");File(Fileparent,Stringchild):根据父级目录对象和子文......
  • day01-运维介绍与虚拟机安装-20230820
     1.解释我们正在使用哪些互联网行业的软件,移动端?PC端? (1)平台不一样视觉范围更广,可设计的地方更多,设计性更强,相对来说容错度更高一些。操作局限性大,在设计上可用空间显得尤为珍贵,避免原件过小过近。(2)操作系统不一样对于会员系统、视频和音乐、购物支付等功能都进行了精简,使......
  • Spring Boot学习笔记day01
    SpringBoot项目结构说明项目____pom.xml:用于管理项目依赖的|_src|_main|_java:蓝色的,写java源代码的|_resource:存放静态资源文件(static目录下)、项目配置文件application.properties、模板文件(template目录下)|_test|_java......
  • JavaSE学习笔记day01
    书写第一段Java代码一、代码需要写在src中;二、先在src下创建包;包:package,用于组织指定Java文件,对于同类型、同功能的Java文件则存在同一个包下。包在操作系统中以文件夹的形式存在。总结:包用于对Java文件进行归类划分的。三、然后在包下创建类。类才是真正写Java代码......
  • 网络编程day01--socket套接字
    进程间通信-socket套接字基本特征:socket是一种接口技术,被抽象了一种文件操作,可以让同一计算机中的不同进程之间通信,也可以让不同计算机中的进程之间通信(网络通信)本地进程间通信编程模型:进程A                                        ......
  • 博客day01
    Markdown学习标题三级标题四级标题 字体hollo,word!hollo,word!hollo,word!hollo,word! 应用 分割线 图片   超链接点击跳转到狂神博客 列表ABCAB 表格名字性别生日张三男1997.1.1代码1| ......
  • day01
    数组理论基础●思维不难,主要是考察对代码的掌控能力●内存中的存储方式:存放在连续内存空间上的相同类型数据的集合●数组可以通过下标索引获取到下标对应的数据●数组下标从0开始●因为内存空间地址连续,因此删除或增加元素的时候,难免移动其他元素地址●Java中的二维数......
  • Day01
    MarkDown学习二级标题三级标题四级标题字体HelloWorld!HelloWorld!HelloWorld!HelloWorld!引用人生有梦,各自精彩分割线图片超链接博客列表abc​1表格代码publicstaticvoidmain(Stringargs){}......
  • Java学习面向对象Day01
    面向对象Day01一、名词解释OO:面向对象(OrientedObject)定义:是一种以对象为导向,围绕对象来开发应用程序的软件开发方法。OOA:面向对象分析OOD:面向对象设计OOAD:面向对象的分析与设计OOP:面向对象编程----------你们所参与的二、现实世界中的类和对象先要......