<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. C語言

    c語言編程-標準步驟(改進版)

    時間:2025-03-31 10:15:43 C語言 我要投稿
    • 相關推薦

    c語言編程-標準步驟(改進版)

      server.c

      復制代碼 代碼如下:

      #include

      #include

      #include

      #include

      #include

      #include

      #include

      #include

      #include

      #include

      #include

      #define PORT 4444

      #define BACKLOG 5

      #define MAX_FD 256

      void setnonblocking(int);

      int main(int argc, char *argv[]) {

      int sock_fd, new_fd, new_fd2, epfd, nfds;

      struct sockaddr_in server_addr, client_addr;

      int sin_size;

      int nbytes;

      int on = 1;

      char buffer[1024];

      struct epoll_event ev, events[20];

      epfd = epoll_create(MAX_FD);

      if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

      perror("socket");

      exit(1);

      }

      setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

      setnonblocking(sock_fd);

      ev.data.fd = sock_fd;

      ev.events = EPOLLIN | EPOLLET;

      epoll_ctl(epfd, EPOLL_CTL_ADD, sock_fd, &ev);

      memset(&server_addr, 0, sizeof(struct sockaddr_in));

      server_addr.sin_family = AF_INET;

      server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

      server_addr.sin_port = htons(PORT);

      if (bind(sock_fd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1) {

      perror("bind");

      exit(1);

      }

      if (listen(sock_fd, BACKLOG) == -1) {

      perror("listen");

      exit(1);

      }

      printf("Server start... n");

      sin_size = sizeof(struct sockaddr_in);

      int i;

      while (1) {

      nfds = epoll_wait(epfd, events, 20, 500);

      for (i = 0; i < nfds; i++) {

      if (events[i].data.fd == sock_fd) {

      if ((new_fd = accept(sock_fd, (struct sockaddr *)(&client_addr), &sin_size)) == -1) {

      perror("accept");

      exit(1);

      }

      printf("Server get connection from %sn", inet_ntoa(client_addr.sin_addr));

      setnonblocking(new_fd);

      ev.data.fd = new_fd;

      ev.events = EPOLLIN | EPOLLET;

      epoll_ctl(epfd, EPOLL_CTL_ADD, new_fd, &ev);

      } else if (events[i].events & EPOLLIN) {

      if ((new_fd2 = events[i].data.fd) < 0) continue;

      if ((nbytes = read(new_fd2, buffer, 1024)) == -1) {

      perror("read");

      exit(1);

      } else if (nbytes == 0) {

      close(new_fd2);

      events[i].data.fd = -1;

      }

      printf("Server read from %sn", inet_ntoa(client_addr.sin_addr));

      ev.data.fd = new_fd2;

      ev.events = EPOLLOUT | EPOLLET;

      epoll_ctl(epfd, EPOLL_CTL_MOD, new_fd2, &ev);

      } else if (events[i].events & EPOLLOUT) {

      new_fd2 = events[i].data.fd;

      write(new_fd2, "Server Received", 16);

      ev.data.fd = new_fd2;

      ev.events = EPOLLIN | EPOLLET;

      epoll_ctl(epfd, EPOLL_CTL_MOD, new_fd2, &ev);

      }

      }

      }

      return 0;

      }

      void setnonblocking(int fd) {

      int opts;

      if ((opts = fcntl(fd, F_GETFL)) < 0) {

      perror("fcntl(fd, F_GETFL");

      exit(1);

      }

      opts = opts | O_NONBLOCK;

      if (fcntl(fd, F_SETFL, opts) < 0) {

      perror("fcntl(fd, F_SETFL, opts");

      exit(1);

      }

      }

      client.c

      復制代碼 代碼如下:

      #include

      #include

      #include

      #include

      #include

      #include

      #include

      #define PORT 4444

      int main(int argc, char *argv[]) {

      int sock_fd;

      struct sockaddr_in server_addr;

      struct hostent *host;

      char buffer[1024];

      if (argc < 2) {

      perror("Need hostname");

      exit(1);

      }

      if ((host = gethostbyname(argv[1])) == NULL) {

      perror("gethostbyname");

      exit(1);

      }

      if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

      perror("socket");

      exit(1);

      }

      memset(&server_addr, 0, sizeof(struct sockaddr_in));

      server_addr.sin_family = AF_INET;

      server_addr.sin_port = htons(PORT);

      server_addr.sin_addr = *((struct in_addr *)host->h_addr);

      if (connect(sock_fd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1) {

      perror("connect");

      exit(1);

      }

      while (1) {

      printf("Please input something:n");

      fgets(buffer, 1024, stdin);

      write(sock_fd, buffer, strlen(buffer));

      read(sock_fd, buffer, 1024);

      printf("From server: %sn", buffer);

      }

      close(sock_fd);

      return 0;

      }

    【c語言編程-標準步驟(改進版)】相關文章:

    C編程語言概述10-20

    C語言編程基礎08-17

    C語言入門什么是編程語言10-12

    怎樣學習c++c語言編程10-26

    C語言高效編程的方法06-26

    如何學習C語言編程10-28

    C語言高效編程的幾招09-23

    C語言socket編程的方法10-07

    怎么學習C語言編程07-30

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人