1 struct in_addr{
2 in_addr_t s_addr;
3 };
4 struct sockaddr_in{
5 uint8_t sin_len;
6 sa_family_t sin_family;
7 in_port_t sin_port;
8
9 struct in_addr sin_addr;
10 char sin_zero[8];
11 };
通用套接口地址结构:
struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
};
int bind(int ,struct sockaddr *,socklen_t);
strcut sockaddr_in serv;
bind(sockfd,(struct sockaddr *)&serv,sizeof(serv));
1 进程到内核的传递:bind,connect,sendto
struct sockaddr_in serv;
connect(sockfd,(SA *)&serv,sizeof(serv));
2 内核到进程的传递:accept,recvfrom,getsockname,getpeername
struct sockaddr_un cli;
socklen_t len;
len = sizeof(cil);
getpeername(unixfd,(SA *)&cli,&len);
值-结果参数:
当函数被调用时,结构大小是一个值。当函数返回时,结构大小是一个结果(我靠!这是跟我玩哲学么?)
常用的值-结果参数:
1 select 3个变量
2 getsockopt 长度变量
3 recvmsg msghdr中的两个成员:msg_namelen \ msg_controllen
4 ifconfig ifc_len
5 sysctl 前两个长度参数
小端字节序:低序字节存储在起始地址
大端字节序
验证大小端字节序:
1 int main(int argc,char ** argv){
2 union{ shot s;
3 char c[sizeof(short)];
4 }un;
5 un.s = 0x0102;
6 printf("%s:",CPU_VENDOR_OS);
7 if(sizeof(short) ==2){
8 if(un.c[0]==1 && un.c[1]==2)
9 printf("big-endian\n");
10 else if(un.c[0]==2 && un.c[1]==1)
11 printf("little-endian\n");
12 else
13 printf("unknown\n");
14 }else{
15 printf("sizeof(short) = %d\n",sizeof(short));
16 }
17 exit(0);
18 }
inet_aton 将字符串转换成32位的网络字节序的二进制值
inet_addr 全为1时,返回INADDR_NONE错误
inet_ntoa 将二进制转换成对应的点分十进制
inet_pton 从表达格式转换到数值格式
inet_ntop 从数值格式转换到表达格式
sock_ntop
转载于:https://my.oschina.net/u/204616/blog/545198