套接字编程

Posted 李憨憨_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了套接字编程相关的知识,希望对你有一定的参考价值。

套接字编程

socket套接字编程: 网络通信程序的编写(接口 + 流程)
 udp协议通信程序的编写/tcp协议通信程序的编写
 udp协议与tcp协议的区别初识:
  udp协议: 用户数据报协议
   特性: 无连接, 不可靠, 面向数据报
   应用场景: 实时性要求大于安全性要求的场景—视频传输
  tcp协议: 传输控制协议
   特性: 面向连接, 可靠传输, 面向字节流;
   应用场景: 安全性要求大于实时性要求的场景—文件传输
在网络通信程序中, 通信两端分为: 客户端, 服务端
 客户端: 通常是提供给客户的通信端, 通常是编写通信程序中主动发起请求的一端;
 服务端: 通常指被动接受服务, 提供服务的通信端
客户端是主动发送请求的一端, 也就意味着客户端必须提前能够知道服务端的地址信息(ip+port)是多少
服务端的地址信息通常是固定的, 并且是提前提供给客户端的

udp通信程序的编写

通信流程
在这里插入图片描述

接口认识:

 1.创建套接字:
在这里插入图片描述

  int socket(int domain, int type, int protocol);
   domain: 地址域类型----AF_INET–IPv4通信, 使用IPv4的地址结构
   type: 套接字类型 SOCK_STREAM(流式套接字) / SOCK_DGRAM(数据报套接字)
    udp通信必须使用SOCK_DGRAM; tcp必须使用SOCK_STREAM
   protocol: 本次通信使用的协议; IPPROTO_TCP- 6 / IPPROTO_UDP -17
   返回值: 返回一个文件描述符–操作句柄; 失败返回-1;
 2.为套接字绑定地址信息
在这里插入图片描述

  int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
   sockfd: 创建套接字返回的操作句柄
   addr: 当前绑定的地址信息
   addrlen: 地址信息长度
   返回值: 成功返回0; 失败返回-1;
 3.接收数据
在这里插入图片描述

  ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
   sockfd: 操作句柄;  buf: 空间地址, 用于存放接收的数据
   len: 要接收的数据长度;  flag: 选项标志–默认0–表示阻塞接收
   src_addr: 本条数据的源端地址信息
   addrlen: 输入输出参数–指定要接收多长的地址结构, 并且返回实际接收的地址长度
   返回值: 返回实际接收到的数据长度;  失败返回-1;
 4.发送数据
在这里插入图片描述

  ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
   sockfd: 操作句柄;  data: 要发送的数据的空间首地址;
   len: 要发送的数据长度; flag: 默认0–阻塞发送;
   peeraddr: 对端地址信息;  addrlen: 地址结构长度;
   返回值: 成功返回实际发送的数据长度,  失败返回-1;
 5.关闭套接字
  int close(int fd);
字节序转换接口:
在这里插入图片描述

uint32_t htonl(uint32_t hostlong);32位数据主机到网络字节序的转换
uint16_t htons(uint16_t hostshort);16位数据主机到网络字节序的转换
uint32_t ntohl(uint32_t netlong);32位数据网络到主机字节序的转换
uint16_t ntohs(uint16_t netshort);16位数据网络到主机字节序的转换
port端口转换使用s, IP转换用 l , 不能混用

将字符串点分十进制IP地址转换为整型网络字节序IP地址
in_addr_t inet_addr(const char *cp);
“192.168.2.2” -> 0xc0a80202
将网络字节序IP地址转换为字符串点分十进制IP地址
char *inet_ntoa(struct in_addr in);
这两个接口只能进行ipv4的地址转换, 不能进行ipv6的地址转换

以上是关于套接字编程的主要内容,如果未能解决你的问题,请参考以下文章

请教套接字编程中的Accept()函数

TCP/IP网络编程——理解网络编程和套接字编程

Linux Socket 原始套接字编程

Python网络编程—socket套接字编程(UDP)

Python网络编程—socket套接字编程(TCP)

Python网络编程利用Python进行TCPUDP套接字编程