udpsocket.cpp

来自「广宇GPS系统」· C++ 代码 · 共 117 行

CPP
117
字号
#include "stdafx.h"
#include "UdpSocket.h"


int CUdpSocket::InitWSA(){
	WSADATA w;
	if (WSAStartup(MAKEWORD(2,2), &w)!=0){
		ErrorNote("WSAStartup", WSAGetLastError());
		return 0;
	}
	return 1;
}

int CUdpSocket::InitServer(char *IP_Addr, int Port){
	int o = 1;
	int t = 60;
	SOCKET ServerSocket;
	if (!InitWSA())
		return 0;
	ServerSocket = socket(AF_INET, SOCK_DGRAM, 0);
	if (ServerSocket==INVALID_SOCKET){
		ErrorNote("socket", WSAGetLastError());
		return 0;
	}
	if (setsockopt(ServerSocket, SOL_SOCKET, SO_REUSEADDR, (char *)&o, sizeof(0))){
		ErrorNote("setsockopt:SO_REUSEADDR", WSAGetLastError());
		return 0;
	}
	if (setsockopt(ServerSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&t, sizeof(t))){
		ErrorNote("setsockopt:SO_SNDTIMEO", WSAGetLastError());
		return 0;
	}
	if (setsockopt(ServerSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&t, sizeof(t))){
		ErrorNote("setsockopt:SO_RCVTIMEO", WSAGetLastError());
		return 0;
	}
	memset(&server, 0x0, sizeof(sockaddr_in));
	server.sin_family = AF_INET;
	server.sin_port = htons(Port);
	server.sin_addr.S_un.S_addr = inet_addr(IP_Addr);
	if (bind(ServerSocket, (struct sockaddr *)&server, sizeof(struct sockaddr))==SOCKET_ERROR){
		ErrorNote("bind", WSAGetLastError());
		return 0;
	}
	return ServerSocket;
}

int CUdpSocket::SocketSend(SOCKET CSocket, char *buf, int len, const sockaddr *t, int tlen){
	int status = sendto(CSocket, buf, len, 0, t, tlen);
	if (status==SOCKET_ERROR){
		ErrorNote("send", WSAGetLastError());
	}
	return status;
}

int CUdpSocket::SocketRecv(SOCKET CSocket, char *buf, int len, sockaddr *f, int flen){
	int status = recvfrom(CSocket, buf, len, 0, f, &flen);
	if (status==SOCKET_ERROR){
		ErrorNote("recv", WSAGetLastError());
	}
	return status;
}

void CUdpSocket::ErrorNote(char *event, int Error_ID){
	char filePath[255];
	time_t timer = time(NULL);
	struct tm *now = localtime(&timer);
	sprintf(filePath, "err\\SOCKET_%04d-%02d-%02d.txt", now->tm_year+1900, now->tm_mon+1, now->tm_mday);
	FILE *cfPtr = fopen(filePath, "a");
	if (cfPtr==NULL){
		system("md err");
		cfPtr = fopen(filePath, "a");
	}
	if (cfPtr!=NULL){
		printf("%-10s%-10d%02d:%02d:%02d\n", event, Error_ID, now->tm_hour, now->tm_min, now->tm_sec);
		fprintf(cfPtr, "%s,%d,%02d:%02d:%02d\n", event, Error_ID, now->tm_hour, now->tm_min, now->tm_sec);
		fclose(cfPtr);
	}
}

int CUdpSocket::SocketAccept(SOCKET ServerSocket){
	int l = sizeof(visite);
	SOCKET CSocket;
	if (ServerSocket==INVALID_SOCKET)
		return 0;
	CSocket = accept(ServerSocket, (struct sockaddr *)&visite, &l);
	if (CSocket==INVALID_SOCKET){
		ErrorNote("accept", WSAGetLastError());
		return 0;
	}
	return CSocket;
}

int CUdpSocket::InitClient(char *IP_Addr, int Port){
	long a = 1L;
	int o = 1;
	int t = 60;
	SOCKET CSocket;
	if (!InitWSA())
		return 0;
	CSocket = socket(AF_INET, SOCK_DGRAM, 0);
	if (CSocket==INVALID_SOCKET){
		ErrorNote("socket", WSAGetLastError());
		return 0;
	}
	client.sin_family = AF_INET;
	client.sin_port = htons(Port);
	client.sin_addr.S_un.S_addr = inet_addr(IP_Addr);
	return CSocket;
}

void CUdpSocket::TerminateSocket(SOCKET CSocket){
	if (CSocket!=INVALID_SOCKET)
		closesocket(CSocket);
	WSACleanup();
}

⌨️ 快捷键说明

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