典型的SocketServer端程序.

本文介绍了一个简单的LogServer日志服务实现,该服务通过指定端口监听并接收客户端发送的日志信息。服务端采用C/C++语言编写,利用socket编程进行网络通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导读:
  
  CPP文件:
  #include "LogServer.h"
  LogServer::LogServer(WORD wPort)
  {
  this->Port = wPort;
  this->addr_len = sizeof(struct sockaddr);
  this->count = 0;
  if((this->SockFd.sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  {
  printf("Log Server Error!!/n");
  return;
  }
  this->SockFd.server_addr.sin_family = AF_INET;
  this->SockFd.server_addr.sin_port = htons(this->Port);
  this->SockFd.server_addr.sin_addr.s_addr = INADDR_ANY;
  memset(this->SockFd.server_addr.sin_zero, 0, sizeof(this->SockFd.server_addr.sin_zero));
  if(bind(this->SockFd.sock, (struct sockaddr *)&this->SockFd.server_addr, sizeof(struct sockaddr)) == -1)
  {
  printf("Log Server Bind Error!!/n");
  return;
  }
  if(listen(this->SockFd.sock, BACKLOG) == -1)
  {
  printf("Log Server Listen error!!/n");
  return;
  }
  this->SockFd.is_connect = 0;
  this->SockFd.wait_cycle = 0;
  }
  void LogServer::Execute()
  {
  while(1)
  {
  tv.tv_sec = 0;
  tv.tv_usec = 0;
  FD_ZERO(&readfds);
  FD_SET(this->SockFd.sock, &readfds);
  if (this->SockFd.is_connect == 1)
  {
  FD_SET(this->SockFd.subsock, &readfds);
  }
  if (select(FD_SETSIZE, &readfds, NULL, NULL, &tv) >0)
  {
  if (FD_ISSET(this->SockFd.sock, &readfds)) //new connect
  {
  if (this->SockFd.is_connect == 1)
  {
  close(this->SockFd.subsock);
  }
  //send_read_p[i] = send_write_p[i];
  //receive_read_p[i] = receive_write_p[i];
  this->SockFd.subsock = accept(this->SockFd.sock,(struct sockaddr *)&this->SockFd.client_addr, &addr_len);
  this->SockFd.is_connect = 1;
  printf("PORT %d is connected to LogServer./n", this->Port);//连接成功,现在服务端就可以向客户端发信息了.
  
  //write(this->SockFd.subsock,WriteBuff,iLength);
  }
  else
  {
  if (FD_ISSET(this->SockFd.subsock, &readfds)) //read socket
  {
  this->count = read(this->SockFd.subsock, this->ReadBuff, 512);
  if (count <= 0) //close connect
  {
  close(this->SockFd.subsock);
  //send_read_p[i] = send_write_p[i];
  //receive_read_p[i] = receive_write_p[i];
  this->SockFd.is_connect = 0;
  printf("PORT %d is disconneced/n", this->Port);
  }
  else
  {
  //if(GetDebug())
  {
  printf("/nLog Server Receive Data:/n");
  for (int k=0; k
  {
  printf("%02X ",this->ReadBuff[k]);
  }
  }
  
  }
  }
  }
  }
  usleep(10000); //10ms
  }
  }
  
  头文件:
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  #include //sockaddr_in结构定义在这个文件中
  #include
  #include
  #include
  #include
  #define BACKLOG 10
  struct StrSock{
  int sock;
  int subsock;
  struct sockaddr_in server_addr;
  struct sockaddr_in client_addr;
  int is_connect;
  int wait_cycle;
  };
  class LogServer
  {
  private:
  struct StrSock SockFd;
  WORD Port;
  socklen_t addr_len; //这个变量有的操作系统中可以被定义为int型的,不过在这个操作系统中不能这么定义,必须被定义为socklen_t型的.
  struct timeval tv;
  fd_set readfds;
  int count;
  BYTE ReadBuff[512];
  struct hostent *local;
  public:
  LogServer(WORD iPort);
  void Execute();
  };

本文转自
http://zxlest.blog.163.com/blog/static/2312490420073239144488/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值