亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

C語言

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

時間:2024-09-04 21:19:33 C語言 我要投稿
  • 相關(guān)推薦

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語言編程-標準步驟(改進版)】相關(guān)文章:

C語言編程基礎(chǔ)08-17

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

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

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

C語言socket編程使用方法06-20

標準c語言筆試題09-07

C語言編程常犯錯誤小結(jié)10-11

講解C語言編程中的結(jié)構(gòu)體對齊09-14

C語言高效編程的4個小技巧10-27

C語言socket編程使用方法簡介07-29