SOCKET

来源:互联网 发布:helloworld代码 python 编辑:程序博客网 时间:2024/06/07 03:39

#include <iostream>
#include <winsock2.h>
#include <windows.h>

using namespace std;

void ok(){cout<<"ok  "<<WSAGetLastError()<<endl;}

 struct sock_list
 {
     SOCKET sock;
  SOCKADDR_IN addr;
  int port;
  int pid;
  char *buf; 
  int buf_size;
  int addr_size;
  //
  HANDLE hThread;
  //
  sock_list * next;
 };

class goxlsock
{

 static bool is_wsa_init;
 static bool back_call(goxlsock con);
 static bool sub_back_call(goxlsock con);
 
 private:
     WSADATA wsd;
     HANDLE hThread;
     sock_list local,client,*head,*cur;
     int max_client,count_client;
     int nRet;
     int port;
     unsigned long  ul;
     //
     fd_set fdread,fdwrite,fdexecept;
     int p_id;
    public:
     goxlsock(char * p_addr,int p_port,int p_max_client); 
     ~goxlsock();
     int socksend(char * addr,char * p_buf,int p_buf_size);
     int socksend(SOCKET p_sock,char * p_buf,int p_buf_size);
     bool sockconnect(char * addr);
     //sock_list get_client();
     bool start();    
 private:
     bool init();   
     bool set_fd();
};

bool goxlsock::is_wsa_init = false;

//
goxlsock::goxlsock(char * p_addr,int p_port,int p_max_client)
{
 max_client = p_max_client;
 count_client = 0;
 ul = 1;
 port = p_port;

 head = new sock_list;
 cur = head;
 //head->sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
 //
 if(!goxlsock::is_wsa_init)
 {
  WSAStartup(MAKEWORD(2,2),&wsd);
  goxlsock::is_wsa_init = true;
 }
 //
 local.addr.sin_addr.s_addr = inet_addr(p_addr);
 local.addr.sin_family = AF_INET;
 local.addr.sin_port = htons(p_port);
 //
 local.sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
 //
 bind(local.sock,(SOCKADDR*)&(local.addr),sizeof(local.addr));
 listen(local.sock,max_client);
 nRet = ioctlsocket(local.sock,FIONBIO,&ul);
 //
 //start();
 //hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(goxlsock::back_call),(LPVOID)this,0,NULL);
 //cout<<WSAGetLastError()<<endl;
}
goxlsock::~goxlsock()
{
 closesocket(local.sock);
 CloseHandle(hThread);
 WSACleanup();
}

bool goxlsock::start()
{
 hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(goxlsock::back_call),(void *)this,0,NULL);
}

//sock_list goxlsock::get_client(){ return client;}

int goxlsock::socksend(char * addr,char * p_buf,int p_buf_size)
{
 //send()
 sockconnect(addr);
 //send(sock)
}
int goxlsock::socksend(SOCKET p_sock,char * p_buf,int p_buf_size)
{
 return send(p_sock,p_buf,p_buf_size,0);
}
bool goxlsock::sockconnect(char * addr)
{
 SOCKADDR_IN remote;
 remote.sin_family = AF_INET;
 remote.sin_port = htons(port);
 remote.sin_addr.s_addr = inet_addr(addr);
 connect(local.sock,(SOCKADDR*)&remote,sizeof(remote));
}

 

bool goxlsock::set_fd()
{
 int i = 0;
 sock_list * t_list;
 //
 FD_ZERO(&fdread);
 FD_ZERO(&fdwrite);
 FD_ZERO(&fdexecept);
 //
 FD_SET(local.sock,&fdread);
 FD_SET(local.sock,&fdwrite);
 FD_SET(local.sock,&fdexecept);
 //
 t_list = head;
    for(i=0;i<count_client;i++)
    {
     //cout<<count_client<<endl;
     //FD_SET(t_list->sock,&fdread);
     FD_SET(client.sock,&fdread);
    }
 //t_list = head;
 nRet = select(0,&fdread,&fdwrite,&fdexecept,0);
}

bool goxlsock::back_call(goxlsock con)
{
 //cout<<con.p_id<<endl;
 int i = 0;
 con.cur = new sock_list;
 con.head = con.cur;
 con.client.sock = 0;
 while(true)
 {
  //ok();
  con.set_fd();
  //cout<<"ok"<<endl;
  if(con.nRet == SOCKET_ERROR)
  {
   ok();
      //cout<<"SOCKET_ERROR Value: "<<SOCKET_ERROR<<endl; 
  }
  //ok();
  if(con.nRet>0)
  {
   if(FD_ISSET(con.local.sock,&(con.fdread)))
   {
    if(con.client.sock==0)
    con.client.sock = accept(con.local.sock,(SOCKADDR*)&(con.client.addr),&(con.client.addr_size));
    //send(con.client.sock,"123456",6,0);
    con.count_client++;
   }
   //
   //子套接字功能
   for(i=0;i<con.count_client;i++)
   {
    //cout<<con.count_client<<endl;
    //if(FD_ISSET(con.cur->sock,&(con.fdread)))
    if(FD_ISSET(con.client.sock,&(con.fdread)))
    {
     con.client.buf = new char[1024];
     recv(con.client.sock,con.client.buf,1024,0);
     //con.send(con.client.sock,"123",3);

     con.client.hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)goxlsock::sub_back_call,(void*)&con,0,NULL);
     //cout<<con.client.buf<<endl;
    }
   }
   //ok(); 
  }
 }
 
 return true;
}

bool goxlsock::sub_back_call(goxlsock con)
{
 int n = 0;
 cout<<con.client.buf<<endl;
 n = send(con.client.sock,"接收成功",8,0);
 //cout<<n<<endl;
 //con.send(con.client.sock,"45679",6);
 //while(true)
 {
  
  //cout<<con.pid<<endl;
  //con.cur->sock = accept(con.local.sock,(SOCKADDR*)&(con.cur->addr),&(con.cur->addr_size));
  //con.client.sock = accept(con.local.sock,(SOCKADDR*)&(con.client.addr),&(con.client.addr_size));
  //ok();
 }
}


////////////////////////////////////
////////////////////////////////////
////////////////////////////////////
////////////////////////////////////
////////////////////////////////////
////////////////////////////////////

DWORD send_msg(goxlsock p)
{
 //p.socksend(p.get_client().sock,"123",3);
}

int main(int argc, char *argv[])
{
 char addr[15];
 char buf[1024];
 cin>>addr;
 //sprintf(addr,"127.0.0.1");
    goxlsock test(addr,1234,8);
    ///
    test.start();
    //
    //CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)send_msg,(void*)&test,0,NULL);
    //while(1)
    {
     
    }
    system("pause");
 return 0;
}