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

📄 cudpsocket.cpp

📁 linux下的一个多线程服务器框架,可直接应用此框架开发一个支持大用户量的UDP应用服务器
💻 CPP
字号:
#include "CUdpsocket.h"

CUdpsocket::CUdpsocket()
{

	yes=1;
	struct linger linger = {0};
	memset(ServAddr,'\0',20);
	ServPort=0;
	write_log((u_char *)"CUdpsocket completed......");
}
void CUdpsocket::write_log(u_char *string)
{
	FILE *fp;
	char fn[20];
  	time_t tt;
  	struct tm *ttt;

    	time(&tt);
    	ttt=localtime(&tt);

	sprintf(fn,"./logs/sublog%02d%02d%02d",
		ttt->tm_year+1900,ttt->tm_mon+1,ttt->tm_mday);

	fp=fopen(fn,"a+");

	if (string==NULL || string[0]=='\0') 
		fprintf(fp,"\n");
	else
		fprintf(fp,"%02d%02d%02d[%02d:%02d:%02d]SOCKET[%05d]%s\n",
		     	ttt->tm_year+1900,ttt->tm_mon+1,ttt->tm_mday,
			ttt->tm_hour,ttt->tm_min,ttt->tm_sec,
			getpid(),string);
	fclose(fp);
}
int CUdpsocket::createsocket()
{
	write_log((u_char *)"createsocket starting......");
	u_char strstr[256];
	bzero ((char *) &serv_addr, sizeof (serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = inet_addr ((char*)ServAddr);
	serv_addr.sin_port = htons (ServPort);

	if ((sockfd = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
	{
		write_log((u_char*)"socket Error");
		return -1;
	}
	if (setsockopt	//reuse the bind addr
		(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof (yes)) < 0)
	{
		close (sockfd);
		write_log((u_char*)"socket Error");
		return -1;
	}
	linger.l_onoff = 1;
	linger.l_linger = 0;
	if (setsockopt
		(sockfd, SOL_SOCKET, SO_LINGER, (char *) &linger, sizeof (linger)) <0)
	{
		close (sockfd);
		write_log((u_char*)"socket Error");
		return -1;
	}
	if (bind (sockfd, (struct sockaddr *) &serv_addr, sizeof (struct sockaddr)) < 0)
	{
		sprintf ((char*)strstr, "addr=[%s]  port=[%d]",
		ServAddr, ServPort);
		write_log (strstr);
		close (sockfd);
		write_log((u_char*)"socket Error");
		return -1;
	}
	write_log((u_char *)"createsocket completed......");
	return 1;
}

int CUdpsocket::mrecv(u_char* dataptr,char* ca)
{
	u_char sstr[8];
	int len=0;
	int len1=0;
	int len2=0;
	clilen = sizeof (struct sockaddr);
	write_log((u_char *)"mrecv starting......");
	if ((len = recvfrom (sockfd, dataptr, MAXSIZE, 0,(struct sockaddr *)&cli_addr,&clilen)) == -1 )
	{
		write_log((u_char*)"recv failed");
  		return -1; //socket error,exit
	}
	sprintf(ca,"%s:%d",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port));
	memcpy(sstr,dataptr,HEADLEN);
	sstr[HEADLEN]='\0';
	len1=atoi((char*)sstr)+HEADLEN;
	if(len1<1)
		return -1;
	len2=0;
	while(len < len1)
	{
		alarm(10);
		if((len2 =  recvfrom(sockfd, dataptr+len, len1-len, 0,(struct sockaddr *)&cli_addr,&clilen)) == -1 )
		{
			write_log((u_char*)"recv failed");
			exit(0);
		}
		len+=len2;
	}
	return len;
}

int CUdpsocket::msendto(u_char * dataptr, int len, char * ca)
{
	int len1=0;
	int len2=0;
	int i = 0;
	char* tmpca = ca;
	char s[30];
	while(*tmpca!=':')
	{
		tmpca++;
		i++;
	}
	strncpy((char*)ClientAddr,ca,i);
	ClientPort = (socklen_t)atoi(++tmpca);
	sprintf(s,"the send address is %s--%d",ClientAddr,ClientPort);
	write_log((u_char *)s);
	bzero ((char *) &cli_addr, sizeof (cli_addr));
	cli_addr.sin_family = AF_INET;
	cli_addr.sin_addr.s_addr = inet_addr ((char*)ClientAddr);
	cli_addr.sin_port = htons (ClientPort);
	i=0;
	write_pack(dataptr,len);
	while(len1 < len && i<10){
		len1 = sendto(sockfd, dataptr+len2, len, 0,(struct sockaddr *)&cli_addr,sizeof(cli_addr));
		len-=len1;
		len2+=len1;
		i++;	
	}
	return i>=10?-1:len2;	
}

int CUdpsocket::write_pack(unsigned char buf[],int len)
{
	int m;
	char str[128];
	sprintf(str,"len=[%d]",len);
	if(len<HEADLEN)
		return FAIL;
	for (m=0; m<len; m++)
	{
		if (m%20==0) sprintf(str+strlen(str),"\n%02X ",buf[m]);
		else sprintf(str+strlen(str),"%02X ",
			     (unsigned char)buf[m]);
	}
	write_log((u_char*)str);
	return 1;
}

void CUdpsocket::setServIP(u_char* serva,u_short servp)
{
	strcpy((char*)ServAddr,(char*)serva);
	ServPort=servp;
}

void CUdpsocket::setClientIP(u_char* clia,u_short clip)
{
	strcpy((char*)ClientAddr,(char*)clia);
	ClientPort=(socklen_t)clip;
	bzero ((char *) &cli_addr, sizeof (cli_addr));
	cli_addr.sin_family = AF_INET;
	cli_addr.sin_addr.s_addr = inet_addr ((char*)ClientAddr);
	cli_addr.sin_port = htons (ClientPort);
}

⌨️ 快捷键说明

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