socket基础api

来源:互联网 发布:excel找出a列重复数据 编辑:程序博客网 时间:2024/06/06 01:04

一 .字节序转换函数

 uint32_t ntohl (uint32_t __netlong)    uint16_t ntohs (uint16_t __netshort) uint32_t htonl (uint32_t __hostlong) uint16_t htons (uint16_t __hostshort)

二 .地址结构

socket api的地址形参不会使用具体的ipv4或者ipv6地址,参数类型是通用地址结构 struct sockaddr,struct sockaddr定义如下 :
 struct sockaddr  {       __SOCKADDR_COMMON (sa_);          char sa_data[14];      }; #define __SOCKADDR_COMMON(sa_prefix) \   sa_family_t sa_prefix##family typedef unsigned short int sa_family_t;

成员sa_family,表示地址族类型,sa_family决定了以什么地址来解析sa_data,
sa_family的三种类型 :

AF_UNIX                     UNIX域协议族AF_INET                     ipv4协议族AF_INET6                    ipv6协议族

ipv4地址结构 sockaddr_in:

 struct sockaddr_in   {     __SOCKADDR_COMMON (sin_);     in_port_t sin_port;             struct in_addr sin_addr;         unsigned char sin_zero[sizeof (struct sockaddr) -              __SOCKADDR_COMMON_SIZE -                sizeof (in_port_t) -               sizeof (struct in_addr)];   };   typedef uint32_t in_addr_t; struct in_addr  {         in_addr_t s_addr;   };

ipv6地址:

struct sockaddr_in6 {     __SOCKADDR_COMMON (sin6_);     in_port_t sin6_port;    /* Transport layer port # */     uint32_t sin6_flowinfo; /* IPv6 flow information */     struct in6_addr sin6_addr;  /* IPv6 address */     uint32_t sin6_scope_id; /* IPv6 scope-id */ };

unix域套接字地址 :

struct sockaddr_un {     __SOCKADDR_COMMON (sun_);    char sun_path[108];     /* Path name.  */ };  

三 .IP地址转换函数,

int inet_pton (int __af, __const char * src, void * dst)const char *inet_ntop (int __af, __const void * srd, char * dst, socklen_t __len)

inet_pton:把src中的字符串IP地址转换成网络字节序的IP地址
inet_ntop:把src中的网络字节序的IP地址转换为字符串

参数 __af为 AF_INET或者AF_INET6,用来区分ipv4和ipv6

四 .api

int socket (int domain, int type, int protocol) 
domain: 取AF_INET或者AF_INET6,用来区分ipv4和ipv6type:   取SOCK_STREAM(TCP)或者SOCK_DGRAM(UDP)protocol:默认值0
int bind (int fd, CONST_SOCKADDR_ARG addr, socklen_t len)
fd  :  socket套接字addr:  ip地址 len :  addr的长度
int listen (int fd, int n) 
fd:套接字n: 完全连接队列的上限,tcp中表示完成三步握手的请求队列上限
int accept (int fd, SOCKADDR_ARG addr, socklen_t  addr_len);
fd:  socketaddr: 接受连接的地址addr_len: 地址长度
 int connect (int fd, CONST_SOCKADDR_ARG addr, socklen_t len)
fd:socketaddr:要连接的地址len:addr的长度
int close(int fd);
关闭连接,引用计数减1,引用计数变为0才真正关闭.
int shutdown (int fd, int how) ;
  直接关闭连接  how的取值:  SHUT_RD   不再读;  SHUT_WR   不再写;  SHUT_RDWR 不再读写.
ssize_t read(int fd, void *buf, size_t nbytes)ssize_t write(int fd, const void *buf, size_t n)ssize_t send(int fd, const void *buf, size_t n, int flags);ssize_t recv(int fd, void *buf, size_t n, int flags);
tcp连接的接收发送数据api,flags用来设置一些参数,如是否阻塞,是否一次读完
ssize_t recvfrom(int fd, void * buf, size_t n, int flags,SOCKADDR_ARG addr, socklen_t *addr_len)ssize_t sendto(int fd, const void *buf, size_t n,int flags, __CONST_SOCKADDR_ARG addr, socklen_t addr_len);
udp接收数据,发送数据的api,因为不是面向连接的,发送时需要填地址,接收时需要保存地址.
ssize_t sendmsg(int fd, const struct msghdr *message,int flags); ssize_t recvmsg (int fd, struct msghdr *message, int flags);
通用的发送,接收消息的api.
int getsockname (int fd, SOCKADDR_ARG addr, socklen_t * len);int getpeername (int fd, SOCKADDR_ARG addr,socklen_t * __len);
获取socket上的本地地址和对端地址.
int getsockopt (int fd, int level, int optname, void * optval,socklen_t * optlen);int setsockopt (int fd, int level, int optname,const void *optval, socklen_t optlen);
获取或者设置套接字的选项值,level取值,SOL_SOCKET,     通用的IPPROTO_IP,     ipv4的IPPROTO_IPV6,   ipv6的IPPROTO_TCP,    TCP选项 
struct hostent *gethostbyname (__const char *name);struct hostent *gethostbyaddr (__const void *addr, __socklen_t len,int type);struct hostent{                char *h_name;         /* Official name of host.  */char **h_aliases;     /* Alias list.  */int h_addrtype;       /* Host address type.  */int h_length;         /* Length of address.  */char **h_addr_list; /*List of addresses from name server.*/#if defined __USE_MISC || defined __USE_GNU# define    h_addr  h_addr_list[0] /* Address, for backward compatibility.*/#endif };
根据地址获取主机的信息
struct servent *getservbyname(const char *name,const char *proto);struct servent *getservbyport (int port, const char *proto);
根据服务名或者端口号获取服务的信息.
0 0
原创粉丝点击