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

全部博文(79)

文章存档

2012年(1)

2011年(5)

2010年(19)

2009年(54)

我的朋友

分类: C/C++

2010-09-02 09:30:50

1、Socket Options
(1)可以设置和获取的选项
     .对应于所有的socket类型的generic options
     .靠底层协议支持,在socket层管理的选项
     .与协议对应的选项
(2)setsockopt()

int setsockopt(int sockfd, int level, int option, const void *val,socklen_t len);
             Returns: 0 if OK, -1 on error

     level: generic socket-level options为SOL_SOCKET
            协议专属的时候填写: TCP为IPPROTO_TCP, IP为IPPROTO_IP
     option:(P580)
     val:根据option,指向一个数据结构体或者整数
     len:val指向的数据长度大小

(2)getsockopt()

#include <sys/socket.h>
int getsockopt(int sockfd, int level, int option, void *restrict val, socklen_t *restrict lenp);
           Returns: 0 if OK, -1 on error

    lenp:指向整数的指针,调用getsockopt之前,设置成拷贝options到buffer的大小
            如果option>lenp,option将被安静的truncated;
            如果option<=lenp,lenp==option大小

2、Out-of-Band Data
(1)在传送队列中,Out-of-Band Data比任何其他的数据都先发送
   这是某些协议的选项特性,比如TCP支持,UDP就不支持
(2)TCP只支持1个byte的 "urgent"数据
   可以在send() sendto() sendmsg()三个函数中设置MSG_OOB标志
   但是如果设置超过1byte,只有最后1byte当着"urgent"数据
(3)当"urgent"数据接收到时,一般发送SIGURG信号
   可以安排规定的进程去接收信号

fcntl(sockfd, F_SETOWN, pid);
owner = fcntl(sockfd, F_GETOWN, 0)

   pid>0,sockfd归属于哪个pid
   pid<-1,代表sockfd归属于哪个group ID==pid的进程

(4)TCP还支持urgent mark
   urgent数据将出现在普通数据流的哪一点
   可以用SO_OOBINLINE选项让urgent数据跟普通数据一块接收,为了确认到达urgent mark可以使用sockatmark()函数

#include <sys/socket.h>
int sockatmark(int sockfd);
         Returns: 1 if at mark. 0 if not at mark, -1 on error

  也可以设置MSG_OOB标志,使用recv(), recvfrom(), recvmsg()函数中的1个提前接收urgent数据

3、Nonblocking and Asynchronous I/O
   当可以读取socket数据时,或者写队列的时候有空间了,可以发送SIGIO信号
   允许异步I/O需要2步:
             .建立socket拥有关系,以便signal可以投递
                      .使用fcntl的F_SETOWN命令
                      .使用ioctl的FIOSETOWN命令
                      .使用ioctl的SIOCSPGRP命令
注:LINUX不支持后2个命令
             .当I/O操作不会被block时,告诉socket我们要它singal us
                      .使用fcntl的F_SETFL命令并使用O_ASYNC标志
                      .使用ioctl的FIOASYNC命令





阅读(507) | 评论(0) | 转发(0) |
0

上一篇:Network IPC: Sockets(2)

下一篇:VIM 小技巧

给主人留下些什么吧!~~