Mercurial > hg > Members > nobuyasu > test
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); }