网络编程函数及结构体总结

常用的几个函数如下,不赘述:socket、listen、bind、accept、connect、send、recv、read、write
setsocketopt、getsocketopt
https://blog.csdn.net/hzlarm/article/details/102389780
linger:https://blog.csdn.net/weixin_44705391/article/details/117445673?spm=1001.2014.3001.5501
addrinfo:https://blog.csdn.net/weixin_44705391/article/details/117442296?spm=1001.2014.3001.5501
socketpair:https://blog.csdn.net/weixin_44705391/article/details/117441875?spm=1001.2014.3001.5501

函数汇总

#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int d, int type, int protocol, int sv[2]);
创建一对无名的、相互连接的套接子。创建好的套接字分别是sv[0]和sv[1];

  1. 这对套接字可以用于全双工通信,每一个套接字既可以读也可以写。例如,可以往sv[0]中写,从sv[1]中读;或者从sv[1]中写,从sv[0]中读;
  2. 如果往一个套接字(如sv[0])中写入后,再从该套接字读时会阻塞,只能在另一个套接字中(sv[1])上读成功;
  3. 读、写操作可以位于同一个进程,也可以分别位于不同的进程,如父子进程。如果是父子进程时,一般会功能分离,一个进程用来读,一个用来写。因为文件描述副sv[0]和sv[1]是进程共享的,所以读的进程要关闭写描述符, 反之,写的进程关闭读描述符。
    举例:

参数汇总

typedef struct addrinfo {
int      ai_flags;//指示在getaddrinfo函数中使用的选项的标志。
int      ai_family;
int      ai_socktype;
int      ai_protocol;
size_t      ai_addrlen;
char      *ai_canonname;
struct sockaddr *ai_addr;
struct addrinfo *ai_next;//指向链表中下一个结构的指针。
} ADDRINFOA, *PADDRINFOA;

ai_flags:

  1. AI_PASSIVE 套接字地址将用于调用bind 函数
  2. AI_CANONNAME 返回规范名称
  3. AI_NUMERICHOST 传递给getaddrinfo函数的nodename参数必须是数字字符串。
  4. AI_ALL If this bit is set, a request is made for IPv6 addresses and IPv4 addresses with AI_V4MAPPED.
  5. AI_ADDRCONFIG 只有配置了全局地址后,getaddrinfo才会解析。 IPv6和IPv4环回地址不被认为是有效的全局地址。
  6. AI_V4MAPPED 如果对IPv6地址的getaddrinfo请求失败,则对IPv4地址进行名称服务请求,这些地址将转换为IPv4映射IPv6地址格式。
  7. AI_NON_AUTHORITATIVE 地址信息可以来自非授权命名空间提供商
  8. AI_SECURE 地址信息来自安全信道。
  9. AI_RETURN_PREFERRED_NAMES 地址信息是用于用户的优选名称。
  10. AI_FQDN getaddrinfo将返回名称最终解析为的完全限定域名。 完全限定域名在ai_canonname成员中返回。
    这与AI_CANONNAME位标记不同,后者返回在DNS中注册的规范名称,该名称可能与平面名称解析为的完全限定域名不同。
    只能设置AI_FQDN和AI_CANONNAME位中的一个。 如果EAI_BADFLAGS同时存在这两个标志,getaddrinfo函数将失败。
    AI_FILESERVER 命名空间提供程序提示正在查询的主机名正在文件共享方案中使用。 命名空间提供程序可以忽略此提示。
    ai_family: The address family.
  11. AF_UNSPEC 地址系列未指定。
  12. AF_INET IPv4 address family.
  13. AF_NETBIOS NetBIOS地址系列。
  14. AF_INET6 IPv6 address family.
  15. AF_IRDA The Infrared Data Association address family.
  16. AF_BTH Bluetooth address family.
    ai_protocol: 协议类型。
  17. IPPROTO_TCP 传输控制协议(TCP)。 当ai_family成员为AF_INET或AF_INET6且ai_socktype成员为
  18.           SOCK_STREAM时,这是一个可能的值
    
  19. IPPROTO_UDP 用户数据报协议(UDP)。 当ai_family成员为AF_INET或AF_INET6且类型参数为SOCK_DGRAM
  20.           时,这是一个可能的值。
    
  21. IPPROTO_RM PGM协议用于可靠的组播。 当ai_family成员为AF_INET且ai_socktype成员为SOCK_RDM时,
  22.           这是一个可能的值。 在为Windows Vista及更高版本发布的Windows SDK上,此值也称为
    
  23.           IPPROTO_PGM。
    

可能的选项特定于指定的地址系列和套接字类型。
如果为ai_protocol指定了值0,则调用者不希望指定协议,服务提供者将选择要使用的ai_protocol。 对于IPv4和IPv6之外的协议,将ai_protocol设置为零。
ai_socktype: 套接字类

  1. SOCK_STREAM 使用OOB数据传输机制提供顺序,可靠,双向,基于连接的字节流。使用Internet地址系列
  2.            (AF_INET或AF_INET6)的传输控制协议(TCP)。如果ai_family成员是AF_IRDA,则       
    
  3.             SOCK_STREAM是唯一支持的套接字类型。
    
  4. SOCK_DGRAM 支持数据报,它是无连接的,不可靠的固定(通常小)最大长度的缓冲区。对Internet地址
  5.             系列(AF_INET或AF_INET6)使用用户数据报协议(UDP)。
    
  6. SOCK_RAW 提供一个原始套接字,允许应用程序处理下一个上层协议头。要操作IPv4标头,必须在套接
  7.             字上设置IP_HDRINCL套接字选项。要操作IPv6头,必须在套接字上设置IPV6_HDRINCL套接
    
  8.            字选项。
    
  9. SOCK_RDM 提供可靠的消息数据报。这种类型的示例是在Windows中的实用通用多播(PGM)多播协议实
    现,通常被称为可靠多播节目。
  10. SOCK_SEQPACKET 基于数据报提供伪流包。

struct sockaddr {
unsigned short sa_family; /* address family, AF_xxx /
char sa_data[14]; /
14 bytes of protocol address */
};
sa_family是地址家族,一般都是“AF_xxx”的形式。好像通常大多用的是都是AF_INET。
sa_data是14字节协议地址。
此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。

sockaddr_in(在netinet/in.h中定义):
struct sockaddr_in {
short int sin_family; /* Address family /
unsigned short int sin_port; /
Port number /
struct in_addr sin_addr; /
Internet address /
unsigned char sin_zero[8]; /
Same size as struct sockaddr */
};
struct in_addr {
unsigned long s_addr;
};

typedef struct in_addr {
union {
struct{
unsigned char s_b1,
s_b2,
s_b3,
s_b4;
} S_un_b;
struct {
unsigned short s_w1,
s_w2;
} S_un_w;
unsigned long S_addr;
} S_un;
} IN_ADDR;

sin_family指代协议族,在socket编程中只能是AF_INET
sin_port存储端口号(使用网络字节顺序)
sin_addr存储IP地址,使用in_addr这个数据结构
sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
s_addr按照网络字节顺序存储IP地址

sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向
sockadd的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,
在最后用进行类型转换就可以了bzero((char*)&mysock,sizeof(mysock));//初始化

sockaddr_un
struct sockaddr_un
{
uint8_t sun_len;
sa_family_t sun_family; /* AF_LOCAL /
char sun_path[104]; /
null-terminated pathname */
};

进程间通信的一种方式是使用UNIX套接字,人们在使用这种方式时往往用的不是网络套接字,而是一种称为本地套接字的方式。这样做可以避免为黑客留下后门。

创建
使用套接字函数socket创建,不过传递的参数与网络套接字不同。域参数应该是PF_LOCAL或者PF_UNIX,而不能用PF_INET之类。本地套接字的通讯类型应该是SOCK_STREAM或SOCK_DGRAM,协议为默认协议。例如:
int sockfd;
sockfd = socket(PF_LOCAL, SOCK_STREAM, 0);

绑定
创建了套接字后,还必须进行绑定才能使用。不同于网络套接字的绑定,本地套接字的绑定的是struct sockaddr_un结构。struct sockaddr_un结构有两个参数:sun_family、sun_path。sun_family只能是AF_LOCAL或AF_UNIX,而sun_path是本地文件的路径。通常将文件放在/tmp目录下。例如:

struct sockaddr_un sun;
sun.sun_family = AF_LOCAL;
strcpy(sun.sun_path, filepath);
bind(sockfd, (struct sockaddr*)&sun, sizeof(sun));

监听
本地套接字的监听、接受连接操作与网络套接字类似。

连接
连接到一个正在监听的套接字之前,同样需要填充struct sockaddr_un结构,然后调用connect函数。

连接建立成功后,我们就可以像使用网络套接字一样进行发送和接受操作了。甚至还可以将连接设置为非阻塞模式

sockaddr_storage和sockaddr类似,但是可以支持大的地址字符串
struct sockaddr_storage
{
sa_family_t ss_family; /* Address family /
__ss_aligntype __ss_align; /
Force desired alignment. */
char __ss_padding[_SS_PADSIZE];
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值