网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 网络学院 >> 程序设计 >> VC编程 >> 文章正文
  同步租塞SOCKET编程            【字体:
同步租塞SOCKET编程
作者:佚名    文章来源:不详    点击数:    更新时间:2007-9-12    
正在装载数据……

    大家都知道网络编程有异步非租塞方式,同步租塞方式,同步租塞方式逻辑简单,异步非租塞方式编程复杂.很多的C/S模式大都采用异步非租塞方式,在网络上也有大量的例子程序,而对于同步租塞方式却很少,下面代码为同步租塞方式予以参考:  

注:服务器也使用的是同步方式

 SOCKET   sock; 
 WSADATA   WSAData;  
 sockaddr_in   addr;  
 int   len=sizeof(sockaddr_in);
 std::string strBuff = _T("");
 std::string strSend = _T(""); 
 int iReadLen = 0;
   
 if(WSAStartup(MAKEWORD(2,2),   &WSAData)!=0)  
 {  
  printf("WSAStartup   error!\n");  
  return  ;  
 }  
   
 if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)  
 {  
  printf("socket   error!\n");  
  return  ;  
 }  
   
 //设置为同步阻塞方式 
 ULONG   ulArg=0;  
 int iRet = ioctlsocket(sock,FIONBIO,&ulArg);
 
 //设置接受超时时间
 int iRcvTimeOut = 5000;  //5秒
 setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(char*)&iRcvTimeOut,sizeof(int));
 
 BOOL          bl      = TRUE;
 setsockopt( sock , IPPROTO_TCP, TCP_NODELAY , (const char*)&bl, sizeof(BOOL));
 setsockopt( sock , IPPROTO_TCP, SO_KEEPALIVE, (const char*)&bl, sizeof(BOOL));
 
   
 addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);  
   
 addr.sin_addr.S_un.S_addr= inet_addr("211.138.113.137");
 addr.sin_family=AF_INET; //使用TCP/IP协议
 addr.sin_port=htons(8039); //客户端指定的IP地址
 
 int nConnect=connect(sock,(LPSOCKADDR)&addr,sizeof(addr)); //请求连接

 if (nConnect == 0)
 {

  //打包的数据  
  strSend = MakeSendPhones();
  //send data to server
  int iSend = send(sock,strSend.c_str,strSend.size(),MSG_OOB);
  
  int iRead = 0;
  char szBuff[1025] = {0};
  char szTempBuff[1025] = {0};
  
  while (1)
  {  
   memset(szBuff,0,1025);
   memset(szTempBuff,0,1025);

  //接收数据还可以用WSARecvEx(),如下注释部分

   //int iFlag = 0;
   // iRead = WSARecvEx(sock,szBuff,1024, &iFlag);

   //注意我使用MSG_PEEK MSG_OOB都接收不到数据
   iRead = recv(sock,szBuff,1024,0);
   
   if (iRead > 0)
   {
    memcpy(szTempBuff,szBuff,iRead);

    strBuff = strBuff + szTempBuff;
    iReadLen += iRead;
   }
   else if (iRead == 0)
   {
    break;
   }
   else
   {
    int nErro = WSAGetLastError();
    break;
   }
  }
 }
 
 int iClose = closesocket(sock);
 WSACleanup();




本文来源:http://blog.csdn.net/jisuanjixu/archive/2007/08/24/1756959.aspx
站内文章搜索 高级搜索
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
     directx 图形接口指南(…
     win2k下的api函数的拦截
     用crypto  api  实现公钥…
     根据别人的md5源码封装的…
     vc中使用gdi+合并jpg图片
     document/view的交互 --…
     windows下的函数hook技术
     windows api函数大全一
     用vc 6.0实现串行通信的…
     vc++技术内幕(第四版)…
  • Solaris10下,使用SunStudio…

  • 介绍 JSON

  • Turbo C 2.0 函数中文说明大…

  • 说说C++中的malloc与new

  • Windows API一日一练(25)Cre…

  • CreateProcess函数详解

  • javadoc的获取

  • Struts的java.lang.ClassNot…

  • arraycopy vs ByteArray io …

  • Java单例对象同步问题探讨

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    网络学院©2007 www.23book.net
    为您提供web编程,vb编程,vc编程,服务器架设管理,数据库设计等方面的知识 站长:David