加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

套接口的类型--摘录

(2010-12-10 11:06:17)
标签:

杂谈

分类: linux编程

原文链接http://hi.baidu.com/csw8923/blog/item/fc34d3011bef2b0b728da55b.html

以下无责任转载..

套接口是网络通信端点的一种抽象概念,它向应用程序提供数据发送和接收的功能。
     有三种基本套接口类型:
    
       SOCK_STREAM:流套接口,对应于TCP协议,应向应用程序提供可靠地面向链接的数据传输服务。
       也称面向连接的套接口、TCP套接口等。
      
       SOCK_DGRAM:数据报套接口,对应于UDP协议,向应用程序提供不可靠的、非链接的数据报通信方式。
       也称为无连接套接口、面向消息套接口、UDP套接口等。
      
       SOCK_RAW:原始套接口,可以读写ICMP、IGMP报文,可用于从IP头起构造自己的报文。
      
       I/O 模式
      
       套接口I/O模式 指输入、输出时调用那些函数操作的工作模式。
       Winsock支持两种I/O模式:阻塞(BLOCK) 和 非阻塞(NONBLOCK)
      
       阻塞模式 - I/O操作 执行Winsock函数(send/sendto和 recv/recvfrom)不会立即返回,会一直等待直到操作完成。
       从程序运行效率 - 阻塞模式适合
      
       默认情况下Winsock函数都是在阻塞模式下工作地。
      
       使用 ioctlsocket函数可以改变I/O模式:
      
       int ioctlsocket(SOCKET s, long cmd, u_long Far *argp);
      
       其中 s 是待处理的套接口描述(简称套接字,与套接口概念有所不同),cmd是对该套接字进行的操作(模式修改)
       argp是cmd的参数。其中 cmd 可以是 FIONBIO、FIONREAD或者SIOCATMARK ,这里介绍 FIONBIO
       命令是用于开启/禁止套接口的非阻塞I/O模式。
      
       下面代码 套接口S分别是 非阻塞模式 和 阻塞模式
      
       // 代码1 非阻塞模式
      
       u_long bNonblock = 1;
            if(ioctlsocket(sock, FIONBIO,&bNonblock) == SOCKET_ERROR){
            HandleError("ioctlsocket");
            }
           
      // 代码 阻塞模式
     
      u_long bNonblock = 0;
            if(ioctlsocket(sock, FIONBIO,&bNonblock) == SOCKET_ERROR){
            HandleError("ioctlsocket");
            }
           
       但是,由于非阻塞调用会频繁返回WSAEWOULBLOCK错误,所以在任何时候,都应该仔细查找返回的错误代码,
       并做好调用失败的准备。如果每次碰到WSAEWOULDBLOCK错误时,只是简单地等待然后再次调用该I/O函数,
       那么这种轮询工作方式的效率甚至还会低于阻塞I/O方式。如何充分利用非阻塞I/O带来的效率提高。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有