套接字编程
Part 1: 套接字编程简介
1. 套接字的类型
- INET: IPv4
- INET6: IPv6
Linux系统支持多种套接字类型,最常用的有以下几种:
- SOCK_STREAM: TCP协议支持,提供面向连接、可靠的数据传输服务,数据按字节流、按顺序收发。
- SOCK_DGRAM: UDP协议支持, 提供面向无连接,数据收发无序,不能保证数据的准确到达。
- SOCK_RAW:原始套接字。允许对低于传输层的协议或物理网络直接访问,例如可以接收和发送ICMP报文。常用于检测新的协议。
2. 套接字地址结构
IPv4套接字地址结构(网际套接字地址结构): sockaddr_in 定义在 <netinet/in.h> 头文件中
IPv6套接字地址结构: sockaddr_in6
<netinet/in.h> typedef uint32_t in_addr_t;
typedef uint16_t in_port_t; typedef unsigned short sa_family_t;
通用套接字地址结构
1 struct sockaddr{ 2 uint8_t sa_len; 3 sa_family_t sa_family; 4 char sa_data[14]; 5 };
3. 套接字基本函数
字节排序函数
大端或小端字节序 —> 网络字节序
#include <netinet/in.h> unit16_t htons(uint16_t hosts); uint32_t hton1(unint32_t host1); unit16_t ntohs(uint16_t nets); uinet32_t ntoh1(uint32_t net1);
//h=host, n=network, s=short, l=long
字节操纵函数
//4.2BSD, 以b开头
#include <string.h> void bzero(void *dest, size_t len); //对套接字地址结构进行初始化 void bcopy(const void *src, void *dest, size_t len); //将指定数目字节从源拷贝到目标 int bcmp(const void * src, void *dest, size_t len); //比较源和目标两个字符串,相同返回0,否则返回1
//ANSI C
void *memset(void *dest, int x, size_t len);
void *memcpy(void *dest, const void *src, size_t len);
int memcpy(const void *str1, const void *str2, size_t len);
IP地址转换函数
1 #include <arpa/inet.h> 2 in_addr_t inet_addr(const char *str) //点分十进制 -> 32位二进制IP地址, 返回32位二进制IP地址 3 int inet_aton(const char *str, struct in_addr *numstr); //功能同上, 成功返回1,否则还回0 4 char *inet_ntoa(struct in_addr inaddr); // 32位二进制IP地址 -> 点分十进制
4. Question:
1. 简述通用套接字地址结构的作用。
Struct sockaddr 是通用的地址结构,他主要负责为不同地址格式的地址能够传入到套接字函数中,即,不同协议簇的地址指针传入套接字函数的时候,指针类型将被强制转化为通用套接字地址的指针类型。
2. 简述字节排序函数的作用。
3. 举例说明从进程到内核与从内核到进程两种传递套接地址结构的方式有什么区别。

浙公网安备 33010602011771号