【整理】网络编程socket 函数整理
2016-12-20 16:09
344 查看
/****************************************************************************************************
*
*网络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 .
*
*
相关文章推荐
- 网络编程socket之bind函数
- linux网络编程常用函数详解与实例(socket-->bind-->listen-->accept)
- Linux socket 网络编程常用函数总结
- 网络编程中重要函数总结:如何判断socket关闭
- linux网络编程之socket(十):shutdown 与 close 函数 的区别
- linux网络编程常用函数详解与实例(socket-->bind-->listen-->accept)
- Beej网络socket编程指南 3 socket bind connect 函数
- socket网络编程--初等网络函数介绍
- linux网络编程之socket(十二):select函数的并发限制和 poll 函数应用举例
- linux网络编程之socket(十六):通过UNIX域套接字传递描述符和 sendmsg/recvmsg 函数
- linux网络编程常用函数详解与实例(socket-->bind-->listen-->accept)
- 网络编程socket之close与shutdown函数
- 网络编程socket之accept函数
- linux网络编程之socket(十):shutdown 与 close 函数 的区别
- 网络socket编程指南 3 socket bind connect 函数
- 网络编程socket之connect函数
- linux网络编程常用函数详解与实例(socket-->bind-->listen-->accept)
- 网络编程socket之bind函数
- linux网络编程之socket(十三):epoll 系列函数简介、与select、poll 的区别
- 网络编程socket之bind函数