一 字节序转换函数:
点击(此处)折叠或打开
- #include<netinet/in.h>
- uint16_t htons(uint16_t hostValue);
- uint32_t htonl(uint32_t hostValue);
-
- uint16_t ntohs(uint16_t netValue);
- uint32_t ntohl(uint32_t netValue);
2.字节操作函数:
- #include<strings.h>
- void bzero(void *dest,size_t nSize);
- void bcopy(const void *src,void *dest,size_t nSize);
- void bcmp(const void *ptr1,const void *ptr2, size_t nSize);
- 返回:0 相等,非零 不相等
3.以上是Berkeley函数,接下来给出ANSI C函数:
- #include <string.h>
- void *memset(void *dest,const void *src,size_t nBytes);
- void *memcpy(void *dest,const void *src,size_t nBytes);
- int memcmp(const void *ptr1,const void *ptr2,size_t nBytes);
- 返回值: 0 相同 > 0 或者< 0 不相等
需要注意的是 bcopy 跟memcpy的源跟目的参数的位置相反。
4.地址转换函数:
- #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);
- 返回:指向十进制数串的指针。
INADDR_NONE 是一个32位都为1的数,所以地址255.255.255.255无法被函数inet_addr处理。
另外,函数inet_ntoa的参数是一个结构体对象,不是一个指针或者引用。
5.两个新的函数:
- #include <arpa/inet.h>
- 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 失败
6.isfdtype()函数:
- #include <sys/stat.h>
- int isfdtype(int fd,int fdtype);
- 返回: 1 是指定类型,0 不是指定类型,-1 出错
7.socket()函数:
- #include <sys/socket.h>
- int socket(int family,int type,int protocol);
- 返回: 非负描述字 成功, -1 出错
一般来说socket函数的protocol参数设为0.
8.connect()函数:
- #include <sys/socket.h>
- int connect(int sockfd,const sturct sockaddr *servaddr,socklen_t addrlen);
- 返回: 0 成功,1 出错
connect 返回错误的情况:
1) TCP客户端没有收到SYN分解响应,则返回ETIMEDOUT.
2) 客户的TCP收到RST的SYN分节,表明服务器主机在指定端口上没有进城在等待与之连接。此时
客户端TCP收到RST后,马上返回ECONNREFUSED错误。(硬错误)
3) 如果客户发出的SYN在中间路由器引发一个ICMP的目标地址不可达错误,则用户按一定时间
间隔连续重发SYN,直到超时,内核返回EHOSTUNREACH或ENETUNREACHE错误给进城(软错误).
产生RST消息的情况:
1) SYN到达端口,但端口上没有正在监听的服务器
2) TCP想取消一个已有连接
3) TCP接受了一个根本不存在连接的分节
9.bind()函数:
- #include <sys/socket.h>
- int bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen);
- 返回:0 成功, -1 失败
10.listen()函数:
- #include <sys/socket.h>
- int listen(int sockfd,int backlog);
- 返回:0 成功,1 失败
一般来说,linsten函数应该在bind函数之后,accept函数之前调用。backlog只队列长度
11.accept()函数:
- #include <sys/socket.h>
- int accept(int sockfd,struct sockaddr* cliaddr,socklen_t *addrlen);
- 返回:非负描述字 成功,-1 失败
阅读(451) | 评论(0) | 转发(0) |