view cbcecho/echoserver_cbc.cbc @ 9:493c96d030c0

add pyrect
author nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
date Tue, 14 Jun 2011 17:24:03 +0900
parents 515c780e1c13
children
line wrap: on
line source

#include <stdio.h>
#include <stdlib.h>     /* exit() */
#include <string.h>     /* bzero() */
#include <sys/types.h>
#include <sys/socket.h> /* socket(), bind(), listen(), accept(), recv() */
#include <netinet/in.h> /* htons() */
#include <unistd.h>
#include <pthread.h>

#define PORT    8888    /* Listenするポート */
#define MAXDATA 1024    /* 受信バッファサイズ */


//__code echoaccept(int listen_fd, struct sockaddr *caddr, socklen_t *len );
__code echoaccept(int listen_fd, void *caddr, void *len );
//__code echoread(void *ptr);
void *echoread(void *ptr);
__code conref();
__code confail();
__code echowrite(int conn_fd, char *buf, int rsize);


void main()
{
  struct sockaddr_in saddr; /* サーバ用アドレス格納構造体 */
  struct sockaddr_in caddr; /* クライアント用アドレス格納構造体 */
  
  int listen_fd;
  int conn_fd;
  
  //int len = sizeof(struct sockaddr_in);
  socklen_t len = sizeof(struct sockaddr_in);
  
  int rsize;
  char buf[MAXDATA]; /* 受信バッファ */
  
  /* ソケットの生成 */
  if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    perror("socket");
    exit(EXIT_FAILURE);
  }
  
  /*
   * saddrの中身を0にしておかないと、bind()でエラーが起こることがある
   */
  bzero((char *)&saddr, sizeof(saddr));
  
  /* ソケットにアドレスとポートを結びつける */
  saddr.sin_family        = PF_INET;
  saddr.sin_addr.s_addr   = INADDR_ANY;
  saddr.sin_port          = htons(PORT);
  if (bind(listen_fd, (struct sockaddr *)&saddr, len) < 0) {
    perror("bind");
    exit(EXIT_FAILURE);
  }
  
  /* ポートをListenする */
  if (listen(listen_fd, SOMAXCONN) < 0) {
    perror("listen");
    exit(EXIT_FAILURE);
  }
  printf("Start Listening Port : %d...\n", PORT);

  //  goto echoread((void *)&conn_fd);
  goto echoaccept(listen_fd, (void *)&caddr, (void *)&len);
}


//__code echoaccept(int listen_fd, struct sockaddr *caddr, socklen_t *len )
__code echoaccept(int listen_fd, void *caddr, void *len )
{
  int conn_fd;
  if((conn_fd = accept(listen_fd, (struct sockaddr *)caddr, (socklen_t *)len)) < 0){
    perror("accept");
    exit(EXIT_FAILURE);
  }else{
    pthread_t thread;
    pthread_create( &thread, NULL, (void *)echoread, (void *)&conn_fd);
    goto echoaccept(listen_fd, caddr, len);
  }
}


//__code echoread(void *ptr)
void *echoread(void *ptr)
{
  int conn_fd = *(int*)ptr;
  char buf[MAXDATA]; /* 受信バッファ */
  int rsize;
 
  rsize = recv(conn_fd, buf, MAXDATA, 0);

  if(rsize == 0 ){/* if connection refused */
    goto conref();
  }else if(rsize == -1){
    goto confail();
  }else{
    goto echowrite(conn_fd, buf, rsize);
  }

}

__code conref()
{
  printf("connection refused");
  pthread_cancel(pthread_self());
}

__code confail()
{
    perror("recv");
    exit(EXIT_FAILURE);
}

__code echowrite(int conn_fd, char *buf, int rsize)
{
  write(conn_fd, buf, rsize);
  goto echoread((void *)&conn_fd);
}