网络编程的练习2[2]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 xu123 的 blog

  wsprintf(this->szerror,text("bind failed.error:%d"),wsagetlasterror());
  return false; 
 }
 else
 {
  listen(sock,5);
  hthread = createthread(null,0,cnetserver::threadserver,this,0,null);
  return true;

 }
}
int cnetserver::getcount()
{
 for( int i =0;i<maxsize;i++)
 {
  if(clientsocket[i] == invalid_socket)
   return i;
 }
 return -1;
}
dword winapi cnetserver::threadserver(lpvoid n)
{
 cnetserver* pserver = (cnetserver*)n;
 char buff[1024] = "";
 int rev = 1,flag = 0;
 int clientcount=-1;
 clientcount = pserver->getcount();
 if(clientcount == -1)
 {
  return 0l;
 }
 else
 {
  rev = 1;
  pserver->clientsocket[clientcount] =
       accept(pserver->sock,(sockaddr*)&(pserver->servaddr),
       &pserver->addlen);


  if( pserver->clientsocket[clientcount] == invalid_socket)
  {
   wsprintf(pserver->szerror,text("accept failed.error:%d"),wsagetlasterror());
   return 0l; 
  }
  else
  {
   
   ::createthread(null,0,cnetserver::threadserver,pserver,0,null);

   while(rev != socket_error)
   { 
    rev = recv(pserver->clientsocket[clientcount],
       buff,1024,0);
    if(rev != socket_error)
    {
     //::sendmessage(pserver->m_hwnd,wm_receivedata,0,(lparam)buff);
     messagebox(null,(lpctstr)buff,"receivedata",0);
    }
   }
  }
 }
 return 1;
}

bool cnetserver::senddatatoclient(int nclient,char* data,int len)
{
 int i=0;
 if(sock == invalid_socket)
  return false;
 
 if(clientsocket[nclient] == invalid_socket)
  return false;
 if(send(clientsocket[nclient],data,len,0) == socket_error)
 {
  wsprintf(this->szerror,text("send failed.error:%d"),wsagetlasterror ());
  
  return false;
 }
 return true;
}

bool cnetserver::senddatatoclient(char* data,int len)
{
 for(int i=0;i<maxsize;i++)
 {
  if(clientsocket[i] != invalid_socket)
   if(send(clientsocket[i],data,len,0) == socket_error)
   {
    wsprintf(this->szerror,text("send failed.error:%d"),wsagetlasterror ());
    return false;
   }
 }
}
void cnetserver::closeserver()
{
 waitforsingleobject(this->hthread,infinite);
 for(int i=0;i<maxsize;i++)
 {
  if(clientsocket[i] !=invalid_socket)
   closesocket(clientsocket[i]);
 }
   wsacleanup();
}
void cnetserver::destoryserver()
{
 dword exitcode=0;
 getexitcodethread(this->hthread,&exitcode);
 terminatethread(this->hthread,exitcode);
 for(int i=0;i<maxsize;i++)
 {
  if(clientsocket[i] !=invalid_socket)
   closesocket(clientsocket[i]);
   wsacleanup();
 }
}
/*
********************************************************************************
                test
********************************************************************************
*/
#include "stdafx.h"
#include <iostream.h>
#include <string>
#include "netserver.h"
int main()
{
 cnetserver net(9999);
 if(net.initnetserver()==false)
  cout<<"initnetserver"<<net.getlasterror()<<endl;
 char data[1024]="";
 while(cin>>data !="exit")
 {
  net.senddatatoclient(data,sizeof(data));
  net.senddatatoclient(1,data,sizeof(data));
 }
 net.closeserver();
}
/*
    可用telnet 127.0.0.1 9999 测试,也可用cnet测试, 不当之处,欢迎指点

本文关键:网络编程的练习2
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top