套接口編程

 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 
相關文章
相關標籤/搜索