首页 > 其他分享 >day 01

day 01

时间:2023-08-24 20:23:23浏览次数:26  
标签:sockaddr 01 addr int struct sockfd day 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

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

相关文章

  • 「SDOI2016」排列计数tj(附压行代码)
    现在求有多少种长度为n的序列A,满足以下条件:1~n这n个数在序列中各出现了一次若第i个数A[i]的值为i,则称i是稳定的。序列恰好有m个数是稳定的满足条件的序列可能很多,序列数对10^9+7取模。输入第一行一个数T,表示有T组数据。接下来T行,每行两个整数n、......
  • Navicat Premium保存密码失败:Failed to save password Error code: -34018
    卸载卸载干净后重装15.0.29或之后的版本,卸载参见:https://download.csdn.net/blog/column/9651437/103915601:sudorm-Rf/Applications/Navicat\Premium.appsudorm-Rf/private/var/db/BootCaches/CB6F12B3-2C14-461E-B5A7-A8621B7FF130/app.com.prect.NavicatPremium.play......
  • Namomo Summer Camp 23 Day 1(GCPC2021)
    NamomoSummerCamp23Day1(GCPC2021)ProblemB:BrexitingandBrentering签到#include<bits/stdc++.h>usingi64=longlong;usingnamespacestd;typedefpair<i64,i64>PII;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr)......
  • DAY003_选择排序、冒泡排序、插入排序
    选择排序第一遍遍历:从头开始,找到最小值的坐标,将最小值和数组第一个元素对调第二遍遍历:从第二个元素开始,找到最小值的坐标,将最小值和数组第二个元素对调第三遍遍历:从第三个元素开始,找到最小值的坐标,将最小值和数组第三个元素对调....冒泡排序第一遍遍历:只要前数比后数大就交......
  • Day1
    MarKdown学习标题:二级标题三级标题四级标题  字体helo两边+**粗体helo两边+*斜体helo两边+***斜体加粗helo两边~~删除引用选择狂神,说java分割线三个---三个*图片![]()超链接点击跳转到范文昊博客 列表ABC(1.) A......
  • [代码随想录]Day26-回溯算法part06
    题目:332.重新安排行程思路:其实这里已经是图的部分了,回溯应该也可以。Hierholzer算法解决欧拉问题代码:funcfindItinerary(tickets[][]string)[]string{var(m=map[string][]string{}res[]string)for_,ticket:=rangeticket......
  • vue--day69---vuex
    1. vuex是什么概念:专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。2. 什么时候使用Vuex1.多个组件依赖于同一状态2.来自不同组件的行为需要变更同一状态......
  • day4
     建立类模板的对象时,需要先将类模板实例化,也就是类模板传递参数完成实例化,先指明这个对象,然后在实例化这个对象 结构体包含成员函数,能够实现继承和多态,结构体除了访问权限和类不一样外,几乎可以说是一模一样 const在*号左边时,表示指向的值不变,位于*右时,指针的指向......
  • 如何用WinRAR解压文件zip.001
    要合并“分卷.zip.001”~“分卷.zip.018”,步骤如下:新建文本文档,输入:copy/B分卷.zip.*a.zip(如果需要合并的文件为aaaa.zip.001……aaaa.zip.018,就输入copy/Baaaa.zip.*a.zip)将文档保存为批处理文件(如:合并分卷.bat),由于命令中有中文字符,需要保存为ANSI格式  将批处......
  • js知识点学习01
    js知识点学习011.arguements对象(1)什么是arguements对象?由于JavaScript允许函数有不定数目的参数,所以需要一种机制,可以在函数体内部读取所有参数。这就是arguments对象的由来。(2)怎么使用?arguments对象包含了函数运行时的所有参数,arguments[0]就是第一个参数,arguments[......