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

📄 prg11_1.c

📁 《unix网络编程技术与分析》一书的C源程序
💻 C
字号:
/* File : prg11_1.cpp  */
#include <stdio.h>
#include <string.h>
#include <vector.h>
#include "pthread.h"
#include <syslog.h>#include <sys/types.h>#include <unistd.h>#include <signal.h>#include <sys/stat.h>#include <errno.h>#include <fcntl.h>
#include "Mysocket.h"
#include "MyThread.h"
#include "MySync.h"
#include "TcpServThr.h"
#include "Chat.h"

class ChatServerd : public ChatServer{   int MsgPriority;     void closeall(int fd);public:   ChatServerd(int port, char *hostname = NULL);   ChatServerd(int port, int max_conn, int maxusr, int len, char *hostname);   
   int daemon(char* name,int facility = 0);   void DealRecv(MyThread* thread);
   void DealSend(MyThread* thread);   void SetPriority(int p) {MsgPriority = p;}   int GetPriority() {return MsgPriority;}};   ChatServerd::ChatServerd(int port, char *hostname): 
   ChatServer(port,hostname)
{
   MsgPriority = LOG_NOTICE|LOG_LOCAL0;}

ChatServerd::ChatServerd(int port, int max_conn, int maxusr, int len, char *hostname): 
   ChatServer(port,max_conn, maxusr, len, hostname){
MsgPriority = LOG_NOTICE|LOG_LOCAL0;}
   
void ChatServerd::DealRecv(MyThread* thread)
{
   syslog(MsgPriority,"Receiver is running!\n");
   char buf[MAX_PACKET_LEN];
   
   int socket = ((Receiver*) thread)->socket;
   int len = recv(socket,buf,MAX_NAME_LEN,0);
   buf[len - 1] = ':';
   buf[len] = '\0';
   syslog(MsgPriority,"%s %d\n",buf,len);

   while (1) {
      int len1 = recv(socket,buf + len,MAX_PACKET_LEN,0);
      if (len1 < 1) break;
      buf[len1 + len] = '\0';
      syslog(MsgPriority,"Recv:%s",buf);
      msg->Add(socket, buf);
      con->wakeAll();
      }
   DelThread(thread);
   
}

void ChatServerd::DealSend(MyThread* thread)
{
   char buf[MAX_PACKET_LEN];
   long  maxsn;
   
   maxsn = msg->GetSN() - 1;
   int socket = ((Receiver*) thread)->socket;
   syslog(MsgPriority,"Sender is running!\n");
   while(1) {
      con->wait();
      int err = msg->Get(socket,&maxsn,buf);
      if (err) continue;
      syslog(MsgPriority,"Send:%s",buf);
      Send(socket,buf,strlen(buf),0);
      }
   DelThread(thread);
}
int ChatServerd::daemon(char* name,int facility){
    switch (fork())
    {
        case 0:  break;
        case -1: return -1;
        default: _exit(0);          // exit the original process     }

    if (setsid() < 0)               
      return -1;

    signal(SIGHUP,SIG_IGN);  // ignore SIGHUP
    switch (fork())
    {
        case 0:  break;
        case -1: return -1;
        default: _exit(0);
    }

    chdir("/");

    closeall(0);
    open("/dev/null",O_RDWR);
    dup(0);     dup(0);

   openlog(name,LOG_PID,facility);       return 0;
}
void ChatServerd::closeall(int fd)
{
    int fdlimit = sysconf(_SC_OPEN_MAX);

    while (fd < fdlimit){      if (fd != Mysocket) close(fd);      fd++;      }
}

/*************************************************************/int main(int argc, char** argv)
{
  FILE* file = fopen("chatd.conf","r");  if (file == NULL) {     perror("chatd.conf:");     exit(1);     }    char  input[100];  int port = 1234;  int max_conn = 20;  int maxusr = 20;  int len = 20;  char *hostname = "127.0.0.1";    while(1) {     char* s = fgets(input,100,file);     if (s == NULL) break;          if (!strncasecmp(input,"PORT",4)) port = atoi(strrchr(input,' '));     if (!strncasecmp(input,"MAX_USRS",8)) maxusr = atoi(strrchr(input,' '));     if (!strncasecmp(input,"QUELEN",6)) len = atoi(strrchr(input,' '));     if (!strncasecmp(input,"MAX_CONN",8)) max_conn = atoi(strrchr(input,' '));     if (!strncasecmp(input,"HOSTNAME",8)) hostname = strrchr(input,' ');     }     ChatServerd  chatd(port, max_conn,maxusr, len, hostname);

  if (chatd.daemon(argv[0]) < 0) {        perror("daemon");
        exit(2);        }   chatd.Init();    chatd.Run();
   return 0;
}

⌨️ 快捷键说明

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