网络编程的练习2[1]

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

本文简介:选择自 xu123 的 blog

 这是一个服务器端的类,采用的是tcp传输
        服务端                                    客户机
        socket()
        bind()
        listen()                                    socket()
        accept()                                  
        阻塞.等待客户                     connect()
        read()                                    write()
        处理服务请求                
        write()                                    read()
        close()                                    close()

/*
*******************************************************
 2004 12 06
 stephen
*******************************************************
*/
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

#define maxsize 50

#define wm_receivedata wm_user+1002

class cnetserver
{
public:
 cnetserver();
 cnetserver(int port);
 ~cnetserver();
//读数据
 static dword winapi threadserver(lpvoid n);
//初始化服务器
 bool initnetserver();
// 发送到指定的客户端
 bool senddatatoclient(int nclient,char* data,int len);
// 发送到所有的客户端
 bool senddatatoclient(char* data,int len);
//指定接收数据的窗口句柄
 inline void sethwnd(hwnd hwnd)
 {
  m_hwnd = hwnd;
 }
 int getcount();
// 返回错误信息
 char* getlasterror();
//关闭服务器
 void closeserver();
//关闭服务器
 void destoryserver();

private:
 handle hthread; 

 hwnd m_hwnd;

 int port;

 char szerror[256];
 char getdata[256];
 int nreceive;
 int addlen;

 socket  sock;
 socket  clientsocket[maxsize];
 sockaddr_in servaddr;

 wsadata  wsdata;
};
cnetserver::cnetserver()
{
 this->sock = invalid_socket;
 this->hthread=null;
 this->port = 9999;
 for(int i=0;i<maxsize;i++)
 {
  clientsocket[i] = invalid_socket;
 }
}
cnetserver::cnetserver(int port)
{
 this->sock = invalid_socket;
 this->hthread=null;
 this->port = port;
 for(int i=0;i<maxsize;i++)
 {
  clientsocket[i] = invalid_socket;
 }
}

cnetserver::~cnetserver()
{
 this->destoryserver();
}
char* cnetserver::getlasterror()
{
 return this->szerror;
}
bool cnetserver::initnetserver()
{
 if(wsastartup(makeword(1,1),&this->wsdata) != 0)
 {
  wsprintf(this->szerror,text("wsastartup failed.error:%d"),wsagetlasterror());
  return false;
 }

 this->servaddr.sin_addr.s_addr = htonl(inaddr_any);
 this->servaddr.sin_family = af_inet;
 this->servaddr.sin_port = htons(this->port);
 this->addlen = sizeof(servaddr);

 sock = socket(af_inet,sock_stream,0);
 if( sock == socket_error)
 {
  wsprintf(this->szerror,text("bind failed.error:%d"),wsagetlasterror());
  return false; 
 }
 if(bind(sock,(sockaddr*)&servaddr,sizeof(servaddr)) == socket_error)
 {

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

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

go top