我的vc socket 操作类 SDK

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值