C语言 百分网手机站

c语言编程-标准步骤(改进版)

时间:2020-11-18 13:20:57 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语言编程-标准步骤(改进版)】相关文章:

1.如何学好C语言编程

2.怎么学习C语言编程

3.怎样学习c++c语言编程

4.C语言入门什么是编程语言

5.C语言高效编程的方法

6.c语言编程软件有哪些

7.C语言socket编程开发应用示例

8.标准c语言笔试题