050923ServerFlame

 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
 #include <netdb.h>
 #include <string.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/time.h>
 #include <unistd.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <sys/event.h>

 #define BUF_LEN 65536

 int
 new_accept(int sock){
  int len;
  int new_socket;
  struct sockaddr_in peer_sin;

  len = sizeof(peer_sin);
  new_socket = accept(sock, (struct sockaddr*)&peer_sin, &len);
  if ( new_socket == -1 ){
  perror("accept");
  exit(1);
  }
  return new_socket;
 }

 void
 read_sock(int sock){
  int read_size;
  int ret;
  char buf[BUF_LEN];

  /* recvよりreadの方が早い?
  read_size =recv(sock, buf , BUF_LEN, 0);
  */
  read_size = read(sock, buf, sizeof(buf)-1);

  if ( read_size == -1 ){
  perror("read");
  } else if ( read_size == 0 ){
  ret = close(sock);
  if ( ret == -1 ){
  perror("close");
  exit(1);
  }
  } else {
  if (buf[0] == 'w') {
  /* 書き込み処理 */

  }
  else if(buf[0] == 'r') {
  /* 読み込み処理 */
  }
  else {
  /* エラーの予感 */
  }
 // write(sock, buf, read_size);
  }
 }

 int

 main(){
  int sock_optval = 1;
  int ret;
  int port = 10080;
  int listening_socket;
  struct sockaddr_in sin;
  int kev_regist_num;
  int kq;
  struct kevent kev[100];

  int listening_socket = socket(AF_INET, SOCK_STREAM, 0);
  if ( setsockopt(listening_socket, SOL_SOCKET, SO_REUSEADDR,
  &sock_optval, sizeof(sock_optval)) == -1 ){
  perror("setsockopt");
  exit(1);
  }
  sin.sin_family = AF_INET;
  sin.sin_port = htons(port);
  sin.sin_addr.s_addr = htonl(INADDR_ANY);

  ret = bind(listening_socket, (struct sockaddr *)&sin, sizeof(sin));
  if ( ret == -1 ){
  perror("bind");
  exit(1);
  }
  ret = listen(listening_socket, SOMAXCONN);
  if ( ret == -1 ){
  perror("listen");
  exit(1);
  }
 
  kq = kqueue();
  if ( kq == -1 ){
  perror("kqueue");
  exit(1);
  }
  EV_SET(&kev[0], listening_socket, EVFILT_READ,EV_ADD, 0, 0, NULL);
  ret = kevent(kq, &kev[0], 1, NULL, 0, NULL);
  if ( ret == -1 ){
  perror("kevent");
  exit(1);
  }
  kev_regist_num=1;

  /* main */
  while (1){
  int n;
  struct timespec waitspec;
  waitspec.tv_sec = 2;
  waitspec.tv_nsec = 500000;

  n = kevent(kq, kev, kev_regist_num, kev, sizeof(kev)/sizeof(kev[0]), &waitspec);
  if ( n == -1 ){
  perror("kevent");
  exit(1);
  } else if ( n > 0 ){
  kev_regist_num=0;
  for ( int i=0 ; i<n ; i++ ){
  int sock = kev[i].ident;
  if ( sock == listening_socket ){
  /* 新しいClient*/
  int new_sock = new_accept(sock);
  if ( new_sock != -1 ){
EV_SET(&kev[kev_regist_num++], new_sock, EVFILT_READ,  EV_ADD, 0, 0, NULL);
  new_client++;
  }
  } else {
  /* ソケット読み込み */
  read_sock(sock);
  }
  }
  if (kev_regist_num != 0) {
  n = kevent(kq, kev, kev_regist_num,  NULL, 0, NULL);
  if ( n == -1 ){
  perror("kevent");
  exit(1);
  }
  }
  }
  }
 
  close(listening_socket);
  return 0;
 }
2005年09月26日(月) 00:56:09 Modified by chin2shu3




スマートフォン版で見る