• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
TCP/IP
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
TCP/IP Winsock网络编程综述
软件发布 TCP/IP Winsock网络编程综述
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 编程技术 >> VC教程 >> TCP/IP Winsock网络编程综述

TCP/IP Winsock网络编程综述

添加时间: 2006-2-12 3:00:56  作者: VC教程  阅读次数:306   来源: http://d9soft.com

            利用Winsock编程由同步和异步方式,同步方式逻辑清晰,编程专注于应用,在抢先式的多任务操作系统中(WinNt、Win2K)采用多线程方式效率基本达到异步方式的水平,应此以下为同步方式编程要点。

  1、快速通信

  Winsock的Nagle算法将降低小数据报的发送速度,而系统默认是使用Nagle算法,使用   

  int setsockopt(  
  SOCKET s,
  int level,
  int optname,
  const char FAR *optval,
  int optlen  

  );函数关闭它
  例子:  

  SOCKET sConnect;
  sConnect=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  int bNodelay = 1;
  int err;
  err = setsockopt(
  sConnect,
  IPPROTO_TCP,
  TCP_NODELAY,
  (char *)&bNodelay,

  sizoeof(bNodelay));//不采用延时算法   

  if (err != NO_ERROR)
  TRACE ("setsockopt failed for some reason\n");;

  2、SOCKET的SegMentSize和收发缓冲

  TCPSegMentSize是发送接受时单个数据报的最大长度,系统默认为1460,收发缓冲大小为8192。

  在SOCK_STREAM方式下,如果单次发送数据超过1460,系统将分成多个数据报传送,在对方接受到的将是一个数据流,应用程序需要增加断帧的判断。当然可以采用修改注册表的方式改变1460的大小,但MicrcoSoft认为1460是最佳效率的参数,不建议修改。

  在工控系统中,建议关闭Nagle算法,每次发送数据小于1460个字节(推荐1400),这样每次发送的是一个完整的数据报,减少对方对数据流的断帧处理。

  3、同步方式中减少断网时connect函数的阻塞时间

  同步方式中的断网时connect的阻塞时间为20秒左右,可采用gethostbyaddr事先判断到服务主机的路径是否是通的,或者先ping一下对方主机的IP地址。

  A、采用gethostbyaddr阻塞时间不管成功与否为4秒左右。

  例子:
  LONG lPort=3024;
  struct sockaddr_in ServerHostAddr;//服务主机地址 

  ServerHostAddr.sin_family=AF_INET;   

  ServerHostAddr.sin_port=::htons(u_short(lPort));   

  ServerHostAddr.sin_addr.s_addr=::inet_addr("192.168.1.3");   

  HOSTENT* pResult=gethostbyaddr((const char *) &   

  (ServerHostAddr.sin_addr.s_addr),4,AF_INET);   

  if(NULL==pResult)
  {
  int nErrorCode=WSAGetLastError();   

  TRACE("gethostbyaddr errorcode=%d",nErrorCode);  

  }   
  else   

  {
  TRACE("gethostbyaddr %s\n",pResult->h_name);;
  }

  B、采用PING方式时间约2秒左右

  暂略

    4、同步方式中解决recv,send阻塞问题

  采用select函数解决,在收发前先检查读写可用状态。

  A、读

  例子:
  TIMEVAL tv01 = {0, 1};//1ms钟延迟,实际为0-10毫秒  

  int nSelectRet;   

  int nErrorCode;
  FD_SET fdr = {1, sConnect};
  nSelectRet=::select(0, &fdr, NULL, NULL, &tv01);//检查可读状态
  if(SOCKET_ERROR==nSelectRet)

  

  {
  nErrorCode=WSAGetLastError();
  TRACE("select read status errorcode=%d",nErrorCode);
  ::closesocket(sConnect);
  goto 重新连接(客户方),或服务线程退出(服务方);  

  }
  if(nSelectRet==0)//超时发生,无可读数据   

  {
  继续查读状态或向对方主动发送

  }
  else
{   

  读数据   

  }
  B、写  

  TIMEVAL tv01 = {0, 1};//1ms钟延迟,实际为9-10毫秒
  int nSelectRet;
  int nErrorCode;
  FD_SET fdw = {1, sConnect};
  nSelectRet=::select(0, NULL, NULL,&fdw, &tv01);//检查可写状态
  if(SOCKET_ERROR==nSelectRet)
  {
  nErrorCode=WSAGetLastError();
  TRACE("select write status errorcode=%d",nErrorCode);
  ::closesocket(sConnect);
  //goto 重新连接(客户方),或服务线程退出(服务方);
  }
  if(nSelectRet==0)//超时发生,缓冲满或网络忙
  {
  //继续查写状态或查读状态
  }
  else
  {

 //发送
  }

  5、改变TCP收发缓冲区大小

  系统默认为8192,利用如下方式可改变。
  SOCKET sConnect;
  sConnect=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  int nrcvbuf=1024*20;
  int err=setsockopt(   

  sConnect,
  SOL_SOCKET,
  SO_SNDBUF,//写缓冲,读缓冲为SO_RCVBUF
  (char *)&nrcvbuf,   

  sizeof(nrcvbuf));
  if (err != NO_ERROR)
  {   

  TRACE("setsockopt Error!\n");  

  }   

  在设置缓冲时,检查是否真正设置成功用

  int getsockopt(
  SOCKET s,
  int level,
  int optname,
  char FAR *optval,
  int FAR *optlen
  );

  6、服务方同一端口多IP地址的bind和listen

  在可靠性要求高的应用中,要求使用双网和多网络通道,再服务方很容易实现,用如下方式可建立客户对本机所有IP地址在端口3024下的请求服务。   

  SOCKET hServerSocket_DS=INVALID_SOCKET;
  struct sockaddr_in HostAddr_DS;//服务器主机地址

  LONG lPort=3024;
  HostAddr_DS.sin_family=AF_INET;
  HostAddr_DS.sin_port=::htons(u_short(lPort));
  HostAddr_DS.sin_addr.s_addr=htonl(INADDR_ANY);
  hServerSocket_DS=::socket( AF_INET, SOCK_STREAM,IPPROTO_TCP);  

  if(hServerSocket_DS==INVALID_SOCKET)
  {
  AfxMessageBox("建立数据服务器SOCKET 失败!");
  return FALSE;   

  }   

  if(SOCKET_ERROR==::bind(hServerSocket_DS,(struct sockaddr *)(&(HostAddr_DS)),sizeof(SOCKADDR)))
  {
  int nErrorCode=WSAGetLastError ();
  TRACE("bind error=%d\n",nErrorCode);
  AfxMessageBox("Socket Bind 错误!");
  return FALSE;
  }
  if(SOCKET_ERROR==::listen(hServerSocket_DS,10))//10个客户
  {
  AfxMessageBox("Socket listen 错误!");
  return FALSE;  
  }   

  AfxBeginThread(ServerThreadProc,NULL,THREAD_PRIORITY_NORMAL);

  在客户方要复杂一些,连接断后,重联不成功则应换下一个IP地址连接。也可采用同时连接好后备用的方式。

  7、用TCP/IP Winsock实现变种Client/Server

  传统的Client/Server为客户问、服务答,收发是成对出现的。而变种的Client/Server是指在连接时有客户和服务之分,建立好通信连接后,不再有严格的客户和服务之分,任何方都可主动发送,需要或不需要回答看应用而言,这种方式在工控行业很有用,比如RTDB作为I/O Server的客户,但I/O Server也可主动向RTDB发送开关状态变位、随即事件等信息。在很大程度上减少了网络通信负荷、提高了效率。

  采用1-6的TCP/IP编程要点,在Client和Server方均已接收优先,适当控制时序就能实现。

  下边来看几个实例

  1.
用VC++6.0编写Proxy服务器

  一. 原理

  本程序的结构原理如下:

  对于每一个用户的请求(Internet 请求,由浏览器发出),本程序将启动两个线程,一个把本地用户的请求数据发送到远程的Internet主机,另一个线程把远程主机的回应数据发送到本地请求用户。

  二. 主要函数

  UserToProxyThread ( void * pParam ) :它是用来把本地用户请求数据发送到远程主机的,起服务器线程角色。当接到本地(局域网)用户的请求,它就启动另一个自身线程,以侦听别的用户的请求,并读出已接收到的请求数据,接着启动第二个线程ProxyToServer()(这个线程用来连接远程主机),当远程主机连接成功后,它把已读出的本地用户请求数据发送到远程主机。

  ProxyToServer ( void * pParam) ,可以被当作是客户端服务,它把远程主机发送来的数据分发给本地请求用户。 

  2.VB6实现局域网多站点互连

  随着时代的发展,我们已经步入了信息化时代,网络的普及和应用,使得越来越多的编程人员加入网络软件开发的行列。不过现在对于比较完整的介绍在局域网中多个站点互连的文章,笔者还未见到,这篇文章较完整的介绍了如何利用Visual Basic 6的Winsock控件实现局域网中多个站点在客户机/服务器模式下的互连,并给出了几种连接方案进行比较,对于Winsock编程过程中遇到的一些问题做了解答。

  3.用Java实现多线程服务器程序

    在Java出现之前,编写多线程程序是一件烦琐且伴随许多不安全因素的事情。利用Java,编写安全高效的多线程程序变得简单,而且利用多线程和Java的网络包我们可以方便的实现多线程服务器程序。 Java是伴随Internet的大潮产生的,对网络及多线程具有内在的支持,具有网络时代编程语言的一切特点。从Java的当前应用看,Java主要用于在Internet或局域网上的网络编程,而且将Java作为主流的网络编程语言的趋势愈来愈明显。实际工作中,我们除了使用商品化的服务器软件外,时常需要按照实际环境编写自己的服务器软件,以完成特定任务或与特定客户端软件实现交互。在实现服务器程序时,为提高程序运行效率,降低用户等待时间,我们应用了在Java Applet中常见的多线程技术。 

  4.JAVA实现支持视频点播WEB服务器

    通过internet网络视频点播是当前流行的技术.作者利用流行的web程序开发语言java实现了支持视频点播网络服务器系统,对用户的请求和查询进行相应的处理和视频的播放,并且对用户端机顶盒和网络传输方式进行了设计.  

  5.Java网络编程之传输控制协议
  

   讨论了套接字类的功能后,我们将分析一个完整的TCP客户端程序。此处我们将看到的客户端程序是一个daytime客户端,它连接到一个daytime服务器程序以读取当前的日期和时间。建立套接字连接并读取信息是一个相当简单的过程,只需要少量的代码。默认情况下daytime服务运行在13端口上。并非每台计算机都运行了daytime服务器程序,但是Unix服务器是客户端运行的很好的系统。如果你没有访问Unix服务器的权限,在第七部分我们给出了TCP daytime服务器程序代码--有了这段代码客户端就可以运行了。

 

上下文章:

 

上一篇文章: 用VC进行屏幕截取编程的方法 下一篇文章: 用VC++进行屏幕截取编程

相关文章:

  • 08年最大蠕虫病毒扫荡波令数十万电脑网络崩溃
  • 网络读书受追捧 7年增长近18倍
  • MySpace、Auditude和MTV:网络视频盈利模式
  • 巨头拟联手打击僵尸网络 或禁带毒PC上网
  • 北京奥运会每天1200万次网络攻击 第7天最危险

相关软件:

  • Ccproject网络图绘制软件 6.55
  • SeeTV网络电视 2008 4.54
  • 凤凰网络电视(Phoenixtv) 2.75.6
  • 风行网络电影(Funshion) 1.5.1.10
  • UUCall网络电话 3.2
  • 网络小蜜蜂 1.6.7

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

编程技术分类导航

  • ASP & ASP.NET教程
  • PHP教程
  • JSP教程
  • C/C++教程
  • VB & VB.NET教程
  • VC教程
  • Delphi教程
  • BCB教程
  • VFP教程
  • PB教程
  • JAVA教程
  • XML教程
  • C#教程
  • CGI教程

本类经典文章推荐

  • VC++之Button控件
  • VC++之Static Box控件
  • VC++之Edit Box控件
  • VC++之Static Box控件
  • VC++之Edit Box控件
  • VC++之Scroll Bar
  • VC++之Scroll Bar
  • VC++之List Box/Check List Box控...
  • VC++ Combo Box/Combo Box Ex控件
  • VC++ List Ctrl控件

VC教程阅读排行

  • VC++之List Box/Check List Box控...
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • VC++之Button控件
  • VC++之Tab Ctrl控件
  • VC++之Edit Box控件
  • VC++之Edit Box控件
  • VC遍历整个目录树查找文件
  • VC++之Scroll Bar
  • VC使用ActiveX控件常见问题

编程技术阅读总排行

  • VB入门教程之一
  • Java连接数据库实例
  • VC++之List Box/Check List Box控...
  • 第二章 PowerBuilder 入门之创建新...
  • VC++ List Ctrl控件
  • 第一章 什么是PowerBuilder
  • VC++ Combo Box/Combo Box Ex控件
  • 学C++不得不看的一篇文章
  • VB入门教程之二
  • VC++之Button控件

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有