📄 socket.c
字号:
///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 + -