socket 操作简单类

原创 2006年05月20日 02:14:00

#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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

PHP 兼容 Curl/Socket/Stream 的 HTTP 操作类

/************************************************************ * 描述:HTTP操作类 * 作者:heiyeluren * 创建:2009...

学习Socket类,实现简单聊天室

实现一个命令行界面的C/S聊天室应用,服务器端应该包含多个线程,每个Socket对应一个线程,该线程复制读取Socket对应输入的流数据(从客户端发过来的数据),并将读到的数据线每个Socekt输出流...

Socket操作类

/** 002.* Socket请求类 003.* 004.* @author  aiden 005.* @copyright zmh 006.* @ex...

枚举类的简单操作

直接代码吧package com.jlife.sys.basepojo;/** * Created by chenjianan on 2017/3/1-19:16. * * email 122...

ini文件的简单操作类

一个简单的串口操作类

c# sqlite 简单操作类

public class Sqlite     {         ///         /// 获得连接对象 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)