#ifndef _GGGSOCKET
#define _GGGSOCKET
//#include <ATLCONV.H>
//
//2003-6-11 13:46 Afxsock.h
//自定义的socket函数
/*
bool Accept(SOCKET &,struct sockaddr &,SOCKET &);
bool gggsocket_receive(SOCKET ,char *,int *);
bool gggsocket_send(SOCKET &,char *,int );
void Close(SOCKET &);
bool gggsocket_set_socke(SOCKET &,HWND hwnd,long lEvent);
*/
class GGGSOCKET
{
protected:
struct sockaddr_in server_addr; //服务器的地址信息结构
struct sockaddr client_addr; //客户端的地址信息结构
struct hostent *hostInfo; //主机信息结构
unsigned short Port; //绑定或联接的端口
char *buffer; //接发的缓冲区
public:
char *socketerror;
SOCKET socketid; //主socket号
bool INISock(); //初始化socket
bool Create(unsigned short ); //建立socket 用于服务器端
bool GGGSOCKET::Create() //用于客户端初始化 socket
{
return(INISock()); //初始化socket
}
bool Listen(unsigned short ); //监听
bool Accept(GGGSOCKET &);
int Receive(char *,int ,int ); //接收数据 返回收到的实现长度
bool Send(char *,int ,int );
bool Connect(char *,unsigned short ); //联接上服务器 1.服务器地址 2.端口
bool Select(HWND ,unsigned int ,long ); //设置socket事件
void Close();
};
bool GGGSOCKET::INISock() //初始化socket
{
//以下代码是对Socket 版本号进行协商(第一步)
WORD wVersionRequested; //需要的版本号
WSADATA wsaData; //协商时使用的变量
//使要求的版本为1.1
int err; //返回值变量
//设置需要的版本号为1.1
wVersionRequested=MAKEWORD(1,1);
//启动Socket
// err=WSAStartup(wVersionRequested,&wsaData);
err=WSAStartup(0x101,&wsaData);
//用户没有找到一个可使用的DLL,返回
if(err!=0)
{
socketerror="there is no DLL to user";
return false;
}
//确保Windows Sockets DLL 支持1.1
if((LOBYTE(wsaData.wVersion)!=1) || (HIBYTE(wsaData.wVersion)!=1))
{
socketerror="there is no DLL to user";
WSACleanup();
return false;
}
建立Socket 第二步
socketid=socket(AF_INET,SOCK_STREAM,0);
if(socketid==INVALID_SOCKET)
{
socketerror="there is error in opening stream socket";
Close();
return false;
}
return true;
}
//建产服务器方式的联接
bool GGGSOCKET::Create(unsigned short serverPort) //建产socket建接
{
INISock();//初始化socket
//绑定Socket 第三步
//设置地址域
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(serverPort);
server_addr.sin_addr.s_addr=INADDR_ANY; //填上本机的ip地址
//完成绑定
if(bind(socketid,(LPSOCKADDR )&server_addr,sizeof(server_addr)))
{
socketerror="there is error in binding sockets";
Close();
return false;
}
return true;
}
//监听
bool GGGSOCKET::Listen(unsigned short numb)
{
//开始监听连接 第四步
listen(socketid,numb);
return true;
}
//处于接收状态 server 为子进程的socket 采用引用变量
bool GGGSOCKET::Accept(GGGSOCKET &server)
{
int len=sizeof(server.server_addr);
//接收客户的请求,建立一个新Socket 来处理用户请求 第五步
//建立新的Socket
server.socketid=accept(socketid,(struct sockaddr FAR *)&server.server_addr,(int FAR *)&len);
if(server.socketid==INVALID_SOCKET)
{
socketerror="there is error in accept sockets";
return false;
}
return true;
}
//接收数据
int GGGSOCKET::Receive(char *buffer,int buflen,int flag=0)
{
memset(buffer,0,buflen);//?没有申请空间呀
//接收客户发来的数据
if((buflen=recv(socketid,buffer,buflen,flag)) == SOCKET_ERROR )
{
if( WSAGetLastError() != WSAEWOULDBLOCK)
{
socketerror="there is error in recv sockets";
return(false);
}
}
return(buflen);
}
//发送数据
bool GGGSOCKET::Send(char *lsbuf,int buflen,int flag=0)
{
int length;
// printf("/n[%d %s]/n",buflen,lsbuf);
if ((length=send(socketid,lsbuf,buflen,flag))==SOCKET_ERROR)
{
socketerror="there is error in send sockets";
return (false);
}
if(length!=buflen)
{
socketerror="there is error in send sockets :length !=buflen";
}
return(true);
}
//联接到服务器
bool GGGSOCKET::Connect(char *serverName,unsigned short serverPort) //建产socket建接
{
//设置地址域
// IN_ADDR iaHost;
LPHOSTENT lpHostEntry;
// iaHost.s_addr = inet_addr(serverName);
// iaHost.s_addr = inet_addr("202.101.43.198");
lpHostEntry = gethostbyname(serverName);
if (lpHostEntry == 0)
{
printf("gethostbyname /n");
return false;
}
/*
if (iaHost.s_addr == INADDR_NONE)
{
// Wasn't an IP address string, assume it is a name
lpHostEntry = gethostbyname(serverName);
printf("gethostbyname /n");
}
else
{
// lpHostEntry = gethostbyaddr((const char *)&(iaHost.s_addr),sizeof(struct in_addr), AF_INET);
lpHostEntry = gethostbyaddr((LPSTR)&(iaHost.s_addr),sizeof(struct in_addr), AF_INET);
printf("gethostbyaddr /n");
}
if (lpHostEntry == NULL)
{
socketerror="there is error in gethostbyname";
return (false);
}
*/
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_port = htons(serverPort);
memcpy((char *)&server_addr.sin_addr,(char *)lpHostEntry->h_addr,lpHostEntry->h_length);
// server_addr.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
server_addr.sin_family = AF_INET;
if(connect(socketid, (struct sockaddr *)&server_addr, sizeof(server_addr))==SOCKET_ERROR)
{
if(WSAEWOULDBLOCK!=WSAGetLastError())
{
socketerror="there is error in connecting stream socket";
return(false);
}
}
return true;
}
//关闭socket
void GGGSOCKET::Close()
{
(void)closesocket(socketid);
WSACleanup();
}
bool GGGSOCKET::Select(HWND hWnd,unsigned int msgId,long lEvent)
{
//设置网络事件,当事件发生时,将发送UM_SOCK的消息给hWnd窗口
if(WSAAsyncSelect(socketid,hWnd,msgId,lEvent)==SOCKET_ERROR)
{
socketerror="函数WSAAsyncSelect()出错";
return(false);
}
return(true);
}
#endif