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

📄 socket.c

📁 使用本地端口访问远程不同IP端口
💻 C
📖 第 1 页 / 共 2 页
字号:
///Socket.c------
#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>

#include<arpa/inet.h>
#include<errno.h>
#include <gtk/gtk.h>
#include<string.h>

#include "IpHead.h"
#include "socket.h"


//char gsLocalIP1[16];
//char gsLocalIP2[16];
//char gsRemoteIP[16];

extern struct IPTable iptable[ MAXPORTNUM];
struct ListenPort listenport[ MAXPORTNUM];
struct ClientOfConnection Clients[MAXPORTNUM];

extern void ShowMessage(const char *str);
extern int giMapNum;

int giList = 0;
int gThreadRunning=0;
int gThreadStop = 0;
//--------------------------------
// if Error return -1;
//		else Return Socket FD
//-------------------------------
int ConnectPC(const char *IPaddr,int Port)
{
	int sockfd;
	struct sockaddr_in addr;
	char msgstr[100];
	int iConnect;
	
	if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0)
	{
		sprintf(msgstr,"create socket error ,error=%s\n",strerror(errno));
		ShowMessage(msgstr);
		return -1;
	}
	/* 填写sockaddr_in结构*/
	bzero(&addr,sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_port=htons(Port);
	addr.sin_addr.s_addr = inet_addr(IPaddr);
	/* 尝试连线*/
	iConnect = connect(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr));
	if(iConnect < 0){
		sprintf(msgstr,"Connect    IP:%s    Port:%d     Failure....\n",IPaddr,Port);
		ShowMessage(msgstr);

		return -1;
	}
	sprintf(msgstr,"Connect  IP:%s     Port:%d     ConnectFd:%d    success...\n",IPaddr,Port,sockfd);
	ShowMessage(msgstr);

	return sockfd;
}

int TransmitThread(int Port)
{
	int fileError=0;
	int sockfd,newsockfd,is_connected[MAXPORTNUM],fd;
	struct sockaddr_in addr;
	int addr_len = sizeof(struct sockaddr_in);
	fd_set readfds;
	char buffer[BUFFERSIZE];
	char s[256];
	struct timeval tv={10,0};
	
	gThreadStop ++;

	if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0)
	{
		sprintf(s,"Server Create socket failure,system terminate.YOU MUST RESET THE THREAD!\n");
		ShowMessage(s);
	}

	bzero(&addr,sizeof(addr));
	addr.sin_family =AF_INET;
	addr.sin_port = htons(Port);
	addr.sin_addr.s_addr = htonl(INADDR_ANY);
	
	if(bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in))<0)
	{
		sprintf(s,"Server Bind Failure,System terminate.YOU MUST RESET THE THREAD!\n");
		ShowMessage(s);
	}

	if(listen(sockfd,3)<0)
	{
		sprintf(s,"Server listen Failure,System terminate.YOU MUST RESET THE THREAD!\n");
		ShowMessage(s);
	}

	ShowMessage("Transmit Server Lisetning..........\n");

	for(fd=0;fd<MAXPORTNUM;fd++)
		is_connected[fd]=0;
	
	while(gThreadRunning)
	{
		g_usleep(100);

		FD_ZERO(&readfds);
		FD_SET(sockfd,&readfds);

		for(fd=0;fd<MAXPORTNUM;fd++)
			if(is_connected[fd]) FD_SET(fd,&readfds);

		fileError = select(MAXPORTNUM,&readfds,NULL,NULL,&tv);

		if(fileError == 0)
		{
			continue;
		}else if(fileError < 0)
		{
			sprintf(s,"select error,YOU MUST RESET THE THREAD!\n");
			ShowMessage(s);
		}

		for(fd=0;fd<MAXPORTNUM;fd++)
		if(FD_ISSET(fd,&readfds))
		{
			if(sockfd == fd) //if Server Socket ID then Accept
			{
				if((newsockfd = accept (sockfd,(struct sockaddr *)&addr,&addr_len))<0){
					sprintf(s,"Server accept client %s Failure.\n",inet_ntoa(addr.sin_addr));
					ShowMessage(s);
				}

				is_connected[newsockfd] = 1;
				sprintf(s,"transmit cnnect from %s\n",inet_ntoa(addr.sin_addr));
				ShowMessage(s);
				
			}else
			{ //Client Socket ID
				bzero(buffer,sizeof(buffer));
				fileError = read(fd,buffer,sizeof(buffer));
				if(fileError == -1)
				{
					sprintf(s,"Client Addr %s read error .\n",Clients[fd].sIPAddress);
					ShowMessage(s);
					is_connected[fd]=0;
					close(fd);
				}if (fileError == 0)
				{
					printf(s,"Client Addr %s DisConnect .\n",Clients[fd].sIPAddress);
					ShowMessage(s);
					is_connected[fd]=0;
					close(fd);
				}else // read data.
				{
					if (SendDataToClient(buffer,Port,fileError) < 0 )
					{
						sprintf(s,"Send data to Agent Failure.\n");
						ShowMessage(s);
					}
				}
			}
		}
	}
	sprintf(s,"thread stop,Port %d Close.\n",Port);
	ShowMessage(s);
	close(sockfd);
	gThreadStop --;
}

int SendDataToClient(char *buffer,int Port,int datalen)
{
	struct PACK_HEAD *p;
	int  iPckHeadLen;
	int iPackSubType;
	int port;
	int isend= 0;

	p = (struct PACK_HEAD *)buffer;
	iPackSubType = p->PackSubType;
	if(iPackSubType > 0)
	{
		port = p->OutPort;

		switch(iPackSubType)
		{
			case 1: // 
				// Send Data to Mapport
				if(port > 0){
					isend = CutPckHeadAndSend(buffer, port, datalen,2);
				}
				break;
			case 2:	// data From Mapport return 
				if(port > 0){
					isend = CutPckHeadAndSend(buffer, port, datalen,1);
				}
				break;
			default:
				break;
		}
	}

	return isend;
}

int AddPckHeadAndSend(char *buffer,int port,int datalen,int type)
{
	char p[BUFFERSIZE];
	struct PACK_HEAD *pck;
	int iOutport;
	int index;

	int iBufferSize = 0,iSend = -1;
	int iChannel = -1;
	char str[100];

	iBufferSize = datalen + sizeof(struct PACK_HEAD);
	pck = malloc(sizeof(struct PACK_HEAD));
	if(p == NULL)
	{
		ShowMessage("malloc memery error.\n");
		return -1;
	}

	bzero(p,iBufferSize);

	pck->PackType = 0;						//包类型 音频/视频/指令 [pack flag]
	if (type == 1)
	{
		pck->PackSubType = 1;	//子类型0 - invalid 1 - Read Data from port 2 - the Packet return form map port
	}else{
		pck->PackSubType = 2;
	}
	pck->iIfAck = 0;							//是否为应答码
	pck->iAck = 0;								//应答码 VCON_RESULT_OK/VCON_RESULT_ERROR
	pck->inPort = port;						//入端口
	if (type == 1)
	{	//add pack
		index = GetIPTableIndex( port,1);
		if(index > 0)
		{
			iOutport  = iptable[index].mapport;
			pck->OutPort = iOutport; 								//输出端口
		}else {
			pck->OutPort = 0;
		}

		strcpy(pck->sSendaddr,GetSendIP(port));					//发送者
		strcpy(pck->sRecvaddr,GetMapIP(port));					//接收者
	}else{
		index = GetIPTableIndex( port,2);
		if(index > 0)
		{
			iOutport  = iptable[index].ctrlport;
			pck->OutPort = iOutport; 								//输出端口
		}else {
			pck->OutPort = 0;
		}
		strcpy(pck->sSendaddr,GetMapIP(port));
	}
	
	pck->nDataLen = iBufferSize;
	
	sprintf(str,"Port %d Read data from ip %s  out port is %d.\n",port,pck->sSendaddr,pck->OutPort);
	ShowMessage(str);
	sprintf(str,"data %s ,head:%d\n",buffer,sizeof(struct PACK_HEAD));
	ShowMessage(str);

	memcpy(p,pck,sizeof(struct PACK_HEAD));
	memcpy(p + sizeof(struct PACK_HEAD),buffer,datalen);
	
	iChannel = ConnectPC(gsRemoteIP,TRANSPORT);
	if(iChannel == -1)
	{
		free(pck);
		return -1;
	}	

	iSend = SendDataByChannel(iChannel,(char *)p,iBufferSize);
	close(iChannel);
	free(pck);
	return iSend;
}

int ListenPortTread(int Port)
{
	int fileError=0;
	int sockfd,newsockfd,is_connected[MAXPORTNUM],fd;
	struct sockaddr_in addr;
	int addr_len = sizeof(struct sockaddr_in);
	fd_set readfds;
	char buffer[BUFFERSIZE];
	char s[256];
	struct timeval tv={10,0};
	int revDatalen;

	gThreadStop ++;
	if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0)
	{
		sprintf(s,"Server Create socket failure,system terminate.YOU MUST RESET THE THREAD!\n");
		ShowMessage(s);
	}

	bzero(&addr,sizeof(addr));
	addr.sin_family =AF_INET;
	addr.sin_port = htons(Port);
	addr.sin_addr.s_addr = htonl(INADDR_ANY);
	
	if(bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in))<0)
	{
		sprintf(s,"Server Bind Failure,System terminate.YOU MUST RESET THE THREAD!\n");
		ShowMessage(s);
	}

	if(listen(sockfd,3)<0)
	{
		sprintf(s,"Server listen Failure,System terminate.YOU MUST RESET THE THREAD!\n");
		ShowMessage(s);
	}

	for(fd=0;fd<MAXPORTNUM;fd++)
		is_connected[fd]=0;

	sprintf(s,"channel %d port %d listenning...\n",sockfd,Port);
	ShowMessage(s);

	while(gThreadRunning)
	{
		g_usleep(180);

		FD_ZERO(&readfds);
		FD_SET(sockfd,&readfds);

		for(fd=0;fd<MAXPORTNUM;fd++)
		{	if(is_connected[fd])
			 FD_SET(fd,&readfds);
		}

		fileError = select(MAXPORTNUM,&readfds,NULL,NULL,&tv);
	
		if(fileError == 0)
		{
			continue;
		}else if(fileError < 0)
		{
			sprintf(s,"select error,YOU MUST RESET THE THREAD!\n");
			ShowMessage(s);
		}

		for(fd=0;fd<MAXPORTNUM;fd++)
		{
			if(FD_ISSET(fd,&readfds))
			{
				if(sockfd == fd) //if Server Socket ID then Accept
				{
					if((newsockfd = accept (sockfd,(struct sockaddr *)&addr,&addr_len))<0){
						sprintf(s,"Server accept client %s Failure.\n",inet_ntoa(addr.sin_addr));
						ShowMessage(s);
					}
					AddClientList(Port,newsockfd,inet_ntoa(addr.sin_addr));
					is_connected[newsockfd] = 1;
					sprintf(s,"port %d cnnect from %s\n",Port,inet_ntoa(addr.sin_addr));
					ShowMessage(s);
					
				}else
				{ //Client Socket ID
					bzero(buffer,sizeof(buffer));
					revDatalen = read(fd,buffer,sizeof(buffer));
					switch(revDatalen)
					{
						case -1:
							sprintf(s,"Client Addr %s read error .\n",Clients[fd].sIPAddress);
							ShowMessage(s);

⌨️ 快捷键说明

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