📄 xsocket.h
字号:
#ifndef __XSOCKET_H__
#define __XSOCKET_H__
#include <winsock2.h>
#include <ws2tcpip.h>
// Output/Input(Network/File) Mode
#define SOCK_TYPE_NULL 0 //No Valid mode
#define SOCK_TYPE_UNICAST_TCP_SERVER 1 //accept in local tcp socket, and then output
#define SOCK_TYPE_UNICAST_TCP_CLIENT 2 //link and output to remote tcp client
#define SOCK_TYPE_UNICAST_UDP_SERVER 3 //output to remote udp socket
#define SOCK_TYPE_UNICAST_UDP_CLIENT 4 //input in local udp socket
#define SOCK_TYPE_FILEOUTPUT 5 //output to file
#define SOCK_TYPE_THIS_LINK 6 //sent by client to indicate use this link for video/audio
#define TTL_VALUE 255
#define MAX_LISTEN_QUEUE 5
class XSocket
{
public:
BOOL SetSendBuffer(int nLength);
BOOL SetReceiveBuffer(int nLength);
XSocket(void *pParent=NULL);
virtual ~XSocket();
void *m_pParent;
SOCKET m_nSock;
int m_nType;
BOOL m_bMulticast;
struct sockaddr_in m_UDPAddr;
fd_set m_readfds;
struct timeval m_tv;
BOOL CreateUDPServer(LPCSTR rip, int rport, LPCSTR lip, int lport);
BOOL CreateUDPClient(LPCSTR rip, int rport, LPCSTR lip, int lport);
BOOL CreateTCPServer(LPCSTR lip, int port);
BOOL CreateTCPClient(LPCSTR rip, int rport);
BOOL Close();
XSocket* Accept();
int Send(char *buf, int len);
int Recv(char *buf, int len);
int RecvBytes(char *buf, int len); // block until len bytes are received
BOOL GetSockName(char *sockAddr, int *port);
int CheckReadable(int timeout);
};
#endif
/*
XSocket.DLL使用说明
用途:Windows下进行TCP/UDP/Multicast通信时使用的套接口类
环境:Windows95/98/2000/XP
依存:ws2_32.lib, 和wsock32.dll
使用方式:
(1) 确保系统安装了wsock32.dll和ws2_32.lib
(2) 在工程文件的Link选项中加入XSocket.lib, 将XSocket.h加入到使用XSocket的源文件中
(3) 在程序开始使用XSocket之前(包括对象初始化),调用下列初始化代码:
{
WORD wVersionRequested;
WSADATA wsaData;
int ret;
wVersionRequested=MAKEWORD(2,2);
ret=WSAStartup(wVersionRequested,&wsaData);
if(ret!=0){
// ::MessageBox(NULL, "not useful sockets DLL", "Winsock2", MB_OK | MB_ICONWARNING);
return FALSE;
}
if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){
// ::MessageBox(NULL, "not support the requested version", "Winsock2", MB_OK | MB_ICONWARNING);
WSACleanup();
return FALSE;
}
}
在程序结束使用XSocket之后(包括对象解析构),调用下列结束代码:
WSACleanup();
(4) 声明Xsocket变量或者指针,进行引用:
TCP Server方式:
XSocket m_xsocket;
//serverip是tcp服务器要绑定的本地地址,serverport是tcp服务器要绑定的端口
//serverip为0.0.0.0时,选择缺省接口
//返回TRUE,表示创建成功,否则失败
m_xsockt.CreateTCPServer(serverip, serverport);
//Accept()是阻塞操作,返回连接后的客户端
//返回NULL表示有有效的客户端连接成功,否则失败
pSocket = m_xsockt.Accept();
//然后可以进行数据发送和接收
// 发送数据,是阻塞操作
// 返回发送成功的字节数,如果不等于length,则发生错误
pSocket->Send(pBuf, length);
// 接收数据,是阻塞操作
// 返回接收成功的字节数,如果小于或等于0,则发生错误
pSocket->Recv(pBuf, length);
pSocket->close();
delete pSocket; pSocket = NULL;
m_xsocket.Close();
TCP Client方式:
XSocket m_xsocket;
//serverip是要连接的tcp服务器的地址,serverport是要连接的tcp服务器的端口
//socket会根据路由信息自动选择接口进行连接。
//是阻塞操作
m_xsockt.CreateTCPClient(serverip, serverport);
//然后可以进行数据发送和接收
m_xsocket.Send(); //说明同上
m_xsocket.Recv(); //说明同上
m_xsocket.Close();
UDP 发送者方式:
XSocket m_xsocket;
//remoteip是对方的地址,remoteport是对方接收数据的端口
//localip是UDP要从本地发送数据的接口地址,为0.0.0.0时选择缺省接口,localport是0
//nType是S_WYJ_SEND(0x8008)
m_xsockt.CreateUDP(remoteip, remoteport, localip, localport, nType);
//然后可以进行数据发送和接收
m_xsocket.Send(); //说明同上
m_xsocket.Recv(); //说明同上
m_xsocket.Close();
UDP 接收者方式:
XSocket m_xsocket;
//remoteip是无效参数"0.0.0.0",remoteport是本地接收数据所绑定的端口
//localip是UDP要从本地接收数据的接口地址,为"0.0.0.0"时选择缺省接口,localport是无效参数0
//nType是S_WYJ_RECV(0x4004)
m_xsockt.CreateUDP(remoteip, remoteport, localip, localport, nType);
//然后可以进行数据发送和接收
m_xsocket.Send(); //说明同上
m_xsocket.Recv(); //说明同上
m_xsocket.Close();
UDP Multicast 发送者方式:
XSocket m_xsocket;
//remoteip是组播地址,remoteport是对方接收组播数据的端口
//localip是Multicast要从本地发送数据的接口地址,localport是0
//nType是S_WYJ_SEND(0x8008)
m_xsockt.CreateUDP(remoteip, remoteport, localip, localport, nType);
//然后可以进行数据发送和接收
m_xsocket.Send(); //说明同上
m_xsocket.Recv(); //说明同上
m_xsocket.Close();
UDP Multicast 接收者方式:
XSocket m_xsocket;
//remoteip是组播地址,remoteport是本地组播数据所绑定的端口
//localip是Multicast要从本地接收数据的接口地址,为"0.0.0.0"时选择缺省接口,localport是无效参数0
//nType是S_WYJ_RECV(0x4004)
m_xsockt.CreateUDP(remoteip, remoteport, localip, localport, nType);
//然后可以进行数据发送和接收
m_xsocket.Send(); //说明同上
m_xsocket.Recv(); //说明同上
m_xsocket.Close();
例子:
a. 192.168.15.100是服务器,侦听端口是80
192.168.15.101是客户端,访问192.168.15.100的80服务
192.168.15.100上的程序是
m_100xsocket.CreateTCPServer("192.168.15.100", 80);
或者m_100xsocket.CreateTCPServer("0.0.0.0", 80);//本机只有一个IP接口时
192.168.15.101上的程序是
m_x101socket.CreateTCPClient("192.168.15.100", 80);
b. 192.168.0.100发送UDP数据给192.168.0.101的8080
192.168.15.100上的程序是
m_100xsocket.CreateUDP("192.168.15.101", 8080, "0.0.0.0", 0, S_WYJ_SEND);
192.168.15.101上的程序是
m_x101socket.CreateUDP("0.0.0.0", 8080, "192.168.15.101", 0, S_WYJ_RECV);
c. 192.168.0.100发送组播数据225.1.1.1:1000, 192.168.0.101接收数据
192.168.15.100上的程序是
m_100xsocket.CreateUDP("225.1.1.1", 1000, "192.168.0.100", 0, S_WYJ_SEND);
192.168.15.101上的程序是
m_x101socket.CreateTCPClient("225.1.1.1", 8080, "192.168.15.101", 0, S_WYJ_RECV);
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -