下面是 http://dev.csdn.net/article/66/66067.shtm文章的一部分,在这部分中线程函数用到sercon这个变量,但作为线程函数在一个类中应该是静态的(小弟这么理解),那么怎么在这个类的所有函数中传递这个变量呢?
如果有可能,希望高手能把这个程序在vc中实现一下,感激不禁!!!!
//建立监听队列(大小为3),开始监听
  if (listen(sercon,3)==SOCKET_ERROR)
  {AfxMessageBox(“listen wrong!”);
  return -1;};
  ①实现监听线程,并创建数据接收线程。
  //在程序需要开始监听连接的地方创建监听线程,并实现。
  //创建监听线程(在程序开始或按钮事件实现中)
  AfxBeginThread(waitconnect,NULL);
  //实现监听线程
  UINT waitconnect(LPVOID lpParm)
  {SOCKET conn[3];
  int lenc=sizeof(sockaddr);
  int alreadycon=0;
  //sercon为前面所创建服务器套接字
  while(1)
  {if (alreadycon<=3) 
  {//接受连接请求
  conn[alreadycon]=accept(sercon,&cin,&lenc);
  if (conn[alreadycon]==INVALID_SOCKET)
  {AfxMessageBox(“accept WRONG !”);}
  else
  {//创建数据接收线程
  AfxBeginThread(readdata,&connn[alreadycon]);
  Alreadycon= alreadycon+1;
  return 0;}}
  else
  {//避免影响主线程运行
  Sleep(200);}
  }
  }
  ②实现数据接收线程。
  UINT waitconnect(LPVOID ss)
  { SOCKET *readsock;
  readsock=(SOCKET *)ss;
  char buf[2000];
  int revnum=0;
  //开始循环接受数据
  while (revnum!=-1)
  {//revnum<=0则表示连接已断!
  revnum=recv(*readsock,buf,2000,0);
  if (revnum>0)
  buf[revnum]=0;//截断缓冲区
  //buf中存储已接受数据。}
  }
  ③发送数据
  //conn[1]为用于接受连接的套接字, sendstr为所发送数据。
  send(conn[1],LPCTSTR(sendstr),sendstr.GetLength(),0);

解决方案 »

  1.   

    我觉得文章里的代码对高手应该很easy,对我这种菜菜鸟就不行了,可能有点过分,不过我还是希望高手能在vc6.0里帮我实现一下,我真的急用这个,谢谢了!!!二、创建服务套接字并创建监听线程。
      //创建服务套接字
      SOCKET sercon=socket(PF_INET,SOCK_STREAM,0);
      //判断是否成功创建
      if (sercon==INVALID_SOCKET)
      {AfxMessageBox(“Server WRONG !”);
      return -1;}
      //配置套接字地址等信息
      SOCKADDR_IN sin;
      sin.sin_family=AF_INET;
      //指定本地地址
      sin.sin_addr.s_addr=htonl(INADDR_ANY);
      //指定服务器端口号nPort,可自设
      int nPort=5080;
      sin.sin_port=htons(nPort);
      //地址信息与套接字进行绑定。
      if (bind(sercon,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR)
      {AfxMessageBox(“bind wrong!”);
      return -1;}
      //建立监听队列(大小为3),开始监听
      if (listen(sercon,3)==SOCKET_ERROR)
      {AfxMessageBox(“listen wrong!”);
      return -1;};
      ①实现监听线程,并创建数据接收线程。
      //在程序需要开始监听连接的地方创建监听线程,并实现。
      //创建监听线程(在程序开始或按钮事件实现中)
      AfxBeginThread(waitconnect,NULL);
      //实现监听线程
      UINT waitconnect(LPVOID lpParm)
      {SOCKET conn[3];
      int lenc=sizeof(sockaddr);
      int alreadycon=0;
      //sercon为前面所创建服务器套接字
      while(1)
      {if (alreadycon<=3) 
      {//接受连接请求
      conn[alreadycon]=accept(sercon,&cin,&lenc);
      if (conn[alreadycon]==INVALID_SOCKET)
      {AfxMessageBox(“accept WRONG !”);}
      else
      {//创建数据接收线程
      AfxBeginThread(readdata,&connn[alreadycon]);
      Alreadycon= alreadycon+1;
      return 0;}}
      else
      {//避免影响主线程运行
      Sleep(200);}
      }
      }
      ②实现数据接收线程。
      UINT waitconnect(LPVOID ss)
      { SOCKET *readsock;
      readsock=(SOCKET *)ss;
      char buf[2000];
      int revnum=0;
      //开始循环接受数据
      while (revnum!=-1)
      {//revnum<=0则表示连接已断!
      revnum=recv(*readsock,buf,2000,0);
      if (revnum>0)
      buf[revnum]=0;//截断缓冲区
      //buf中存储已接受数据。}
      }
      ③发送数据
      //conn[1]为用于接受连接的套接字, sendstr为所发送数据。
      send(conn[1],LPCTSTR(sendstr),sendstr.GetLength(),0);
      ④关闭套接字。
      //conn[1]为用于接受连接的套接字
      closesocket(conn[1]);
      客户程序端:
      客户端程序的编程有很多与服务器端相同或相近,甚至相同的代码。
      一、建立支持SOCKET项目。
      方法同服务器端。
      二、创建客户套接字、对服务器进行连接。
      //nHost 须用户指定的远程服务机,IP或域名。
      CString nHost;
      //h为地址信息
      struct hostent *h;
      h=gethostbyname(nHost);
      //nHost 须用户指定的远程服务端口号
      int nPort;
      SOCKET con_client;
      SOCKADDR_IN csin;
      if (h!=NULL)
      {//创建套接字
      con_client =socket(AF_INET,SOCK_STREAM,0);
      csin.sin_family=AF_INET;
      memcpy(&(csin.sin_addr.s_addr),h->h_addr,sizeof(int));
      csin.sin_port=htons(nPort);
      //开始连接
      if (connect(con_client,(LPSOCKADDR)&csin,sizeof(csin)))
      {//AfxMessageBox(“connect wrong!”); 
      return -1;}
      else
      {//连接成功,创建数据接收线程
      AfxBeginThread(readdata,&con_client);}
      }
      三、实现数据接收线程。
      代码与服务器端完全相同。
      四、发送数据。
      //con_client 为与服务器进行连接的套接字。
      send(con_client,LPCTSTR(sendstr),sendstr.GetLength(),0);
      五、关闭套接字。
      // con_client 为与服务器进行连接的套接字。
      closesocket(conn[1]);
      在实际应用中,应当根据需要调整并改变一些变量的作用域。
      

  2.   

    我在一个对话框类中加上了上述代码,不同的是我自己封装了一个socket类,因此要定义对象调用函数,像上面的accept recv就是A.accept ,A.recv,编译没错误,但不能运行,好象是到A.recv位置就不能进入A类的对应函数了,我想知道"根据需要调整并改变一些变量的作用域"是什么意思?如果我没说明白,我可以再解释,谢谢!!!