Chinaunix首页 | 论坛 | 博客
  • 博客访问: 428069
  • 博文数量: 139
  • 博客积分: 106
  • 博客等级: 民兵
  • 技术积分: 613
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-24 16:03
文章分类

全部博文(139)

文章存档

2016年(1)

2014年(16)

2013年(23)

2012年(98)

2011年(1)

分类:

2012-07-25 15:46:45

原文地址:Unix socket 编程 函数解析 作者:zxqcreazy

一 字节序转换函数: 

点击(此处)折叠或打开

  1. #include<netinet/in.h>
  2.     uint16_t htons(uint16_t hostValue);
  3.     uint32_t htonl(uint32_t hostValue);
  4.     
  5.     uint16_t ntohs(uint16_t netValue);
  6.     uint32_t ntohl(uint32_t netValue);
2.字节操作函数:  

点击(此处)折叠或打开

  1. #include<strings.h>
  2.     void bzero(void *dest,size_t nSize);
  3.     void bcopy(const void *src,void *dest,size_t nSize);
  4.     void bcmp(const void *ptr1,const void *ptr2, size_t nSize);
  5.     返回:0 相等,非零 不相等
3.以上是Berkeley函数,接下来给出ANSI C函数:

点击(此处)折叠或打开

  1. #include <string.h>
  2.     void *memset(void *dest,const void *src,size_t nBytes);
  3.     void *memcpy(void *dest,const void *src,size_t nBytes);
  4.     int memcmp(const void *ptr1,const void *ptr2,size_t nBytes);
  5.           返回值:  0 相同   > 0 或者< 0 不相等
 需要注意的是 bcopy 跟memcpy的源跟目的参数的位置相反。

4.地址转换函数:

点击(此处)折叠或打开

  1. #include <arpa/inet.h>
  2.     int inet_aton(const char *strptr,struct in_addr *addrptr);
  3.             返回:1 串有效, 0 穿有错
  4.     in_addr_t inet_addr(const char *strptr);
  5.             返回:若成功,返回32位二进制网络字节序地址,若有错,返回INADDR_NONE
  6.     char *inet_ntoa(struct in_addr inaddr);
  7.             返回:指向十进制数串的指针。
INADDR_NONE 是一个32位都为1的数,所以地址255.255.255.255无法被函数inet_addr处理。
另外,函数inet_ntoa的参数是一个结构体对象,不是一个指针或者引用。

5.两个新的函数:

点击(此处)折叠或打开

  1. #include <arpa/inet.h>
  2.     int inet_pton(int family,const char *strptr,void *addrptr);
  3.                 返回:1 成功,0 输入不是有效表达格式,-1 出错。
  4.     const char *inet_ntop(int family,const void* addrptr,char *strptr, size_t len);
  5.                 返回: 指向结果的指针  成功,NULL   失败
6.isfdtype()函数:

点击(此处)折叠或打开

  1. #include <sys/stat.h>
  2.     int isfdtype(int fd,int fdtype);
  3.     返回: 1 是指定类型,0 不是指定类型,-1 出错
7.socket()函数:

点击(此处)折叠或打开

  1. #include <sys/socket.h>
  2.     int socket(int family,int type,int protocol);
  3.     返回: 非负描述字 成功, -1 出错
   一般来说socket函数的protocol参数设为0.
8.connect()函数:

点击(此处)折叠或打开

  1. #include <sys/socket.h>
  2.     int connect(int sockfd,const sturct sockaddr *servaddr,socklen_t addrlen);
  3.     返回: 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()函数:

点击(此处)折叠或打开

  1. #include <sys/socket.h>
  2.     int bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen);
  3.      返回:0 成功, -1 失败
10.listen()函数:

点击(此处)折叠或打开

  1. #include <sys/socket.h>
  2. int listen(int sockfd,int backlog);
  3.     返回:0 成功,1 失败
  一般来说,linsten函数应该在bind函数之后,accept函数之前调用。backlog只队列长度
11.accept()函数:

点击(此处)折叠或打开

  1. #include <sys/socket.h>
  2. int accept(int sockfd,struct sockaddr* cliaddr,socklen_t *addrlen);
  3.     返回:非负描述字 成功,-1 失败

阅读(413) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~