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

📄 server.c

📁 linux 下的socket 服务端程序
💻 C
字号:
// server.c#ifndef TEST_SERVER_C#define TEST_SERVER_C#include <stdio.h>#include <pthread.h>#include <string.h>#include <time.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <sys/select.h>#include <errno.h>#define MYPORT 	        	5986#define MAXBACKLOG      	5#define STRLEN	        	0x10000#define GN_EVT_MSU              4#define GN_EVT_STARTTIME        14#define GN_EVT_TRANS_ALARM      5#define GN_EVT_SIGNAL_ALARM     6#define MAX_SU_DATA_LEN         400#define TCP_BUFFER_SIZE         0x20000#define MAX_FILE_SIZE           0xa00000#ifndef TO_FILE#define TO_FILE#endiftypedef struct tagGN_EVENT_HEAD {   unsigned short length;   unsigned char type;   unsigned int  tmStamp0;   unsigned char tmStamp1;}EventHead;unsigned char szPendingBuf[TCP_BUFFER_SIZE];int  iPendingLen;long cnt;char seq;int file_size;char name[32];int  analyseTcpStream(unsigned char *cbuffer, int len);int  WriteToFile(unsigned char *data, int ilen);void *pthread_work(void *fd){   int iret;  int sockfd = *(int *)fd;  char cBuf[STRLEN];//  char errmsg[256];  fd_set fds;  struct timeval timeout = {3,0};  int tcp_buff_size, optlen;    optlen = 1;  tcp_buff_size = TCP_BUFFER_SIZE;  if ((setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (char*)&tcp_buff_size, sizeof(optlen)) != 0)     || (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (char*)&tcp_buff_size, sizeof(optlen)) != 0))  {    fprintf(stderr, "setsockopt error:%s\n", strerror(errno));    return NULL;  }  while(1)  {    FD_ZERO(&fds);    FD_SET(sockfd, &fds);    switch(select(sockfd+1, &fds, NULL, NULL, &timeout))    {      case -1: // close or error        close(sockfd);        return NULL;      case 0: //timeout        break;      default:        if (FD_ISSET(sockfd, &fds))        {          iret = recv(sockfd, cBuf, STRLEN, 0);          if (iret == 0)          {            fprintf(stderr, "socket :%d is closed\n", sockfd);            close(sockfd);            return NULL;          }          #ifdef TO_FILE          WriteToFile(cBuf, iret);          #else          analyseTcpStream(cBuf, iret);#endif        }    }  }//while}int main(int argc , char **argv){  int sockefd,listend;  int ret,i,addrlen;  struct sockaddr_in my_addr;  char buf[STRLEN];  pthread_t thid;  int svr_port;  time_t new_time;  struct tm *pt;  if(argc != 2)  {    printf("parameter error\n");    return 0;  }  // initinal#ifdef TO_FILE  seq = 0;  cnt =0;  iPendingLen=0;  file_size=0;  time(&new_time);  pt = gmtime(&new_time);  sprintf(name,"%04d%02d%02d%02d%02d%02d%03d.dat",     pt->tm_year+1900,    pt->tm_mon+1,    pt->tm_mday,    pt->tm_hour,    pt->tm_min,    pt->tm_sec,    seq++);#endif  svr_port = atoi(argv[1]);  sockefd=socket(AF_INET,SOCK_STREAM,0);  my_addr.sin_family=AF_INET;  my_addr.sin_port=htons(svr_port);  my_addr.sin_addr.s_addr= htonl(INADDR_ANY);  bzero(&my_addr.sin_zero,8);  ret=bind(sockefd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr_in));  if(ret<0)  {    fprintf(stderr,"server:bind ret=[%d],error: %s\n",ret,strerror(errno));    return -1;   }  ret=listen(sockefd,MAXBACKLOG);  if(ret<0)   {    fprintf(stderr,"server:listen ret=[%d]\n",ret);    return -1;  }  fprintf(stderr,"socket %d is Listening at %d\n", sockefd,svr_port);  while(1)  {    addrlen=sizeof(struct sockaddr_in);    listend=accept(sockefd,(struct sockaddr *)&my_addr,&addrlen);    if(listend==-1)    {      fprintf(stderr,"server:accept listend=[%d],errno=[%d]\n",listend,errno);      return listend;    }    else    {      fprintf(stderr,"connect from %s\n", inet_ntoa(my_addr.sin_addr));      if(pthread_create(&thid,NULL,pthread_work,&listend)<0)       {        fprintf(stderr, "create the %dth thread fail\n",i);        return -1;      }    }	  }//while  return 0;}int analyseTcpStream(unsigned char *cbuffer, int len){  int iPendingPtr = 0;  int bDoneFlag = 0;  //EventHead *pEvt;  unsigned char szTmpBuf[2048], outbuf[256];  unsigned char *ptr;  int i, packlen, type;  static int sn[32];  int seq;  unsigned char e1,b1,b2,b3,b4;  if((len + iPendingLen) > TCP_BUFFER_SIZE) {   return 0;}  memcpy(&szPendingBuf[iPendingLen], cbuffer, len);  iPendingLen += len;    while(!bDoneFlag && iPendingLen > 10)  {    //pEvt = (EventHead*)(&szPendingBuf[iPendingPtr]);    ptr = szPendingBuf+iPendingPtr;    //packlen = pEvt->length;    packlen = *ptr + *(ptr+1) * 0x100;    type = *(ptr+2);    //check packet length is valid    if(packlen > MAX_SU_DATA_LEN || packlen < 10)    { /* invalid packet */      iPendingLen = 0;      bDoneFlag = 1;      fprintf(stderr, "DATA error, packlen=%d\n", packlen);      continue;    }    if(iPendingLen < packlen)    { /* packet no finished */      bDoneFlag = 1;      continue;    }    switch(type)    {      case GN_EVT_MSU:        e1 = *(ptr+8);        b1 = *(ptr+10);        b2 = *(ptr+11);        b3 = *(ptr+12);        b4 = *(ptr+13);        seq = b1 + b2 * 0x100 + b3 * 0x10000 + b4 * 0x1000000;        if (seq != (sn[e1]+1))        {          fprintf(stderr, "E1[%d] seq lost , last-current[%d - %d]\n",              e1, sn[e1], seq);        }        if (seq == 43)        {          seq = 0;        }        sn[e1] = seq;        if (!(cnt++ & 0x0000ffff))          fprintf(stderr, "\r(%u) packlen=%3d", cnt, packlen);        break;      case GN_EVT_STARTTIME:        for(i = 0; i< packlen; i++)          sprintf(&outbuf[i*3], " %02x", *ptr++ & 0xff);        fprintf(stderr,outbuf);        fprintf(stderr,"\n");        break;      default:        fprintf(stderr, "recv data error \n");        bDoneFlag = 1;        iPendingLen = 0;        break;    }    iPendingLen -= packlen;    iPendingPtr += packlen;  }//while  if(iPendingLen > 0 && iPendingLen < MAX_SU_DATA_LEN)  {    memcpy(szTmpBuf, &szPendingBuf[iPendingPtr], iPendingLen);    memcpy(szPendingBuf, szTmpBuf, iPendingLen);  }  else if (iPendingLen != 0)  { 	iPendingLen = 0;  }  return 0;}int WriteToFile(unsigned char *data, int ilen){  char tmpname[32];  struct tm *pt;  FILE *pfd;  time_t new_time;  if (file_size > MAX_FILE_SIZE)  {    time(&new_time);    pt = gmtime(&new_time);    sprintf(name,"%04d%02d%02d%02d%02d%02d%03d.dat",       pt->tm_year+1900,      pt->tm_mon+1,      pt->tm_mday,      pt->tm_hour,      pt->tm_min,      pt->tm_sec,      seq++);    file_size = 0;  }  if (!(pfd=fopen(name, "a+b")))  {    fprintf(stderr, "open file error:%s\n", strerror(errno));    return -1;  }    if (fwrite(data, 1, ilen, pfd) != ilen)  {    fprintf(stderr, "write file error:%s\n", strerror(errno));    return -1;  }  file_size += ilen;  if (fclose(pfd))  {    fprintf(stderr, "close file error:%s\n", strerror(errno));    return -1;  }}#endif

⌨️ 快捷键说明

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