📄 cudpsocket.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 + -