📄 socket.c
字号:
is_connected[fd]=0;
close(fd);
SetClientDisconnect(Port,fd);
break;
case 0:
sprintf(s,"Client Addr %s DisConnect .\n",Clients[fd].sIPAddress);
ShowMessage(s);
is_connected[fd]=0;
close(fd);
SetClientDisconnect(Port,fd);
break;
default: // read data.
AddPckHeadAndSend(buffer,Port,revDatalen,1);
break;
}
}
}
}
}
sprintf(s,"thread stop,Port %d Close.\n",Port);
ShowMessage(s);
close(sockfd);
gThreadStop --;
}
int PareData(char *buffer)
{
int iPackType = -1;
struct PACK_HEAD * pHead = (struct PACK_HEAD*)buffer;
iPackType = pHead->PackSubType;
if((iPackType < 1) && (iPackType > 4))
{
return -1;
}
return iPackType;
}
int CutPckHeadAndSend(char *buffer,int port,int datalen,int type)
{
char *p;
int iOutport;
int iBufferSize = 0,iSend = -1;
int iChannel = -1;
int iHeadSize=0;
char strmsg[100];
int index;
iHeadSize += sizeof(struct PACK_HEAD);
iBufferSize = datalen - iHeadSize ;
p = malloc(iBufferSize);
memcpy(p ,buffer + iHeadSize,iBufferSize);
if(type == 1)
{
iChannel = GetListenPortConnectID(port); // For visitor channel
}else{
index = GetIPTableIndex( port,1);
if (index > 0)
{
iChannel = ConnectPC(iptable[index].ipaddress,iptable[index].mapport);
}
}
if (iChannel == -1)
{
sprintf(strmsg,"Port : %d not find connect ID.\n",port);
ShowMessage(strmsg);
free(p);
return -1;
}else
{
iSend = SendDataByChannel(iChannel,buffer,datalen);
}
if(type == 2)
{
close(iChannel);
}
free(p);
return iSend;
}
int SendData(const char *buffer,const char *IPAddr,int port,int datalen)
{
int sockfd;
char strMsg[100];
int iSend = 0;
int iBufferSize = 0;
int nR;
sockfd = ConnectPC(IPAddr,port);
if(sockfd == -1)
{
sprintf(strMsg,"Connect IP: %s port : %d failure.cannot send data.\n",IPAddr,port);
ShowMessage(strMsg);
return -1;
}else
{
iBufferSize = datalen;
while(iSend < iBufferSize)
{
nR = send(sockfd,buffer + iSend,iBufferSize - iSend,0);
if (nR == -1)
{
close(sockfd);
return -1;
}
sleep(2);
iSend += nR;
}
close(sockfd);
}
return iSend;
}
int GetListenPortConnectID(int port)
{
int i;
for(i = 0;i < MAXPORTNUM;i++)
{
if((Clients[i].PortNo == port) && (Clients[i].is_connect ==1))
return Clients[i].SocketFD;
}
return -1;
}
int SendDataByChannel(int Channel,char *buffer,int datalen)
{
int iSend = 0;
int iBufferSize = 0;
int nR;
iBufferSize = datalen;
while(iSend < iBufferSize)
{
nR = send(Channel,buffer + iSend,iBufferSize - iSend,0);
if (nR == -1)
{
return -1;
}
sleep(2);
iSend += nR;
}
return iSend;
}
int AddClientList(int port,int sockfd,char *ipaddr)
{
if(giList < MAXPORTNUM)
{
Clients[giList].PortNo = port;
Clients[giList].SocketFD = sockfd;
Clients[giList].is_connect = 1;
strcpy(Clients[giList].sIPAddress,ipaddr);
giList++;
}else
{
return -1;
}
return 0;
}
void SetClientDisconnect(int port,int sockfd)
{
int i;
int iRow = -1;
for(i = 0; i < MAXPORTNUM;i++)
{
if((Clients[i].PortNo == port) && (Clients[i].SocketFD == sockfd))
{
iRow = i;
}
}
if(iRow > -1)
{
if (iRow < giList)
{
for(i = iRow;i < giList +1;i++)
{
Clients[i].PortNo = Clients[i+1].PortNo;
Clients[i].SocketFD = Clients[i+1].SocketFD;
Clients[i].is_connect = Clients[i+1].is_connect;
strcpy(Clients[i+1].sIPAddress,Clients[i].sIPAddress);
}
giList --;
}
}
}
void InitList(void)
{
int i;
for (i = 0;i < MAXPORTNUM;i++)
{
Clients[i].PortNo = -1;
Clients[i].SocketFD = -1;
Clients[i].is_connect = -1;
strcpy(Clients[i].sIPAddress,"\0");
}
}
char * GetMapIP(int port)
{
int i;
for(i = 0;i < MAXPORTNUM;i++)
{
if(iptable[i].ctrlport == port)
{
return iptable[i].ipaddress;
}
}
return NULL;
}
int GetMapPort(int port)
{
int i;
for(i = 0;i < MAXPORTNUM;i++)
{
if(iptable[i].ctrlport == port)
{
return iptable[i].mapport;
}
}
return 0;
}
char * GetSendIP(int port)
{
int i;
for(i = 0;i < MAXPORTNUM;i++)
{
if(Clients[i].PortNo == port)
{
return Clients[i].sIPAddress;
}
}
return NULL;
}
void ScanMapPortThread(int index)
{
char ipaddr[16];
int mapport;
int sockfd;
int fileError;
fd_set readfds;
char buffer[BUFFERSIZE];
char s[256];
struct timeval tv={10,0};
int revdatalen;
mapport = iptable[index].mapport;
strcpy(ipaddr,iptable[index].ipaddress);
gThreadStop++;
while(gThreadRunning)
{
sprintf(s,"connecting ip:%s Mapport:%d again.\n",ipaddr,mapport);
ShowMessage(s);
sockfd = ConnectPC(ipaddr,mapport);
if (sockfd < 0)
{
sprintf(s,"connect ip:%s Mapport:%d failure.\n",ipaddr,mapport);
ShowMessage(s);
g_usleep(100);
continue;
}else{
sprintf(s,"ip : %s mapping port : %d thread starting.\n",ipaddr,mapport);
ShowMessage(s);
}
for(;;)
{
g_usleep(100);
FD_ZERO(&readfds);
FD_SET(sockfd,&readfds);
fileError = select(sockfd+1,&readfds,NULL,NULL,&tv);
if(fileError == 0)
{
continue;
}else if(fileError < 0) {
sprintf(s,"ip:%s Mapport:%d disconnect.\n",ipaddr,mapport);
ShowMessage(s);
break;
}
if(FD_ISSET(sockfd,&readfds))
{
bzero(buffer,sizeof(buffer));
revdatalen = read(sockfd,buffer,sizeof(buffer));
switch(revdatalen )
{
case -1:
sprintf(s,"Read port %d read error .\n",mapport);
ShowMessage(s);
close(sockfd);
break;
case 0:
printf(s,"Connect ip : %s DisConnect,Port : %d not be mapping .\n",ipaddr,mapport);
ShowMessage(s);
close(sockfd);
break;
default: // read data.
AddPckHeadAndSend(buffer,mapport,revdatalen,2);
break;
}
if(revdatalen < 1)break;
}
}
}
sprintf(s,"Map port : %d thread close.\n",mapport);
ShowMessage(s);
gThreadStop --;
}
int CheckHost(char *ipaddr)
{
struct hostent *ip;
unsigned long hostname;
char strmsg[100];
hostname = inet_addr(ipaddr);
if(hostname == -1)
{
sprintf(strmsg,"canot find ip : %s.\n",ipaddr);
ShowMessage(strmsg);
return -1;
}
// ip = gethostbyaddr(ipaddr,strlen(ipaddr),AF_INET);
// if(ip == NULL){
// sprintf(strmsg,"gethostby addr errno:%d : %s.\n",h_errno,strerror(h_errno));
// ShowMessage(strmsg);
//// return -1;
// }else{
// sprintf(strmsg," IP : %s. HostName : %s.\n",ip->h_name,ipaddr);
// ShowMessage(strmsg);
// }
return 0;
}
//----------------------------------
// type = 1 for port is control port
// type = 2 for map port
// return -1 for no find in ip table
//------------------------------------------
int GetIPTableIndex(int port,int type)
{
int i;
if(type == 1)
{
for (i = 1;i<MAXPORTNUM;i++)
{
if(iptable[i].ctrlport == port)
return i;
}
}else{
for (i = 1;i<MAXPORTNUM;i++)
{
if(iptable[i].mapport == port)
return i;
}
}
return -1;
}
//----------END-------------------------------------
//----TEST moudle-------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -