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

📄 socket.c

📁 使用本地端口访问远程不同IP端口
💻 C
📖 第 1 页 / 共 2 页
字号:
							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 + -