linux套接字

套接字不仅支持本地无关的两个进程之间的双向通信,而且支持跨网络的,运行在不同机器的进程间的通信。

可以通过int socket(int domain,int type,int protocol)建立套接字,通过int close(int socket)关闭(销毁)套接字,通过int shutdown(int socket,int how)断开套接字的连接。

建立套接字

[cpp]  view plain  copy
 print ?
  1. #include <sys/socket.h>  
  2. int socket(int domain,int type,int protocol);  
domian:通信域。

AF_UNIX:UNIX通信域,同一台计算机的任意两个进程,通过文件系统进行通信,文件系统的路径作为套接字的地址。

AF_INET:网络通信域,IPV4网路传输协议。

AF_INET6:网络通信域,IPV6网络传输协议。

type:套接字类型。

SOCK_STREAM:字节流套接字。

SOCK_DGRAM:数据流套接字。

protocol:具体的某个协议(一般置为0,使用系统默认的)

返回值为套接字描述字。

关闭套接字(销毁)

[cpp]  view plain  copy
 print ?
  1. #include <unistd.h>  
  2. int close(int scoket);  
scoket:套接字描述字。

断开套接字的连接

[cpp]  view plain  copy
 print ?
  1. #include <sys/scoket.h>  
  2. int shutdown(int scoket,int how);  
scoket:套接字描述字。

how:以那种方式断开链接

SHUT_RD:停止从此套接字接收数据。

SHUT_WR:停止从次套接字传送数据。

SHUT_RDWR:停止从此套接字接收和发送数据。

套接字的地址结构

[cpp]  view plain  copy
 print ?
  1. /*IPV4*/  
  2. struct in_addr  
  3. {  
  4.    in_addr_t s_addr;  
  5. };  
  6. /*IPV6*/  
  7. struct in6_addr  
  8. {  
  9.    uint8  s6_addr[16];  
  10. };  
字符串IP地址格式和二进制IP地址格式的互相转换

[cpp]  view plain  copy
 print ?
  1. #include <arpa/inet.h>  
  2. int inet_aton(const char *name,struct in_addr *addr);  
  3. char * inet_ntoa(struct in_addr inaddr);  
  4. int inet_pton(int family,const char *nameptr,struct in_addr *addrptr);  
  5. consr char * inet_ntop(int family,void *addrptr,char *nameptr,size_t len);  

hostent表示主机网络地址数据库记录的数据结构其中至少包含:

[cpp]  view plain  copy
 print ?
  1. struct hostent  
  2. {  
  3.  char *h_name;      //主机名称  
  4.  char **h_aliases;  //主机别名  
  5.  int h_addrtype;     //主机地址类型  
  6.  int h_length;        //地址长度   
  7.  char **h_addr_list; //指向主机网络地址的指针。  
  8. };  
获取主机的信息:

[cpp]  view plain  copy
 print ?
  1. #include <netdb.h>  
  2. struct hostent *gethostbyname(const char *name); /*获取主机信息*/  
  3. struct hostent *gethostbyaddr(const char *addr,size_t length,int type);/*获取主机信息*/  


对于域名的解析是首先访问本地的hosts文件,如果本地hosts文件中没有域名对应的信息,则访问域名解析服务器。
[cpp]  view plain  copy
 print ?
  1. #include <netdb.h>  
  2. void sethostent(int stapopen); /*建立和域名服务器的链接*/  
  3. struct hostent *gethostent(); /*获取一条主机数据库的下一条记录*/  
  4. void endhostent();               /*关闭主机地址数据库*/  

在网络通信中套接字地址由机器IP地址和端口号组成,IP时网络中一台计算机的唯一标识,端口号是区分同一台计算机不同的服务进程。

[cpp]  view plain  copy
 print ?
  1. #include <netdb.h>  
  2. /* 
  3. ***************************************** 
  4.   描述服务信息库信息的数据结构 
  5. ***************************************** 
  6. */  
  7. struct servent  
  8. {  
  9.         char *s_name; //服务程序的正式名称  
  10.         char *s_aliases; //服务程序的别名  
  11.         int  s_port;    //服务程序对应的端口号  
  12.         char *s_proto; // 和服务程序一起使用的协议名称  
  13. };  
获取和查询端口号

[html]  view plain  copy
 print ?
  1. #include <netdb.h>  
  2.   
  3. struct servent *getservbyname(const char *name,const char *proto);  
  4. struct servent *getservbyport(int port,const char *proto);  
  5. /*扫描服务数据库*/  
  6. void setservent(int stayopen); /*打开数据库准备扫描*/  
  7. struct servent *getservent(void);/*获取数据库下一条信息*/  
  8. void endservent(void) /*关闭数据库*/  

套接字地址数据结构

(1)UNIX通信域

[cpp]  view plain  copy
 print ?
  1. <span style="font-size:14px;">struct scokaddr_un  
  2. {  
  3.         sa_family_t sun_family; //指明地址族  
  4.        char sun_path[]; //文件路径  
  5. }</span>  

(2)IPV4

[cpp]  view plain  copy
 print ?
  1. struct scokaddr_in  
  2. {  
  3.         sa_family_t sin_family; //指明地址族  
  4.         in_port_t sin_port;     //16位端口号  
  5.         struct in_addr sin_addr; //32位IPV4  
  6.         unsigned char sin_zero[8]; //保留  
  7. };  
(3)IPV6

[cpp]  view plain  copy
 print ?
  1. struct scokaddr_in6  
  2. {  
  3.         sa_family_t   sin6_family; //指明地址族  
  4.         in_port_t   sin6_port;     //16位端口号  
  5.        uint32_t   sin6_addr;     //IPV6流标识和优先级信息  
  6.         struct in6_addr sin6_addr; //128位IPV6  
  7. };  

(4)通用套接字地址结构

[cpp]  view plain  copy
 print ?
  1. <span style="font-size:14px;">struct sockassr  
  2. {  
  3.        sa_family_t sa_family;  
  4.        char sa_data[];  
  5. };</span>  

通过scoket在系统中创建无名的套接字,其他进程无法访问,通过bind可以给套接字指定名字(路径或地址,通常是只有对外提供服务的套接字),使其能够被访问。

[cpp]  view plain  copy
 print ?
  1. <span style="font-size:14px;">#include <sys/scoket.h>  
  2. int bind(int scoket,const struct scokaddr,socklen_t address_len);</span>  

socket:套接字描述字。

sockaddr:地址

address_len:结构体的长度

成功返回0,失败返回-1并置errno

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值