【整理】网络编程socket 函数整理

来源:互联网 发布:淘宝睡衣好评语50字 编辑:程序博客网 时间:2024/06/06 17:24


 /****************************************************************************************************
 *
 *网络IPC: 套接字socket .
 *
 ****************************************************************************************************/


 *
 *函数名  : Socket
 *功能 : 创建一个套接字
 *头文件 : sys/socket.h
 *
 *原型 : int socket(int domain,int type,int protocol);
 *
 *返回值 : 成功 : 返回文件(套接字)描述符 ; 出错 : -1;
 *
 *参数 :  domain(域) :  确定通信的特性 ,包括地址格式。各个域都有自己表示地址的格式,而表示各个域的常数以AF_开头意指地址族:
 *  AF_INET  :  IPv4因特网域  ;    AF_INET6   :  IPv6因特网域  ;
 *  AF_UNIX  :  UNIX 域       ;    AF_UPSPEC  :  未指定        ; 
 *
 *参数 :  type :  确定套接字类型,进一步确定通信特征 。 下面为POSIX定义的套接字类型 :
 * SOCK_DGRAM  :  固定长度的,无连接,不可靠的报文传递.
 * SOCK_RAW   :  IP协议的数据报接口(在POSIX.1)中为可选.
 * SOCK_SEQPACKET  :  固定长度 ,有序的 , 可靠地 , 面向链接的报文传递.
 * SOCK_STREAM :  有序的 , 可靠地 , 双向的 , 面向连接的字节流 .
 *
 *参数 :  protocol(协议)  :  通常为 0 ,表示 为 给定的 域和套接字类型选择默认协议 .
 *当对同一域 和 套接字类型支持多个协议时,可以使用protocol 选择一个特定协议 .
 *在AF_INET通信域中,套接字类型 SOCK_STREAM的默认协议是传输控制协议(TCP).
 *在AF_INET通信域中,套接字类型 SOCK_DGRAM的默认协议是UDP.
 *     
 *协议 :                 描述 : 
 *IPPROTO_IP             IPv4网际协议
 *IPPROTO_IPV6           IPv6网际协议 
 *IPPROTO_ICMP           因特网控制报文协议
 *IPPROTO_RAW 原始IP数据包协议
 *IPPROTO_TCP 传输控制协议
 *IPPROTO_UDO 用户数据报协议 
 *
 *
 *
 




 *
 *函数名  : bind
 *功能 : 指定套接字使用的地址和端口(Sockfd : Scokaddr_in)
 *头文件 : sys/socket.h
 *
 *原型 : int bind(int sockfd, const struct sockaddr *addr, socklen_t len );
 *
 *返回值 : 成功  :  0   出错  :  -1 (并且设置errno为EADDRINUSER) 最常见的错误是该端口已经被其他程序绑定 ;
 *
 *参数 :  sockfd  : 是由socket()函数返回的套接字描述符 ;
 *参数 :  addr    : 是一个指向 struct sockaddr的指针 ,包含有关地址的信息如名称,端口和ip地址
 *参数 :  len     : 套接字地址接口的长度, 可设置为 sizeof(struct sockaddr);
 *
 *注意 :  当指定端口号为0 时 ,表示由系统动态分配一个可用端口。 
 *   :  使用端口号小于1024的端口,需要具有root权限, 端口号范围 : (0~65535)65536个 ;
 *   :  如果设置的端口号已分配给了其他进程,那么bind()函数将出错。   
 *   
 *特别说明 :  对于因特网 如果指定的地址为INADDR_ANY(netinet/in.h),表示任意IP地址,
 *
 *


  
 
 *
 *结构体名 : struct sockaddr
 *
 *解释 :  网络地址的表示主要通过两个主要的数据类型 : sockaddr 和 scoketaddr_in 
 *  为使不同格式的地址能够传入到套接字函数,地址会被强制转换成通用地址结构 : sockaddr_in
 *
 *头文件 : netinet/in.h
 *
 *原型 : struct sockaddr{
 * sa_family_t sin_family;      /*地址族,AF_XXX*/
 * char sa_data[]; /*可变长地址*/
 * }
 *
 *成员 : sin_family : AF_XXX 一般为AF_INET IPv4协议 
 * sa_data[]  : 包含了一些远程电脑的地址,端口和套接字数目,它里面的数据是混在在一起的。 
 *
 *注意 : 套接字可以自由的添加额外的成员 并且定义sa_data的大小 , 在linux 中该结构 sa_data大小为 14
 *
 *
 


 *
 *结构体名 : struct sockaddr_in
 *
 *解释 :  在IPv4因特网域中 , 套接字地址用结构 sockeaddr_in 表示 
 *
 *头文件 : netinet/in.h
 *
 *原型 : struct sockaddr_in{
 * sa_family_t sin_family;      /*地址族,AF_XXX*/
 * in_port_t sin_port;     /*端口号*/
 * struct in_addr sin_addr      /*IPv4地址*/
 * unsigned char sin_zero[8];   /*添0 和socket address 一样大小*/
 * }
 *
 *成员 : struct in_addr {
 * in_addr_t s_addr;
 * }
 *
 *
 *注意 : 每个实现可以自由的添加更多的字段 ,本结构是在linux 中的。
 *     :  
 *   : 其中in_addr_t 定义为 uint32_t 4字节  in_port_t定义成 uint_16_t 2字节
 *   : sin_zero[8]  8字节(8+6=14) 是为了使两个结构在内存中具有相同的尺寸. 使用时要把sin_zero全添0值.
 *
 
 
 
 *
 *结构体名 : hostent
 *
 *解释 : 大概是 跟主机信息相关的结构体。
 *
 *头文件 : 
 *
 *原型 : struct hostent{
 * char *h_name;             /*主机名*/
 * char **h_aliases;         /*一个以NULL结尾的数组,里面存了主机的备用名称*/
 * int h_addrtype;    /*地址类型(AF_XXX)*/
 * int h_length;  /*地址长度(字节)*/
 * char **h_addr_list;  /*一个指向存储了网络地址的数组的指针*/
 *  .
 *  .
 *  .
 * };
 * #dfine h_addr h_addr_list[0]
 *
 *成员 : h_addr 是 h_addr_list数组的第一个成员.
 *
 *注意 : 网络地址是以网络字节序存储的。
 *
 *
 *
 *
 
 


 *
 *函数名  : htons,htonl,ntohs,ntohl; (h : 主机 to : 转换到 n : 网络 s : 短整数 l : 长整数)
 *功能 : 字节序转换 
 *头文件 : arpa/inet.h 
 *
 *原型 : uint32_t htonl(uint32_t hostint32);    uint16_t htonl(uint16_t hostint16); 
 *
 *返回值 : 返回字节序表示的整数。
 *
 *参数 :  
 *  
 *相关说明 : 也没啥好说的 了解一下书上的即可吧。
 *
 *






 *
 *函数名  : connect
 *功能 : 
 *头文件 : sys/socket.h
 *
 *原型 : int connect(int sockefd,const struct sockaddr *addr,socklen_t len)
 *
 *返回值 : 成功  :  0;    出错  :  -1;
 *
 *参数 :  
 *  
 
 


 *
 *函数名  : listen
 *功能 : 当一个套接字绑定到某个端口上之后,就可以通过调用Listen()函数来准备接收客户端提出的连接请求了。
 *头文件 : sys/socket.h
 *
 *原型 : int listen(int sockfd,int backlog)
 *
 *返回值 : 成功  :  0;    出错  :  -1;
 *
 *参数 : sockfd : 套接字描述符.
 *参数 : backlog : 该进程所要入队的未完成连接请求数量 ; 
 *
 *注意 : 一旦队列满,系统就会拒接多余连接请求,所以backlog的值应该基于服务器期望负载和处理量来选择。
 *
 *  
 
 
 
 *
 *函数名  : accept
 *功能 : 当服务器调用listen(),所用的套接字就能接收连接请求.使用accept函数响应连接请求 ,并建立连接 
 *产生一个新的socket描述符来描述该连接, 该连接用来与特定的客户端交换信息。       
 *
 *头文件 : sys/socket.h
 *
 *原型 : int accept(int sockfd,struct sockaddr *restrict addr,socklen_t *restrict len);
 *
 *返回值 : 成功 : 套接字描述符 ;    失败 :  -1  ;
 *
 *参数 :  sockfd  :  该描述符 ;连接到调用connect的客户端.这个新的套接字描述符(用于和已连接的客户端进
 *  行数据通信)和原始套接字(倾听客户端的连接请求)具有相同的套接字类型和地址族.传递给accept的原
 *  始套接字没有关联到这个连接,而是继续保持可用状态并接收其他连接请求。
 *参数 :  addr 和  len  可以设置为NULL(如果不关心客户端标志),否则,在调用accept之前 , 将addr参数设
 *  置为足够大的缓冲区来存放地址, 并且将len指向的整数设为这个缓冲区的字节大小。返回时,accept
 *    会在缓冲区填充客户端地址,并且更新指向len的整数来反应该地址的大小。
 *
 *注意 :  如果没有连接请求在等待,accept会阻塞直到一个请求到来。如果sockfd处于非阻塞模式,accept会返
 *  回 -1 .并将errno 设置为EAGAIN 或EWOULDBLOCK。
 *
 *   :  accept默认为阻塞函数, 调用该函数后,将一直阻塞直到有连接请求.如果执行成功, 返回值是由内核
 *  自动生成的一个新的socket,同时将远程计算机的地址信息填充到参数addr所指的内存空间.
 *
 *




 *
 *
 *函数名  : intet_addr
 *功能 : 把一个用数字和点表示的IP地址的字符串转换成一个无符号长整型。
 *头文件 : arpa/inet.h
 *
 *原型 : in_addr_t inet_addr(const char *strptr)
 *
 *返回值 : 成功 : (网络字节序) 的无符号长整型数 ;         失败  : -1 ;
 *
 *参数 :  strptr  :  IP地址  .
 *
 *注意 : 不需要用到 hton 函数 inet_addr 返回的已经是网络字节顺序.
 *  
 *




 *
 *函数名  : intet_ntoa   (ntoa : Network to ASCII)
 *功能 : 把一个32位网络字节顺序的struct in_addr 结构体转换成相应的点分十进制字符串.
 *头文件 : arpa/inet.h
 *
 *原型 : char *inet_ntoa(struct in_addr inaddr) ;
 *
 *返回值 : 成功 : 返回一个字符串指针,它指向一个定义在函数inet_ntoa()中的static类型字符串。         失败  :  ;
 *
 *参数 :  
 *
 *注意 : 每次调用inet_ntoa ,都会将static类型字符串改变成为【最后一次】调用时得到的结果. 如果想保存ntoa的结果可以
 *   在每次调用inet_ntoa()后调用strcpy 将结果保存到另一个自己的字符串中 。 
 *




 *
 *函数名  : gethostbyname
 *功能 : 通过域名获得主机信息.?
 *头文件 : netdb.h 
 *
 *原型 : struct hostent *gethostbyname(const char *name);
 *
 *返回值 : 成功 : 返回一个指向hostent结构体的指针 .     失败  :  NULL  .
 *
 *参数 :  name : 指向域名的指针? 。 
 *  
 *
 *




 *
 *函数名  :  connect
 *功能 : 如果要处理一个面向连接的网络服务,那么在开始交换数据之前,要在请求服务的进程套接字(客户端)
 *和提供服务的进程套接字(服务器)之间建立一个连接  , 使用connect 建立连接.
 *
 *头文件 : sys/types.h   sys/socket.h
 *
 *原型 : int connect(int sockfd,struct sockaddr *addr,int len) 
 *
 *返回值 : 成功  :  0     ;         失败   :  -1
 *
 *参数 :  sockfd : 套接字描述符 ;
 *参数 :  addr   : 一个存储远程计算机的IP地址和端口信息的sockaddr结构 ; 
 *参数 :  len    : addr结构体所占用内存的大小 ;
 *
 *注意 :  在connect中指定的地址是我们想与之通信的服务器地址。如果sockfd没有绑定到一个地址,connect
 *    会给调用者绑定一个默认地址.
 *   :  当尝试连接时,出于一些原因,连接可能失败 .想要一个连接请求成功, 要连接的计算机必须是开启的
 *  并且正在运行 ,服务器必须绑定到一个想与之连接的地址上,并且服务器的等待连接队列要有足够的
 *      空间 , 因此应用程序必须能够处理connect返回的错误 ,这些错误可能是由一些瞬间条件引起 .
 *








 *
 *函数名  : send
 *功能 : 用来发送数据 ,与write函数很像 ,但可以指定标志来改变处理传输数据的方式.
 *头文件 : sys/socket.h
 *
 *原型 : ssize_t send(int sockfd,const void *buf,size_t nbytes,int flags);
 *
 *返回值 : 成功 : 反回发送的字节数 ;    出错 :  -1 ;
 *
 *参数 :  sockfd : 代表与远程程序连接的套接字描述符 . 
 *参数 :  buf    : 是一个指针 ,指向想发送或存储信息的地址 .
 *参数 :  nbytes : 欲发送信息的长度 .
 *参数 :  flags  : 与write不同的参数 ,发送或接收标志 ,一般都设值为0. 
 *  : MSG_CONFIRM    :  提供链路层反馈以保持地址映射标志 ; 
 *  : MSG_DONTROUTE  :  勿将数据报路由出本地网络 ;
 *  : MSG_DONTWAIT   :  允许非组赛操作 等价与使用O_NONOBLOCK;
 *  : MSG_EOF        :  发送数据后关闭套接字的发送端 (linux 3.2.0 不支持);  
 *  : MSG_EOR        :  如果协议支持 , 表级记录结束 ;
 *  : MSG_MORE       :  延迟发送数据包允许写更多的数据 ; 
 *  : MSG_NOSIGNAL   :  在写无连接的套接字时不产生SIGPIPE信号 ;  
 *  : MSG_OOB        :  若协议支持 ,发送带外数据 ;
 *
 *
 *
 
 
 
 
 *
 *函数名  : sendto
 *功能 : 和send函数基本一致 ;
 *头文件 : sys/socket.h
 *
 *原型 : ssize_t send(int sockfd,const void *buf,size_t nbytes,int flags,const struct sockaddr *destaddr,socklen_t destlen);
 *
 *返回值 : 成功 : 反回发送的字节数 ;    出错 :  -1 ;
 *
 *参数 :  sockfd    : 代表与远程程序连接的套接字描述符 . 
 *参数 :  buf       : 是一个指针 ,指向想发送或存储信息的地址 .
 *参数 :  nbytes    : 欲发送信息的长度 .
 *参数 :  flags     : 与write不同的参数 ,发送或接收标志 ,一般都设值为0. 与send中的flag参数一致 .
 *参数 :  destaddr  : 指向了包含了远程主机的IP地址和端口数据的结构的指针 .
 *参数 :  destlen   : 指出了destaddr在内存中的大小 .
 *
 *注意 : 对于面向连接的套接字 , 目标地址是被忽略的 , 因为连接中隐含了目标地址 .对于无连接的套接字 ,
 *       除非先调用connect设置了目标地址 , 否则不能使用send.
 *
 *  






 *
 *函数名  : recv
 *功能 : 和read很相似 , 但recv可以指定标志来控制如何接收数据.
 *头文件 : sys/socket.h 
 *
 *原型 : ssize_t recv(int sockfd,void *restrict buf,size_t len,int flags,struct sockaddr *restrict addr,socklen_t *restrict addrlen) ;
 *
 *返回值 : 返回接收到的数据的字节长度 ; 若无可用数据或等对方已经按序结束 ,返回0 ;     若出错  :  -1  ;
 *
 *参数 : sockfd : 要读取数据的套接字描述符 . 
 *参数 : buf    : 指针指向要存储数据的内存缓冲区域 .  
 *参数 : len    : 缓冲区的最大尺寸 .
 *参数 : flags  : 是recv()函数的标志 ,一般都为0 . 
 *
 *  : MSG_CMSG_CLOEXEC  :  为UNIX域套接字上接收的文件描述符设置执行时关闭标志 ; 
 *  : MSG_DONTWAIT      :  启用非组赛操作 等价与使用O_NONOBLOCK;
 *  : MSG_ERRQUEUE      :  接受错误信息作为辅助 ;  
 *  : MSG_PEEK          :  返回数据包内容而不真正取走数据包 ;
 *  : MSG_TRUNC         :  即使数据包被截断 , 也返回数据包的实际长度 ; 
 *  : MSG_WAITALL       :  等待直到所有的数据可用(仅SOCK_STREAM) ;  
 *
 *
 *
   










 *
 *函数名  : recvfrom
 *功能 : 
 *头文件 : sys/socket.h 
 *
 *原型 : ssize_t recvfrom(int sockfd,void *restrict buf,size_t len,int flags,struct sockaddr *restrict addr,socklen_t *restrict addrlen) ;
 *
 *返回值 : 返回接收到的数据的字节长度 ; 若无可用数据或等对方已经按序结束 ,返回0 ;     若出错  :  -1  ;
 *
 *参数 : sockfd  : (要读取数据)的套接字描述符 . 
 *参数 : buf     : 指针指向要存储数据的内存缓冲区域 .  
 *参数 : len     : 缓冲区的最大尺寸 .
 *参数 : flags   : 是recv()函数的标志 ,一般都为0 标志同recv. 
 *参数 : addr    : 指向一个struct addr的结构 ,里面存有远程的IP地址和端口数 ;
 *参数 : addrlen : 当函数返回时 ,addrlen指向的数据是参数addr所指结构所占的内存大小 ; 
 *
 *注意 : 当调用recvfrom时 , 需要设置addrlen参数指向一个整数 ,该整数包含addr所指向的套接字缓冲区的字节长度 ;  
 *       返回时该整数设为该地址的实际字节长度 .
 *     : 因为可以获得发送者的地址 , recvfrom通常用于无连接的套接字 .否则 , recvfrom等同于recv .
 *
 *
0 0
原创粉丝点击