您的位置:首页 > 理论基础 > 计算机网络

UNP-UNIX网络编程 第三章:套接字编程简介

2018-01-16 19:57 330 查看

1.IPV4套接字地址结构:

#include <netinet/in.h>
struct in_addr {
in_addr_t s_addr; //32bit
}
struct sockaddr_in {
uint8_t        sin_len;        //
sa_family_t    sin_family;     //AF_INET
in_port_t      sin_port;       //16bit
struct in_addr sin_addr;
char           sin_zero[8];
}


2.IPv6套接字地址结构:

#include <netinet/in.h>
struct in6_addr {
unit8_t s6_addr[16];
}

struct sockaddr_in6 {
uint8_t          sin6_len;
sa_family_t      sin6_family;
in_port_t        sin6_port;
uint32_t         sin6_flowinfo;
struct in6_addr  sin6_addr;
uint32_t         sin6_scope_id;
}


3.通用套接字地址结构:

#include <sys/socket.h>

struct sockaddr {
uint8_t      sa_len;
sa_family_t  sa_family;
char         sa_data[14]; //protocol-specific address
}
//很多方法中都是使用sockaddr
bind(socked,(struct sockaddr*) &serv,sizeof(serv));


4.新的通用套接字地址结构:

#include <netinet/in.h>
/*
sockaddr_storage能够满足最苛刻的对齐要求。
sockaddr_storage足够大,能够满足系统支持的任何套接字地址结构。
sockaddr_storage中除了ss_len和ss_family之外,其他字段对用户来说是透明的。sockaddr_storage结构必须强制转换成或复制到适合于ss_family的套接字地址结构中,才能访问其他字段。
*/
struck sockaddr_storage {
uint8_t ss_len;
sa_family_t  ss_family;
/*
用户透明内容
*/
}


5.头文件:

int8_t          <sys/types.h>
uint8_t         <sys/types.h>
int16_t         <sys/types.h>
uint16_t        <sys/types.h>
int32_t         <sys/types.h>
uint32_t        <sys/types.h>
sa_family_t     <sys/socket.h>
socklen_t       <sys/socket.h>
in_addr_t       <netinet/in.h>
in_port_t       <netinet/in.h>


6.值-结果参数

参数为指针,可以两个方向互相传值,通俗一点的理解就是:参数既做value输入,又做result返回。

就是该参数既是输入参数也是输出参数,相应函数有,accept、recvfrom、getsockname 和 getpeername

struct sockaddr_un cli;

socklen_t len;

len = sizeof(cli);

getpeername(unixfd, (SA*) &cli, &len )

参数有:

select函数中间的3个参数

getsockopt函数的长度参数

msghdr结构中的msg_namelen和msg_controllen字段(recvmsg函数使用)

ifconf结构中的ifc_len字段

sysctl函数两个长的参数中的第一个

7.字节序

字节值的低序位存储在内存起始地址叫小端字节序。

字节值的高序位存储在内存起始地址叫大端字节序。

网络协议使用大端字节序。

8.函数

#include <strings.h>
void bzero(void *dest, size_t nbytes);//字节操纵函数,指定数目字节置为0;
void bcopy(void *src, void *dest, size_t nbytes);//指定数目字节从源到目标串
int bcmp(const void *ptr1, const void *ptr2, size_t nbytes);//比较任意字节穿,相等返回0,否则返回非0


//将字符串形式的ip地址与网络字节序的二进制(存放在套接字地址结构中的值)之间转换
#include <arpa/inet.h>//成功返回1,若输入不是有效的表达式格式返回0
int inet_aton(const char *strptr, struct in_addr *addrptr);//得到二进制;strptr->addrptr
char *inet_ntoa(struct in_addr inaddr);//得到十进制
//上面三个只适用于IPv4,下面两个同时适用于IPv4和IPv6
//成功返回1,若输入不是有效的表达式格式返回0,若出错返回-1,strptr->addrptr
int inet_pton(int family, const char *strptr, void *addr);
//若成功返回指向结果的指针,若出错返回NULL;addrptr->strptr
int inet_ntop(int family ,const void *addr, char *strprt, size_t len);


#include <unistd.h>
//返回读出的字节数,0表示连接已经关闭?,负数表示出错(一般需要判断errno是否是中断EINTR)
ssize_t read(int fd,void *buf,size_t nbytes);
//返回写入的字节数,负数表示出错(一般需要判断errno是否是中断EINTR)
ssize_t write(int fd,const void *buf,size_t nbytes)
//
ssize_t readline(int fd,void *buf,size_t maxlen);


read和write存在缓冲区溢出的问题,改进为readn、written、readline函数,避免让调用者处理不足的字节计数值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: