首页 > 编程语言 >网络编程学习01

网络编程学习01

时间:2023-08-22 21:12:24浏览次数:45  
标签:01 addr int 编程 网络 地址 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描述符
  sddr:地址结构体
    实际使用传递的地址结构体 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_in还是sockaddr_un
返回值:成功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:获取连接者的通信地址结构体字节数,不想获取可以给NULL
  返回值:成功返回一个针对该连接的新的socket描述符,失败返回-1
  注意:
    1、如果没有连接,那么该函数会阻塞等待
    2、如果要获取连接者的地址,后面两个参数都需要传递
    3、addrlen要获取时,先要给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    不阻塞
    MSG_OOB         优先紧急数据
    返回值:成功发送的字节数,出错返回-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地址(非公网ip)) 准备通信地址(计算机S的,与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; //AF_INET
        __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关闭通信

FTP协议
FTP 的独特的优势同时也是与其它客户服务器程序最大的不同点就在于它在两台通信的主机之间使用了两条 TCP 连接,一条是数据连接,用于数据传送;
另一条是控制连接,用于传送控制信息(命令和响应),这种将命令和数据分开传送的思想大大提高了 FTP 的效率,而其它客户服务器应用程序一般只有一条 TCP 连接。
在整个交互的 FTP 会话中,控制连接始终是处于连接状态的,数据连接则在每一次文件传送时先打开后关闭

标签:01,addr,int,编程,网络,地址,sockfd,连接,socket
From: https://www.cnblogs.com/c-learnmore/p/17649691.html

相关文章

  • Autocad2014下载安装-Autocad2014功能介绍
    Autocad2014注册机是一款专为Autocad2014设计软件提供注册的辅助软件。用户使用Autocad2014zcj可以将未经注册激活的Autocad2014软件成功注册并激活。这款软件操作简单,易于使用,拥有广泛的受众群体,如建筑师、工程师和建筑专业人员等,借助它,可以准确地和客户共享设计数据,体验本地DWG......
  • AI技术在网络攻击中的滥用与对抗 - 人工智能恶意攻击
    随着人工智能技术的迅猛发展,我们享受到了许多便利,但同时也面临着新的安全威胁。本文将探讨人工智能技术在网络攻击中的滥用,并提出一些防御机制。人工智能在网络攻击中的滥用人工智能技术的先进性和灵活性使其成为恶意攻击者的有力工具。以下是一些常见的人工智能滥用案例:欺骗......
  • P3011 [USACO11JAN] Traffic Lights S
    P3011[USACO11JAN]TrafficLightsS目录P3011[USACO11JAN]TrafficLightsS题目题目描述输入输出格式输入格式输出格式题目描述输入格式输出格式样例#1样例输入#1样例输出#1思路code题目题目描述和FJ靠的最近的城市Kenosha市有\(M\)条道路。(编号为\(1-M\))连接着\(N......
  • C++学习day01
    C++学习day01一、C++介绍本贾尼.斯特劳斯特卢普,于1979年在贝尔实验室负责分析UNIX系统内核流量的分布情况时,特别希望有一种更加模块化的工具,于1979.10开始着手研发一款新的编程语言,在C语言的基础上增加了面向对象的机制,也就是C++,1983年完成了C++的第一个版本C++与C的关联和重要......
  • 什么是 HTML 编程里页面元素的 margin 属性
    在前端开发中,margin是一种重要的CSS属性,用于控制元素之间的空间和距离。它不仅影响元素的外观,还可以影响整个页面的布局。本文将详细解释margin的概念、用途以及通过示例演示如何在HTML中使用margin来控制元素之间的间距。概念margin是CSS(层叠样式表)中的一个属性,用于控制元素的......
  • AT_codefestival_2016_qualB_c Gr-idian MST
    思路首先想到暴力建边跑最小生成树,但是显然会TLE。所以思考有没有时间复杂度更低的做法,考虑到最小生成树是每次取最短的边,所以我们也可以先考虑较短的边。首先最短的边一定是某一列或者某一行(或者若干列和行),所以我们取边,也应该是一行一行或者一列一列的取。但是有些时候这样......
  • P1612 [yLOI2018] 树上的链
    因为自己太憨了,所以交了好几次都没过,谢谢审核大大!!!思路因为这是一棵树,所以每个节点只有一个父亲,那么选定一个结点,它到根节点的路径唯一。所以第一个思路就是暴力,对于每一个节点,直接暴力向上枚举,找到第一个满足条件的节点,然后输出长度即可。但是显然,第一种方法很容易TLE,所以我......
  • java经典50道编程题(很好练逻辑思维的题)
    【程序21】题目:求1+2!+3!+…+20!的和程序分析:此程序只是把累加变成了累乘。1、先求该项阶乘的值*2、累加求求publicclassProgramme21{publicstaticvoidmain(String[]args){intsum=0;//总和for(inti=1;i<=20;i++){sum+=factorial(i);//累加}System.out......
  • 在Docker上安装部署SQL Server2019 Express
    在Docker上安装部署SQLServer2019Express_docker安装sqlserver2019_梦想天空分外蓝的博客-CSDN博客  梦想天空分外蓝_-CSDN博客......
  • day01
    一、进程间通信-socket套接字  基本特征:socket是一种接口技术,被抽象成一种文件的操作,可以让同一计算机中的不同进程之间通信,也可以让不同计算机中的进程进行通信(网络通信)    本地进程间通信编程模型:        进程A         ......