当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

 ·,给以支持我的朋友们    »显示摘要«
    摘要: 在过几天就要考四级了,小弟我得e文实在是太差,如果临阵还不磨枪的话,估计是没什么希望了....... 来csdn差不多 一个多月了,在这里学到了好多的东西,认识了好多的delphi友,在此祝各位万事順意,在找工作的找个好工作,已经工作的好好工作....... 衷心的感谢各位的帮助,望各位在以后走好,呵呵,其实考完的四级,我就回来了,希望四级不要让我失望! ......................
    摘要: 在线等待: 1:如何从tdatetime中提取出年份,月份,号数?? 2:如何比较两个tdatetime类型的次序,比如怎样才知道2002-6-1在2002-6-4的前面?? ......


帮忙看看socket怎么运行

SOCKET   aSocket[1024];  
  int   SocketCount=0;  
   
  while(true)  
  {  
      ....//create   and   bind   m_hSocket  
      ret=listen(m_hSocket,2);  
      aSocket[SocketCount]=accept(m_hSocket,NULL,NULL);  
      SocketCount++;  
      if(ret==SOCKET_ERROR)   continue  
        else  
          {  
              while(true)  
            {  
                  char   buff[1024];  
                  ret=recv(aSocket[SocketCount-1],buff,128,0);  
                ....  
              }  
  }  
   
  如果accept一个socket以后,m_hSocket是不是还在监听?  
   
  另:我这是想把这些放在一个线程中,使这个线程能做为socket的服务端,监听端口,对  
  每个连到服务端的请求,实现先到先处理,不能马上处理的先保存的套接字到aSocket中,  
  ,等前面的处理完再对其进行处理。  
   
  各位高手帮帮忙,很急的说。谢谢谢谢!!!

NO.1   作者: mrlp

1、常规的办法是先创建一个daemon线程,专门用于监听,来一个accept一个,如果计数没有超过限你设定的限额的话。每创建一个socket,又为它创建一个thread,专门管理这个socket上的通讯,通讯结束时closesocket,线程结束;或者埋伏若干线程,有socket要处理时,选一个出来干活,没活儿都歇着。  
   
  2、以上socket与thread一对一的方法,只适用于要管理的socket不多的时候,要是你有上百个socket,最好别这么干了,因为有太多的线程切换。这时候应该采用轮循的办法。一个thread管理若干个socket.我有个模糊的印象,select族函数好象只能对付64个以内的socket对象,超过64应该使用多个thread,一人分一点儿。对了,《WINDOWS网络编程技术》里面有讲,但不多。  
   
  3、NO.1的办法相信大家都在用,NO.2可能就没有多少人见识过了。我也一样,只知道有这么回事,没有真的用过。  
  希望有高人站出来,指点一二。

NO.2   作者: xintiaf

这样的情况其实是最常见的,以下是我的一个程序里用到的  
  贴出来仅供参考:)  
   
  UINT     HttpProxy(LPVOID   pParam)  
  {  
  .................//define   the   member   and   accept   the   pParam  
   
                      //go....  
   
  //create  
  MainSocket   =   socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);  
  if(MainSocket   ==   SOCKET_ERROR)    
  {    
  ParseError(ProxyDlg,   "端口创建错误");  
  return   -2;  
  }    
  Host.sin_family   =   AF_INET;    
  Host.sin_port   =   htons(port);    
  Host.sin_addr.s_addr   =   inet_addr(addr);  
  //bind    
  if(bind(MainSocket,   (SOCKADDR   *)&Host,   sizeof(Host))   !=   0)  
  {    
  ParseError(ProxyDlg,   "HttpProxy:   绑定错误");  
  return   -3;  
  }  
  //listen  
  if(listen(MainSocket,5)   ==   SOCKET_ERROR)    
  {    
  ParseError(ProxyDlg,   "HttpProxy:   监听错误");  
  return   -4;  
  }    
  AddLen   =   sizeof(Client);    
   
  wsprintf(status,   "HttpProxy:   代理服务器正常运行中...");  
  ParseStatus(ProxyDlg,   status);  
  i   =   0;  
  ///  
  fd_set   fds;  
  TIMEVAL   timeout;  
  int   nError;  
  /////////////////////////////////////  
  wsprintf(status,"HttpProxy:   wait   request...");  
  ParseStatus(ProxyDlg,   status);  
  //wait   request   from   client  
  do    
  {  
  //time   out    
  timeout.tv_sec   =   2;  
  timeout.tv_usec   =   0;  
  //   we   use   select   to   avoid   blocking   on   accept   forever.  
  //     it    
  FD_ZERO(&fds);  
  FD_SET(MainSocket,   &fds); //MainSocket+1     ???  
  nError   =   select(MainSocket,   &fds,   NULL,   NULL,   &timeout);  
  if(nError==WSAEINTR)  
  {  
  ParseError(ProxyDlg,   "WSAEINTR");  
  continue; //interrupted:   no   harm   done  
  }  
  else   if(nError<0)  
  {ParseError(ProxyDlg,   "nError");  
  return   0; //error  
  }  
  if(FD_ISSET(MainSocket,   &fds)==0)  
  {  
  //ParseError(ProxyDlg,   "HttpProxy:   timeout");  
  continue;  
  }  
  //accept   it  
  ClientSocket   =   accept(MainSocket,   (SOCKADDR   *)&Client,   &AddLen);  
   
  if(ClientSocket   ==   SOCKET_ERROR)    
  {    
  ParseError(ProxyDlg,   "HttpProxy:   接受客户请求错误");  
  continue;  
  }  
  wsprintf(status,"beginthread...");  
  ParseStatus(ProxyDlg,   status);  
  i   ++   ;  
  if(   i   >=   1000)    
  i   =   0;    
  Global[i]   =   ClientSocket;    
   
  //set   the   thread   parameter  
  memset(&threadRequest,   0,   sizeof(threadRequest));  
   
  threadRequest.ProxyDlg   =   threadProxy->ProxyDlg;  
  threadRequest.pSocket   =   (void*)&Global[i];  
                                //all   ready,   we   create   thread   to   process   the   request   of   the   client  
                                //you   can   use   it   to   instead   your   while   loop  
  AfxBeginThread(HttpRequest,   &threadRequest);    
  // ::Sleep(100);  
  }while(threadProxy->bInThread);  
   
  wsprintf(status,   "CloseSocket");  
  ParseStatus(ProxyDlg,   status);  
  closesocket(MainSocket);  
  return   0;  
   
  }


    摘要: bind1st和bind2nd是否要在binary(二元)时才能用?bind1st能不能使用在unary(一元)地情况下? ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE