?? htcpsock.h
字號:
// CHTcpSock.h: interface for the CHTcpSock class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_UNISOCK_H__87143DAD_9463_467C_B446_651C69D80B9E__INCLUDED_)
#define AFX_UNISOCK_H__87143DAD_9463_467C_B446_651C69D80B9E__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//////////////////////////////////////////////////////////////////////////////
//文件名 : HTcpSock.h
//功能 :TCP SOCKET類,應用于Windows 和 Linux兩種系統
//創建 : 2003.11.27
//修改日期 : 2004.4.9
//作者 : 韓國靜
//
#include "UniSockType.h"
//////////////////////////////////////////////////////////
class CHTcpSock
{
UNI_DWORD m_OppositeIp; //對方IP
UNI_WORD m_OppositePort; //對方Port
UNI_SOCKET m_s; //代表與對方連接的句柄
public:
void AddToSet(fd_set *set)
{
FD_SET(m_s,set);
}
UNI_BOOL IsInSet(fd_set *set)
{
return FD_ISSET(m_s,set)?UNI_TRUE:UNI_FALSE;
}
//用給定的IP和端口創建連接
UNI_BOOL CreateConnect(UNI_IN UNI_DWORD ip,UNI_IN UNI_WORD port)
{
struct sockaddr_in name;
Close();
m_s=socket(AF_INET,SOCK_STREAM,UNI_IPPROTO_IP);
if(m_s==UNI_INVALID_SOCKET)
return UNI_FALSE;
setsockopt(m_s,SO_BROADCAST,SOL_SOCKET,NULL,0);
memset(&name,0,sizeof(name));
name.sin_addr.s_addr=ip;
name.sin_family=AF_INET;
name.sin_port=htons(port);
if(0==connect(m_s,(UNI_PSOCKADDR)&name,sizeof(name)))
{
this->m_OppositeIp=ip;
this->m_OppositePort=port;
return UNI_TRUE;
}
Close();
return UNI_FALSE;
};
//
UNI_BOOL IsOpening()
{
if(m_s==UNI_INVALID_SOCKET)
return UNI_FALSE;
return UNI_TRUE;
};
//網絡功能反初始化,在LINUX下此函數直接返回
static void UnInitialize()
{
UNI_UnInitialize();
};
//網絡功能初始化,在LINUX下此函數直接返回
static UNI_BOOL Initialize()
{
UNI_SADATA data;
if(UNI_Initialize(&data))
return UNI_TRUE;
return UNI_FALSE;
};
//關閉SOCKET句柄
void Close()
{
if(m_s!=UNI_INVALID_SOCKET)
{
UNI_CloseSock(m_s);
m_s=UNI_INVALID_SOCKET;
}
};
//
UNI_DWORD GetOppoIp(){return m_OppositeIp;};
//
UNI_WORD GetOppoPort(){return m_OppositePort;};
//接收數據
int Recv(UNI_OUT void *pOutData,UNI_IN int len)
{
if(pOutData!=UNI_NULL&&len>0&&m_s!=UNI_INVALID_SOCKET)
return recv(m_s,(char*)pOutData,len,0);
return -1;
};
//發送數據
int Send(UNI_IN void *pData,UNI_IN int len)
{
if(pData!=UNI_NULL&&len>0&&m_s!=UNI_INVALID_SOCKET)
return send(m_s,(char *)pData,len,0);
return -1;
};
//在指定端口開始監聽,nMax為最大等待連接隊列長度
UNI_BOOL ListenAt(UNI_IN UNI_WORD port,UNI_IN int nMax)
{
struct sockaddr_in name;
Close();
m_s=socket(AF_INET,SOCK_STREAM,UNI_IPPROTO_IP);
if(m_s!=UNI_INVALID_SOCKET)
{
name.sin_addr.s_addr = INADDR_ANY;
name.sin_family = AF_INET;
name.sin_port = htons(port);
if(SOCKET_ERROR!=bind(m_s,(UNI_PSOCKADDR)&name,sizeof(name)))
{
if(listen(m_s,nMax)==0)
return UNI_TRUE;
}
Close();
}
return UNI_FALSE;
};
//從CHTcpSock對象接受客戶端的連接請求,新接受的SOCKET保存在自身對象內
UNI_BOOL AcceptConnect(UNI_IN CHTcpSock *Socket)
{
struct sockaddr_in name;
UNI_SOCKLEN size;
if(Socket->m_s!=UNI_INVALID_SOCKET)
{
size=sizeof(name);
this->m_s=accept(Socket->m_s,(UNI_PSOCKADDR)&name,&size);
if(m_s!=UNI_INVALID_SOCKET)
{
m_OppositeIp=name.sin_addr.s_addr;
m_OppositePort=ntohs(name.sin_port);
return UNI_TRUE;
}
}
return UNI_FALSE;
};
UNI_DWORD GetLocal(UNI_WORD &wPort)
{
struct sockaddr_in name;
UNI_SOCKLEN size=sizeof(name);
if(0==getpeername(m_s,(UNI_PSOCKADDR)&name,&size))
{
wPort=ntohs(name.sin_port);
return name.sin_addr.s_addr;
}
return -1;
}
//////////////////// 構造和析構 ////////////////////
CHTcpSock(){m_s=UNI_INVALID_SOCKET;};
virtual ~CHTcpSock(){Close();};
};
#endif // !defined(AFX_UNISOCK_H__87143DAD_9463_467C_B446_651C69D80B9E__INCLUDED_)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -