Chinaunix首页 | 论坛 | 博客
  • 博客访问: 316656
  • 博文数量: 79
  • 博客积分: 1480
  • 博客等级: 上尉
  • 技术积分: 848
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-11 15:29
文章分类

全部博文(79)

文章存档

2012年(1)

2011年(5)

2010年(19)

2009年(54)

我的朋友

分类: C/C++

2010-08-25 15:11:35

1、Connection Establishment
(1)connect() (conenection-oriented才用:SOCK_STREAM, SOCK_SEQPACKET)

#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t len);
                Returns: 0 if OK, -1 on error

注:1、如果sockfd没有绑定到地址,那么connect会绑定一个默认地址
      2、SOCK_DGRAM也可以用connect,connect只是SOCK-DGRAM的一个优化替代,这样保证了目标地址用于发送和接收
(2)listen()

#include <sys/socket.h>
int listen(int sockfd, int backlog);
           Returns: 0 if OK, -1 on error

backlog:暗示系统上进程上显著的连接数量,最大值SOMAXCONN,一旦队列满,系统会拒绝多余的连接请求
(3)accpet() retrieve 1个连接请求并转化成一个连接

#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict len);
      Returns: file(socket) descriptor if OK, -1 on error

注:1、可以把addr和len设置为NULL,这样可以接受任意客户端连接
    2、如果没有连接请求发生,accpet()会block直到有1个连接; 如果设置为nonblock mode,则返回-1并把errno设置为EAGAIN或EWOULDBLOCK
    3、server可以用poll或者select等待连接请求到来,这样即将到来的连接请求socket表现出似乎是可读的
2、Data Transfer
(1)send() 

#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags);
          Returns: number of bytes sent if OK, -1 on error

注:1、像fd的write, buf和nbytes同write
      2、flags
 Flag  Description  POSIX.1 FreeBSD 5.2.1  linux 2.4.22  MAC OS X 10.3  Solaris 9 
             
 MSG_DONTROUTE 不要在local network之外路由包     ★  ★  ★  ★
 MSG_DNOTWAIT 允许O_NONBLOCK     ★  ★  ★  
 MSG_EOR 若协议支持,表示记录结束   ★  ★  ★    
 MSG_OOB 若协议支持,发送out-of-band数据   ★  ★  ★  ★  ★
     3、若协议支持message boudaries,如果发送的单个message大于协议支持的最大数值,send()会失败并把errno设置为EMSGSIZE; 而byte-stream协议则会等待整个数据都被传送完
(2) sendto()

#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t nbytes, int flags, const struct sockaddr *destaddr, socklen_t destlen);
          Returns: number of bytes sent if OK, -1 on error

注:1、如果是个connection-oriented socket,那么目的地址忽略;而connectionless socket不能用send,除非之前有connect指定了,而用sendto
(3) sendmsg()

#include <sys/socket.h>
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
       Returns number of bytes sent if OK, -1 on error

像writev()函数

struct msghdr {
   void *msg_name; // optional address
   socklen_t msg_namelen; // address size in bytes
   struct iovec *msg_iov; // array of I/O buffers
   int msg_iovlen; // number of elements in array
   void *msg_control; // ancillary data
   socklen_t msg_controllen; // number of ancillary bytes
   int msg_flags; // flags for received message
   .
   .
   .
};

struct iovec

struct iovec {
   void *iov_base; // starting address of buffer
   size_t iov_len; // size of buffer;
};

(4) recv()

#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags);
         Returns: length of message in bytes,
0 if no messages are available and peer has done an orderly shutdown
                   -1 on error

注:1、像fd的read()
      2、flags
 Flag Description  POSIX.1  FreeBSD 5.2.1  Linux 2.4.22  MAC OS X 10.3  Solaris 9 
             
MSG_OOB  若协议支持,接受out-of-band数据   ★  ★  ★  ★  ★
MSG_PEEK 返回包裹内容without consuming packet   ★  ★  ★  ★  ★
MSG_TRUNC 即使被truncated,也返回包裹的实际长度       ★    
MSG_WAITALL 等待直到所有数据可取(只对SOCK_STREAM)   ★  ★  ★  ★  ★
   3、MSG_PEEK是预读取下一部分数据的意思
(5) recvfrom()

#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *restrict buf, size_t len, int flags, struct sockaddr *restrict addr, socklen_t *restrict addrlen);
        Returns: length of message in bytes,
0 if no messages are available and peer has done an orderly shutdown
                  -1 on error

注:常用于connectionless sockets
(6)recvmsg() 

#include <sys/socket.h>
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

        Returns: length of message in bytes,
if no messages are available and peer has done an orderly  shutdown
                  -1 on error

注:1、接收数据进multiple buffers,类似readv,或者想接收ancillary 数据
      2、flags,
 Flags  Description POSIX.1  FreeBSD 5.2.1  Linux 2.4.22  MAC OS X 10.3  Solaris 9 
             
MSG_CTRUNC 控制数据被truncated   ★  ★  ★  ★  ★
MSG_DNOTWAIT recvmsg在nonblocking模式       ★    ★
MSG_EOR 接收到记录结束   ★  ★  ★  ★  ★
MSG_OOB 接收到out-of-band数据   ★  ★  ★  ★  ★
MSG_TRUNC 普通数据被truncated   ★  ★  ★  ★  ★
阅读(741) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~