운영 및 유지보수 리눅스 운영 및 유지 관리 리눅스 채팅방 프로그램 구현 방법

리눅스 채팅방 프로그램 구현 방법

May 13, 2023 pm 10:46 PM
linux

代码:

#ifndef _i_h
 
#define _i_h
 
#include <math.h>
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <inttypes.h>
#include <time.h>
#include <sys/ioctl.h> 
#include <net/if.h>
#include <signal.h>
#include <ncurses.h>
#include <math.h>
 
#define sevr_ip   "127.0.0.1"
#define sevr_port  8081
#define cntnt_len  150
#define msg_len   sizeof(struct msg)
#define addr_len  sizeof(struct sockaddr)
#define usr_len   sizeof(struct user)
#define prt_len   8
#define hstr_len  sizeof(struct chat_history)
 
/* declare global variables */
int mainfd;/* used as chat histroy file handle*/
int sockfd;/* used as socket local handle */
int count;
struct sockaddr_in server;
 
/* msg is used for communicating message */
struct msg
{
  int flag; /* flag meaning:1,ordinary; 2,log msg; 3,reg msg, other,file*/
  int id_from;
  int id_to;
  char content[cntnt_len];
  char append[10]; 
};
 
/* user is used information list */
struct user
{
  int id;
  char name[10];
  char password[10];
  char *p_chatlog;
  struct sockaddr user_addr; 
};
/* chat_history used for reading chat history */
struct chat_history
{
  char content[cntnt_len];
  char time[25];
  int to;
  int from;
  int count;
};
 
/* i_functions below is funtions needed by both client and sever */
extern int i_saveto_chat(struct msg *pmsg);
 
int i_clean_stdin ()
{
  while (&#39;\n&#39; == getchar())
  {
    continue;
  }
 
  return(0);
}
 
int i_print(char *pmsg, int size)
{
  int i = 1;
 
  for (i; i<= size; i++)
  {
    if (*pmsg != &#39;\n&#39;)
    {
      printf("%c", *pmsg);
      pmsg ++;
    }
    else
    {
      return(0);
    }
  }
 
  return(0);
}
int i_input(char *p_input)
{
  char c = &#39;\0&#39;;
  int i; 
 
  for (i = 0; i < cntnt_len; i++)
  {
    p_input[i] = getchar();
    if (p_input[i] ==&#39;\n&#39;)
    {
      return(0);   
    }    
  }
 
  printf("you have input long enough!\n");
  return(0);
}
int i_socket(int domain, int type, int protocol)
{
  int fd; 
 
  if ((fd = socket(domain, type, protocol)) == -1)
  {
    perror("creat socket error:");
    exit(1);
  }
   
  return(fd); 
}
 
int i_bind(int fd, const struct sockaddr *addr, int namelen)
{
  if (-1 == bind(fd, addr, namelen))
  {
    perror("i_bind error:");
    exit(1);
  }
   
  return (0);
}
 
int i_recvfrom(int fd, void *buf, size_t len, int flags, 
    struct sockaddr *addr, int *size)
{  
  if (-1 == recvfrom(fd, buf, len, flags, addr, size))
  {
    perror("i_recvfrom error:");
    exit(1);  
  }
   
  return(0);
}
 
int i_sendto(int fd, void *buf, size_t len, int flags,
    struct sockaddr *addr, int size)
{
  if (-1 == sendto(fd, buf, len, flags, addr, size))
  {
    perror("i_sendto error");
    exit(1);  
  }
   
  return (0);
}
 
int i_open(const char *pathname, int flags)
{
  int fd;
  if ((fd = open(pathname, flags)) == -1)
  {
    perror("open_failed");
    exit(1);
  }
   
  return (fd);
}
int i_read(int fd, void *msg, int len)
{
  if(-1 == read(fd, msg, len))
  {
    perror("i_read error");
    exit(1);
  }
  return(0);
}
int i_write(int fd, void *msg, int len)
{
  if (-1 == write(fd, msg, len))
  {
    perror("i_write error");
    exit(0);
  }
  return(0);
}
 
/* init a socket,file and server addr */
int i_init()
{
  mainfd = i_open("./chat_log", o_rdwr|o_creat);
  sockfd = i_socket(af_inet, sock_dgram, 0);
 
  /* initialize server address */
  bzero(&server, sizeof(server));
  server.sin_family = af_inet;
  inet_pton(af_inet, "127.0.0.1", &server.sin_addr);
  server.sin_port = htons(sevr_port);
 
  perror("init");
   
  return (0);
}
 
char *i_get_time()
{
  time_t time_now;
  time(&time_now);
 
  return(ctime(&time_now));
}
int i_lseek(int fd, off_t size, int position)
{
  if (-1 == lseek(fd, size, position))
  {
    perror("seek error");
    exit(1);
  }
  return(0);
}
int i_saveto_chat(struct msg *pmsg)
{  
  struct chat_history hstr;
 
 
  bzero(&hstr, hstr_len);
  count = count + 1;
  hstr.count =count;
  hstr.from = pmsg->id_from;
  hstr.to = pmsg->id_to;
  strncpy(hstr.content, pmsg->content, cntnt_len);
  strncpy(hstr.time, i_get_time(), 25);
 
  i_lseek(mainfd, 0, seek_end);
 
  i_write(mainfd, &hstr, hstr_len);
 
  return(0);
}
 
int i_print_history(int len, int i)
{
  struct chat_history chat_reader;
  int j;
  int position;
   
  bzero(&chat_reader, hstr_len);
  if (i != 0)
  {
    position = len*i*hstr_len;
    i_lseek(mainfd, position, seek_end);
  }
  else
  {
    position = len*i*hstr_len;
 
    i_lseek(mainfd, hstr_len, seek_set);
  }
     
  for (j = 1; j <= len; j++)
  {
     
    i_read(mainfd, &chat_reader, hstr_len);
    printf("\n#item%d:id%dto id%d \n", j,
      chat_reader.from, chat_reader.to);
    i_print(chat_reader.content, cntnt_len);
    printf("\n time:%s\n", chat_reader.time);
  }
 
  return(0);
}
 
#endif
로그인 후 복사

代码二:

#include "i.h"
 
int user_list_fd;
 
/* start:initialization */
int init()
{
  i_init();
 
  user_list_fd = i_open("./user_list", o_rdwr|o_creat);
 
  struct user usr;
  /* init the user list file&#39;s fist user to 0*/
  memset((struct user*)&usr, &#39;\0&#39;, sizeof(struct user));
  i_lseek(user_list_fd, 0, seek_set);
  i_write(user_list_fd, (char*)&usr, usr_len);
 
  /* bind the struct sockaddr_in server to the sockfd */
  i_bind(sockfd, (struct sockaddr*)&server, addr_len);  
 
  struct chat_history apple; 
 
  bzero(&apple, hstr_len);
  i_lseek(mainfd, 0, seek_set);
  i_write(mainfd, &apple, hstr_len);
  i_lseek(mainfd, -hstr_len, seek_end);
  i_read(mainfd, &apple, hstr_len);
  count = apple.count;
 
  return(0);
}
/* end:initialization */
 
/* start:message control */
int send_msg(struct msg *msg_recv, struct sockaddr *addr)
{
  int i;
  struct user usr;
 
  /* a common message come */
  printf("a ordinar message come !\n");
   
  i = msg_recv->id_to;
  i_lseek(user_list_fd, i*usr_len, seek_set);
  i_read(user_list_fd, &usr, usr_len);
  strncpy(msg_recv->append, usr.name, 10);
 
  i_sendto(sockfd, msg_recv, msg_len, 0,
    &(usr.user_addr), addr_len);
   
  printf("id%d send a message to id%d sucess!\n", msg_recv->id_from, msg_recv->id_to);
 
  return(0);
}
int check_login(struct msg *msg_recv, struct sockaddr *addr)
{
  int i = msg_recv->id_from;;
  struct user usr;
 
  /* a login requet */
  printf("a login request come!\n");
   
  /* get the id&#39;s information */
  i_lseek(user_list_fd, i*usr_len, seek_set);
  i_read(user_list_fd, &usr, usr_len);
 
  int n;
  n = strcmp(usr.password, msg_recv->content);
  /* 如果验证成功,则发送成功信息 */
  if (n == 0)
  {
    /* save user new address */
    i_lseek(user_list_fd, -usr_len, seek_cur);
    usr.user_addr = *addr;
    i_write(user_list_fd, &usr, usr_len);
    /* tell user pass */
    i_sendto(sockfd, (struct msg*)msg_recv, sizeof(struct msg), 0,
      &(usr.user_addr), addr_len);
     
  }
  else
  {
    /* 出错的话的respond */
    if (0 != n)
    {
      printf("id %d login error.\n", i);
      bzero(msg_recv->content, cntnt_len);     
      msg_recv->flag = -1;
      i_sendto(sockfd, (struct msg*)msg_recv, sizeof(struct msg), 0,
        &(usr.user_addr), addr_len);
     
    }
    return(1);
  }
  printf("id %d login sucess!\n", i); 
   
  return(0);
}
int reg_user(struct msg *msg_recv, struct sockaddr *addr)
{
  struct user usr;
   
  printf("a regit requet come:\n");
 
  /* find the last user and hava the please to add a new user */
  int n;
  i_lseek(user_list_fd, -usr_len, seek_end);
  i_read(user_list_fd, &usr, usr_len);
  /* 把新用户的信息赋值到usr然后填入到user list file中 */
  const char *name;
  const char *password;
 
  name = &(msg_recv->content[0]);
  password = &(msg_recv->content[10]);
  strcpy((usr.name), name);
  strcpy(usr.password, password);
  memcpy(&(usr.user_addr),addr, addr_len);
 
  usr.id = (usr.id + 1);
  i_lseek(user_list_fd, 0, seek_end);
  i_write(user_list_fd, &usr, usr_len);
 
  msg_recv->id_from = usr.id;
  /* regist to the user list then tell the user reg success */
  i_sendto(sockfd, (struct msg*)msg_recv, sizeof(struct msg), 0,
    addr, addr_len); 
 
  printf("id %d regist sucess!\n", usr.id);
 
  return(0);
   
}
int msg_cntl()
{
  struct msg msg_recv;
  struct sockaddr addr_recv;
 
  printf("begin listen input...\n");
  int size = addr_len;
 
  for (;;)
  {
    bzero(&msg_recv, msg_len);
    i_recvfrom(sockfd, &msg_recv, sizeof(struct msg), 0,
      &addr_recv, &size);
    printf("message received...\n");
 
    i_saveto_chat(&msg_recv);
 
    switch (msg_recv.flag)
    {
      case 1 :
        send_msg(&msg_recv,(struct sockaddr*)&addr_recv);/* send ordinary chat */
        break;
      case 2 :
        check_login(&msg_recv, (struct sockaddr*)&addr_recv);
        break;     
      case 3 :
        reg_user(&msg_recv, (struct sockaddr*)&addr_recv);
        break;
      default :
        break;
    }
  }
  return(0);
}
/* end:message control*/
/* start:exit_sys()*/
int exit_sys()
{
  close(sockfd);
  close(mainfd);
  close(user_list_fd);
  printf("exit system");
  kill(0, sigabrt);
 
  exit(0);
}
/* end:exit_sys()*/
 
/* start:chat_history*/
int get_page_size()
{
  struct chat_history page_size_reader;
   
  i_lseek(mainfd, -hstr_len, seek_end);
  i_read(mainfd, &page_size_reader, hstr_len);
 
  return(page_size_reader.count);
}
 
int read_chat_history()
{
  printf("****char*history***");
  printf("(n-nextpage; p-prepage; q-quit)\n");
 
  int page_num;/* */
  int remains;
  int berry = get_page_size();
 
 
  page_num = berry / 8;
  remains = berry % 8;
 
  if (remains != 0)
    page_num ++;
  else
    page_num = page_num;
     
  printf("there are %d page total %d items", 
    page_num, berry);
 
  int i = -1;
 
  while (1)
  {  
    char flag; 
 
    if ((berry + i*8) >= 0)
    {
      printf("(%d~%d)\n", (berry + i*8), (berry + (i+1)*8));
 
      i_print_history(prt_len, i);
 
      printf("@@@\n");
      while (&#39;\n&#39; == (flag = getchar()))
      {
      }
 
      switch (flag)
      {
        case &#39;p&#39; :
          i--;
          break;
        case &#39;n&#39; :
          i++;
          break;
        case &#39;q&#39; :
          return(0);
        default :
          break;
      }  
      if (i >= 0)
      {
        printf("have at the end!\n");
        printf("return to menu!\n");
      }    
    }
    else
    {
      printf("(1~%d)\n", remains);      
     
      i_print_history(remains, 0);
       
      printf("#########over##############\n");
 
      return(0);
    }  
  }
     
  return(0);
}
/* end:chat_history*/
/* start:menu*/
int menu()
{
  sleep(1);
 
  printf("----------help----menu---------\n");
  printf("\t r--report to user\n");
  printf("\t c--chat history\n");
  printf("\t h--help menu\n");
  printf("\t e--exit the system\n");
  printf("----------help_menu---------\n");
 
  int command = 0;
 
  printf("input command>");
  command = getchar();
  switch(command)
  {
 
    case &#39;c&#39;:
      read_chat_history();
      break;
    case &#39;e&#39;:
      exit_sys();
      break;
    case &#39;r&#39;:
      //report();
      //break;
    default :
      menu();
      break;
  }
  getchar();
   
  return(0);
}
/* end:menu*/
int main()
{
  init();
  pid_t pid;
  switch (pid = fork())
  {
    case -1 :
      perror("fork error\n");
      exit(1);
      break;
    case 0 :
      msg_cntl();
      break;
    default :
      menu();
      break;
  }
 
  return(0);
}
로그인 후 복사

代码三:

#include "i.h"
 
#define start_port 8089
 
struct sockaddr_in my_addr;
int my_id;
 
int my_log();/* declare funtion*/
 
/* */
int i_send_msg()
{    
  int id;
  struct msg the_msg;
  char end = &#39;@&#39;;
 
  printf("input recver id:");
  scanf("%d", &id);
  getchar();
  printf("\ninput content:");
  i_input(the_msg.content);  
 
  char flag = &#39;y&#39;;
     
  if (1)
  {
    the_msg.flag = 1;
    the_msg.id_from = my_id;
    the_msg.id_to = id;
     
    i_sendto(sockfd, &the_msg, sizeof(struct msg), 0,
      (struct sockaddr*)&server, sizeof(struct sockaddr));
     
    i_saveto_chat(&the_msg); /* save to history */
 
    printf("send to id:%d success.\n", my_id);
    return(0);
  }
  else
    return(1);
 
  return(0);
}
 
int reply()
{
  return(0);
}
int send_file()
{
  return(0);
}
/**/
/* start:initialize */
int init()
{  
  struct ifreq req;
  struct sockaddr_in *host;
  int port;
 
  i_init();
  /* init user addr */
  bzero(&my_addr, sizeof(struct sockaddr));
  my_addr.sin_family = af_inet;
  strcpy(req.ifr_name, "lo");
  if ( ioctl(sockfd, siocgifaddr, &req) < 0 ) /* get local ip address */
  {
    perror("get local ip error");
    exit(1);
    } 
 
  host = (struct sockaddr_in*)&(req.ifr_addr);
  printf("ip: %s\n", inet_ntoa(host->sin_addr));
 
  memcpy(&my_addr, (struct sockaddr_in*)&(req.ifr_addr),
     sizeof(struct sockaddr_in));
 
  port = start_port;
 
  do
  {
    port++;
    my_addr.sin_port = htons(port);
    bind(sockfd, (struct sockaddr*)&my_addr,
       sizeof(struct sockaddr));   
  } 
  while (errno == eaddrinuse);
 
  struct chat_history apple; 
   
  memset(&apple, &#39;b&#39;, hstr_len);
  i_lseek(mainfd, 0, seek_set);
  apple.count = 0;
  i_write(mainfd, &apple, hstr_len);
  i_lseek(mainfd, -hstr_len, seek_end);
  i_read(mainfd, &apple, hstr_len);
  count = apple.count;
 
  
  printf("port:%d\n", port); 
  printf("init successful!!!\n"); 
 
  return(0);
 
}
/* end:initialize */
/* start:chat_history*/
int get_page_size()
{
  struct chat_history page_size_reader;
   
  i_lseek(mainfd, -hstr_len, seek_end);
  i_read(mainfd, &page_size_reader, hstr_len);
 
  return(page_size_reader.count);
}
 
int read_chat_history()
{
  printf("****char*history***");
  printf("(n-nextpage; p-prepage; q-quit)\n");
 
  int page_num;/* */
  int remains;
  int berry = get_page_size();
 
 
  page_num = berry / 8;
  remains = berry % 8;
 
  if (remains != 0)
    page_num ++;
  else
    page_num = page_num;
     
  printf("there are %d page total %d items", 
    page_num, berry);
 
  int i = -1;
 
  while (1)
  {  
    char flag; 
 
    if ((berry + i*8) >= 0)
    {
      printf("(%d~%d)\n", (berry + i*8), (berry + (i+1)*8));
 
      i_print_history(prt_len, i);
 
      printf("@@@\n");
      while (&#39;\n&#39; == (flag = getchar()))
      {
      }
 
      switch (flag)
      {
        case &#39;p&#39; :
          i--;
          break;
        case &#39;n&#39; :
          i++;
          break;
        case &#39;q&#39; :
          return(0);
        default :
          break;
      }  
      if (i >= 0)
      {
        printf("have at the end!\n");
        printf("return to menu!\n");
      }    
    }
    else
    {
      printf("(1~%d)\n", remains);      
     
      i_print_history(remains, 0);
       
      printf("#########over##############\n");
 
      return(0);
    }  
  }
     
  return(0);
}
/* end:chat_history*/
/* start:exit_sys*/
void exit_sys()
{
  close(sockfd);
  close(mainfd);
  kill(0, sigabrt);
 
  exit(0);
}
/* end:exit_sys*/
 
/* start:menu*/
int print_menu()
{
  printf("\n--------------help--menu----------------\n");
  printf("\t h--help munu\n");
  printf("\t s--send message\n");
  printf("\t r--reply to\n");
  printf("\t c--chat history\n");
  printf("\t f--send files\n");
  printf("\t e--exit the system\n");
  printf("----------------help--menu----------------\n");
}
int get_input(char *command)
{  
  printf(">");
  scanf("%c", command);
 
  return(1);
}
int menu()
{
  /* to avoid the output at mixed with the sub process */
  sleep(1);
 
  print_menu();
   
  char command;
 
  while (1 == get_input(&command))
  {  
    switch(command)
    {
      case &#39;h&#39;:
        print_menu();
        break;   
      case &#39;s&#39;:
        i_send_msg();
        break;
      case &#39;r&#39;:
        reply();
        break;
      case &#39;f&#39;:
        send_file();
        break;
      case &#39;c&#39;:
        read_chat_history();
        break;
      case &#39;e&#39;:
        exit_sys();
        break;
      default :
        printf(">");
        break;
    }
  }
  return(0);
}
/* end:menu*/
/* start:message contol :send_msg and recv_msg */
int ordnary_msg_recv(struct msg *pmsg)
{
  char time_info[25];
  char end_symble;
  end_symble = &#39;&&#39;;
 
  /* handle the msg */
  printf("message:from %s(id%d) to u:\n", pmsg->append, pmsg->id_from);
  i_print(pmsg->content, msg_len);
  printf("\n\t%s", i_get_time());
 
  return(0);
}
int file_msg_recv(struct msg *pmsg)
{
}
int handle_msg(struct msg *pmsg)
{  
  if (pmsg->flag == 1)
  {
    ordnary_msg_recv(pmsg);
    return(0);
  }
  else if (pmsg->flag >= 4)
  {
    file_msg_recv(pmsg);
    return(0);
  }  
  return(0);
}
int listen_msg()
{
  struct msg msg_recv;
  struct sockaddr addr_recv;
  int len = addr_len;
 
  printf("begin listen...\n");
 
  for ( ; ; )
  {  
    i_recvfrom(sockfd, &msg_recv, msg_len, 0, 
       &addr_recv, &len);
 
    i_saveto_chat(&msg_recv); /* save to history */
     
     ordnary_msg_recv(&msg_recv);
  }
}
 
/* end:message contol*/
 
/* start:log process :login and regist */
int login()
{
  /* input id:*/
  printf("*****login>>\n");
  printf("id:");
  scanf("%d", &my_id);
  /* input password*/
  char password[15];
  printf("\npassword(*less 15 char):");
  scanf("%s", password);
  getchar();
   
  /* send login information */
  struct msg log_msg;
 
  bzero(&log_msg, msg_len);
  log_msg.flag = 2;
  log_msg.id_from = my_id;
  log_msg.id_to = 0;
  strncpy(log_msg.content, password, 15);
 
  i_saveto_chat(&log_msg); /* save to history */
   
  i_sendto(sockfd, (struct msg*)&log_msg, msg_len, 0, 
    (struct sockaddr*)&server, sizeof(struct sockaddr));
//printf("log_msg : %d\n", log_msg.id_from);
//printf("password: %s\n", log_msg.content);
  /* after input msg ,wait for server respond*/
  struct sockaddr in_addr;
  int len = addr_len;
  i_recvfrom(sockfd, (struct msg*)&log_msg, msg_len,0,
    &in_addr, &len);
  if (2 == log_msg.flag)
  {
    printf("login success\n");
    return(0);
  }  
  else
  {
    printf("login error:%s\n", log_msg.content);
    printf("please relog..\n");
    menu();
  }
   
  return (0);
}
int regist()
{
  printf("*****regist>>\n");
  /* input chat name */
  char name[10];
 
  bzero(name, 10);
  printf("input your chat name(less 8 char):");
  scanf("%s", name);
 
  //name[9] = &#39;;&#39;;     /* add a ; symbol in the end of name */
  /* input password */
  char password[15];
 
  bzero(password, 15);
  printf("\ninput your password(less 14 char):");
  scanf("%s", password);
 
  /* send regist information*/
  struct msg reg_msg;
 
  bzero(&reg_msg, msg_len);
  reg_msg.flag = 3;
  reg_msg.id_from = 0;
  reg_msg.id_to = 0;
  bzero(reg_msg.content, cntnt_len);
  strncpy(reg_msg.content, name, 10);
  strncpy(&(reg_msg.content[10]), password, 15);
  reg_msg.content[25] = &#39;\n&#39;;
 
  i_saveto_chat(&reg_msg); /* save to history */
 
  /* send regist informatin to server */
  i_sendto(sockfd, (struct msg*)&reg_msg, sizeof(struct msg), 0, 
    (struct sockaddr*)&server, addr_len);
  /* after input msg ,wait for server respond*/
  printf("wating for server reply...\n");
 
  struct sockaddr in_addr;
  struct msg msg_back;
  int len = addr_len;
   
  bzero(&in_addr, addr_len);
  bzero(&msg_back, msg_len);
  i_recvfrom(sockfd,(struct msg*)&msg_back, msg_len,0,
    &in_addr, &len);
 
  /* check whether pass */
  if (3 != msg_back.flag)
  {
    printf("error: %s \n", msg_back.content);
    exit(1);
  }
  else
    my_id = msg_back.id_to;
    printf("congratulate! you have regist"
      "id %s(id %d) success\n", msg_back.content, msg_back.id_to);
 
    login();
 
  return(0); 
}
 
int my_log()
{
  /* choose login or regist*/
  char flag;
  printf("are you want login or regist(l/r)\n");
  scanf("%c", &flag);
  getchar();
  switch (flag){
    case &#39;l&#39; :
      login();
      break;
    case &#39;r&#39; :
      regist();
      break;
    default :
      printf("error input\n");
      my_log();
      break;
  }
  return (0);
}
/* end:log */
 
int main()
{
  init();
  printf("\n************welcome!************\n");
  my_log();
 
  pid_t pid;
 
  switch (pid = fork())
  {
    case -1 :
      perror("fork error!\n");
      exit(1);
      break;
    case 0 :
      listen_msg();
      break;
    default :
      menu();
      break;
  }
}
로그인 후 복사

위 내용은 리눅스 채팅방 프로그램 구현 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Redis로 서버를 시작하는 방법 Redis로 서버를 시작하는 방법 Apr 10, 2025 pm 08:12 PM

Redis 서버를 시작하는 단계에는 다음이 포함됩니다. 운영 체제에 따라 Redis 설치. Redis-Server (Linux/MacOS) 또는 Redis-Server.exe (Windows)를 통해 Redis 서비스를 시작하십시오. Redis-Cli Ping (Linux/MacOS) 또는 Redis-Cli.exe Ping (Windows) 명령을 사용하여 서비스 상태를 확인하십시오. Redis-Cli, Python 또는 Node.js와 같은 Redis 클라이언트를 사용하여 서버에 액세스하십시오.

단일 스레드 레 디스를 사용하는 방법 단일 스레드 레 디스를 사용하는 방법 Apr 10, 2025 pm 07:12 PM

Redis는 단일 스레드 아키텍처를 사용하여 고성능, 단순성 및 일관성을 제공합니다. 동시성을 향상시키기 위해 I/O 멀티플렉싱, 이벤트 루프, 비 블로킹 I/O 및 공유 메모리를 사용하지만 동시성 제한 제한, 단일 고장 지점 및 쓰기 집약적 인 워크로드에 부적합한 제한이 있습니다.

Linux의 5 기둥 : 역할 이해 Linux의 5 기둥 : 역할 이해 Apr 11, 2025 am 12:07 AM

Linux 시스템의 5 개의 기둥은 다음과 같습니다. 1. Kernel, 2. System Library, 3. Shell, 4. 파일 시스템, 5. 시스템 도구. 커널은 하드웨어 리소스를 관리하고 기본 서비스를 제공합니다. 시스템 라이브러리는 애플리케이션에 대한 사전 컴파일 된 기능을 제공합니다. 쉘은 사용자가 시스템과 상호 작용할 수있는 인터페이스입니다. 파일 시스템은 데이터를 구성하고 저장합니다. 시스템 도구는 시스템 관리 및 유지 보수에 사용됩니다.

Redis Restart 서비스는 어디에 있습니까? Redis Restart 서비스는 어디에 있습니까? Apr 10, 2025 pm 02:36 PM

다른 운영 체제에서 REDIS 서비스를 다시 시작하는 방법 : Linux/MacOS : SystemCTL 명령 (SystemCTL REDIS-SERVER 재시작) 또는 서비스 명령 (Service Redis-Server Restart)을 사용하십시오. Windows : Services.msc 도구를 사용하고 (실행 대화 상자에서 "services.msc"를 입력하고 Enter를 누르십시오) "redis"서비스를 마우스 오른쪽 단추로 클릭하고 "다시 시작"을 선택하십시오.

Oracle의 인스턴스 이름을 보는 방법 Oracle의 인스턴스 이름을 보는 방법 Apr 11, 2025 pm 08:18 PM

Oracle에서 인스턴스 이름을 보는 세 가지 방법이 있습니다. 명령 줄에 명령. "show instance_name"을 사용하십시오. sql*plus의 명령. 운영 체제의 작업 관리자, Oracle Enterprise Manager 또는 운영 체제를 통해 환경 변수 (Linux의 Oracle_Sid)를 확인하십시오.

Linux는 실제로 좋은 것은 무엇입니까? Linux는 실제로 좋은 것은 무엇입니까? Apr 12, 2025 am 12:20 AM

Linux는 서버, 개발 환경 및 임베디드 시스템에 적합합니다. 1. 서버 운영 체제로서 Linux는 안정적이고 효율적이며 종종 고 대전성 애플리케이션을 배포하는 데 사용됩니다. 2. 개발 환경으로서 Linux는 효율적인 명령 줄 도구 및 패키지 관리 시스템을 제공하여 개발 효율성을 향상시킵니다. 3. 임베디드 시스템에서 Linux는 가볍고 사용자 정의 가능하며 자원이 제한된 환경에 적합합니다.

Redis가 성공적으로 시작하는지 확인하는 방법 Redis가 성공적으로 시작하는지 확인하는 방법 Apr 10, 2025 pm 06:42 PM

Redis가 성공적으로 시작되었는지 확인하는 방법 : 터미널 명령을 통해 프로세스 상태를 확인하십시오 : Linux/UNIX : PS -EF | grep redis : ps aux | grep redis는 redis 클라이언트 도구와 ping을 통해 연결됩니다 : redis-cli ping access redis 웹 인터페이스 : http : // [redis instance ip] : 6379/info

Redis로 Linux를 시작하는 방법 Redis로 Linux를 시작하는 방법 Apr 10, 2025 pm 08:00 PM

Linux 시스템에서 Redis를 시작하려면 Redis 패키지를 설치하십시오. Redis 서비스를 활성화하고 시작하십시오. Redis가 실행 중인지 확인하십시오. Redis 서버에 연결하십시오. 고급 옵션 : Redis 서버를 구성합니다. 비밀번호를 설정하십시오. Systemd 단위 파일을 사용하십시오.

See all articles