没有合适的资源?快使用搜索试试~ 我知道了~
Unix网络编程API.doc
3 浏览量
2022-12-01
12:32:23
上传
评论
收藏 456KB DOC 举报
Unix网络编程API.doc
资源推荐
资源详情
资源评论












Unix 网络编程 API
1.字节序函数
#include <netinet.h>
uint16_t htons(uint16_t host16bitvalue);
uint32_t htonl(uint32_t host32bitvalue);
返回:网络字节序值
uint16_t ntohs(uint16_t net16bitvalue);
uint32_t ntohl(uint32_t net32bitvalue);
返回:主机字节序值
一个测试本机字节序的程序,可参见见 unpv12e:intro/byteorder.c。
2.字节操作函数
#include <strings.h>
void bzero(void *dest, size_t nbytes);
void bcopy(const void *src, void *dest, size_t nbytes);
int bcmp(const void *ptr1, const void *ptr2, size_t nbytes);
返回:0—相等,非 0—不相等
#include <string.h>
void *memset(void *dest, int c, size_t len);
void *memcpy(void *dest, void *src, size_t nbytes);
int memcmp(const void *ptr1, const void *ptr2, size_t nbytes);
返回:0—相同,>0 或<0—不相同;进行比较操作时,假定两个不相等的字节均为无符号字符
(unsigned char)。
3.地址转换函数
#include <arpa/inet.h>
int inet_aton(const char *strptr, struct in_addr *addrptr);
返回:1—串有效,0—串有错。

in_addr_t inet_addr(const char *strptr);
返回:若成功,返回 32 为二进制的网络字节序地址;若有错,则返回 INADDR_NONE。
char *inet_ntoa(struct in_addr inaddr);
返回:指向点分十进制数串的指针。
int inet_pton(int family, const char *strptr, void *addrptr);
返回:1—成功;0—输入不是有效的表达格式,-1—出错。
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
返回:指向结果的指针—成功,NULL—失败。
说明:
� inet_aton 函数的指针若为空,则函数仍然执行输入串的有效性检查,但
不存储任何结果。
� inet_addr 的缺陷:出错返回值 INADDR_NONE 等于 255.255.255.255
(IPv4 的有限广播地址),所以该函数不能处理此地址。
尽量使用 inet_aton,不使用 inet_addr。
� inet_ntoa 函数的执行结果放在静态内存中,是不可重入的。
� 参数 family 可以是 AF_INET,也可以是 AF_INET6,若参数 family 不被
支持,则出错,errno 置为 EAFNOSUPPORT。
� 指针 addrptr 是结构指针。
� len 指定目标的大小,避免缓冲区溢出。如果 len 太小,则返回一个空指
针,errno 置为 ENOSPC。为有助于规定该大小,有如下定义:
#include <netinet.h>
#define INET_ADDRSTRLEN 16 /*fro IPv4 dotted-decimal */
#define INET6_ADDRSTRLEN 46 /*for IPv6 hex string */
� inet_ntop 函数的参数 strptr 不能为空指针,成功时,此指针即是函数的
返回值。
实现 IPv4 版本的 inet_pton 和 inet_ntop 的程序,参见:unpv12e:
libfree/inet_pton_ipv4.c 和 libfree/inet_ntop_ipv4.c。
4.readn、writen 和 readline
函数原型如下:
ssize_t readn(int filedes, void *buff, size_t nbytes);

ssize-t writen(int filedes, void *buff, size_t nbytes);
ssize_t readline(int filedes, void *buff, size_t maxlen);
返回:读写字节数,-1—出错。
实现程序见:unpv12e:lib/readn.c、lib/writen.c、lib/readline1.c 和 lib/readline.c。
5.测试描述符类型
#include <sys/stat.h>
int isfdtype( int fd, int fdtype);
返回:1—是指定类型,0—不是指定类型,-1—出错。
要测试是否为套接口描述子,fdtype 应设为 S_IFSOCK。
该函数的一个实现程序,参见 unpv12e:lib/isfdtype.c
6.socket 函数
#include <sys/socket.h>
int socket(int family, int type, int protocol);
返回:非负描述字—成功,-1—出错。
family 指定协议族,有如下取值:
� AF_INET IPv4 协议
� AF_INET6 IPv6 协议
� AF_LOCAL Unix 域协议
� AF_ROUTE 路由套接口
� AF_KEY 密钥套接口
type 指定套接口类型:
� SOCK_STREAM 字节流套接口
� SOCK_DGRAM 数据报套接口
� SOCK_RAW 原始套接口

protocol 一般设为 0,除非用在原始套接口上。
并非所有 family 和 type 的组合都是有效的。
AF_LOCAL 等于早期的 AF_UNIX。
7.connect 函数
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
返回:0—成功,-1—出错。
sockfd 是 socket 函数返回的套接口描述字,servaddr 和 addrlen 是指向服务器的套接口地址结
构指针和结构大小。
在调用 connect 之前不必非得调用 bind 函数。
如果是 TCP,则 connect 激发 TCP 的三路握手过程,在阻塞情况下,只有在连接建立成功或出
错时该函数才返回,
出错情况:
� 没有收到 SYN 分节的响应,在规定时间内经过重发仍无效,则返回
ETIMEDOUT;
� 如果对 SYN 分节的响应是 RST,表示服务器在指定端口上没有相应的服
务,返回 ECONNREFUSED;
� 如果发出 SYN 在中间路由器上引发一个目的地不可达 ICMP 错误,在规
定时间内经过重发仍无效,则返回 EHOSTUNREACH 或 ENETUNREACH 错误。
注意:如果 connect 失败,则套接口将不能再使用,必须关闭,不能对此套接口
再调用函数 connect。
8.bind 函数
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *maddr, socklen_t addrlen);
返回:0—成功,-1—出错。

进程可以把一个特定的 IP 地址捆绑到他的套接口上,但此 IP 地址必须是主机的一个接口。
对于 IPv4,通配地址是 INADDR_ANY,其值一般为 0;使用方法如下:
struct sockaddr_in servaddr;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
对于 IPv6,方法如下:
struct sockaddr_in6 serv;
serv.sin6_addr = in6addr_any; (系统分配变量 in6addr_any 并将其初始化为常值
IN6ADDR_ANY_INIT。)
如果让内核选择临时端口,注意的是 bind 并不返回所选的断口值,要得到一个端口,必须使用
getsockname 函数。
bind 失败的常见错误是 EADDRINUSE(地址已使用)。
9.listen 函数
#include <sys/socket.h>
int listen(int sockfd, int backlog);
返回:0—成功,-1—出错。
listen 把未连接的套接口转化为被动套接口,指示内核应接受指向此套接口的连接请求。第二个
参数规定了内核为此套接口排队的最大连接数。
参数 backlog 曾经规定为监听套接口上的未完成连接队列和已完成连接队列总和的最大值,但各
个系统的定义方法都不尽相同;历史上常把 backlog 置为 5,但对于繁忙的服务器是不够的;
backlog 的设置没有一个通用的方法,依情况而定,但不要设为 0。
10.accept 函数
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
返回:非负描述字—OK,-1—出错。
accept 从已完成连接队列头返回下一个连接,若已完成连接队列为空,则进程睡眠(套接口为
阻塞方式时)。
剩余35页未读,继续阅读
资源评论

zzzzl333
- 粉丝: 3
- 资源: 6万+

上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制
