⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udpclient.cpp

📁 UDP的服务器与客户端基类
💻 CPP
字号:

#include "UdpClient.h"

CUdpClient::CUdpClient(unsigned long tgt, short pt)
{
	this->addr.sin_family = AF_INET;
	this->addr.sin_addr.s_addr = tgt;
	this->addr.sin_port = pt;
}

CUdpClient::CUdpClient(void)
{
	this->addr.sin_family = AF_INET;
	this->addr.sin_addr.s_addr = 0;
	this->addr.sin_port = 0;
}

CUdpClient::~CUdpClient(void)
{
	closesocket(sock);
	WSACleanup();
}

int CUdpClient::Init(void)
{
	int ret = 0;
	WinVersion = MAKEWORD(2, 2);
	if (WSAStartup(WinVersion, &wsa) < 0)
	{
		return -1;
	}

	sock = socket(AF_INET, SOCK_DGRAM, 0);
	if (sock == INVALID_SOCKET)
	{
		return -1;
	}

	return ret;
}

int CUdpClient::SetDestination(struct sockaddr_in &dest)
{
	memmove(&(this->addr), &dest, sizeof(struct sockaddr_in));

	return 0;
}

__int32_t CUdpClient::ReadFrom(void *buf, __u_int len, struct sockaddr_in &srv)
{
	__int32_t ret = 0;
	int length = sizeof(srv);

	ret = recvfrom(this->sock, (char *)(buf), len, 0, (struct sockaddr *)(&srv), &length);
	if (ret == SOCKET_ERROR)
	{
		return -1;
	}

	return ret;
}

__int32_t CUdpClient::WriteTo(void *buf, __u_int len, struct sockaddr_in &dest)
{
	__int32_t ret = 0;
	int length = sizeof(dest);

	ret = sendto(this->sock, (char *)(buf), len, 0, (struct sockaddr *)(&dest), length);
	if (ret == SOCKET_ERROR)
	{
		return -1;
	}

	return ret;
}	

__int32_t CUdpClient::Read(void *buf, __u_int len)
{
	__int32_t ret = 0;
	struct sockaddr_in tmp;
	int length = sizeof(struct sockaddr_in);

	ret = recvfrom(this->sock, (char *)(buf), len, 0, (sockaddr *)(&tmp), &length);
	if (ret == SOCKET_ERROR)
	{
		return -1;
	}

	return ret;
}

__int32_t CUdpClient::Write(void *buf, __u_int len)
{
	__int32_t ret = 0;
	int length = sizeof(struct sockaddr_in);

	ret = sendto(this->sock, (char *)(buf), len, 0, (struct sockaddr *)(&(this->addr)), length);
	if (ret == SOCKET_ERROR)
	{
		return -1;
	}

	return ret;
}

__int32_t CUdpClient::ReadFromWithinTime(void *buf, __u_int len, struct sockaddr_in &srv, int sec)
{
	__int32_t ret = 0;
	int length = sizeof(struct sockaddr_in);

	fd_set read_set;
	struct timeval tv;
	memset(&tv, 0, sizeof(tv));

	tv.tv_sec  = sec;
	tv.tv_usec = 0;

	FD_ZERO(&read_set);
	FD_SET(sock, &read_set);

	ret = select(0, &read_set, NULL, NULL, &tv);
	if (ret == SOCKET_ERROR)
	{
		return -1;
	}
	if (ret == 0)
	{
		return 0;
	}

	ret = recvfrom(this->sock, (char *)(buf), len, 0, (sockaddr *)(&(srv)), &length);
	if (ret == SOCKET_ERROR)
	{
		return -1;
	}

	return ret;
}

__int32_t CUdpClient::ReadWithinTime(void *buf, __u_int len, int sec)
{
	__int32_t ret = 0;

	fd_set read_set;
	struct timeval tv;
	memset(&tv, 0, sizeof(tv));

	tv.tv_sec  = sec;
	tv.tv_usec = 0;

	FD_ZERO(&read_set);
	FD_SET(sock, &read_set);

	ret = select(0, &read_set, NULL, NULL, &tv);
	if (ret == SOCKET_ERROR)
	{
		return -1;
	}
	if (ret == 0)
	{
		return 0;
	}

	struct sockaddr_in tmp;
	int length = sizeof(tmp);
	ret = recvfrom(this->sock, (char *)(buf), len, 0, (sockaddr *)(&tmp), &length);
	if (ret == SOCKET_ERROR)
	{
		return -1;
	}

	return ret;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -