关闭

socket 操作简单类

903人阅读 评论(1) 收藏 举报

#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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:344090次
    • 积分:5340
    • 等级:
    • 排名:第5064名
    • 原创:125篇
    • 转载:74篇
    • 译文:2篇
    • 评论:63条
    最新评论