# HG changeset patch # User nobuyasu # Date 1307384199 -32400 # Node ID 515c780e1c13c24bf0e47039eca36d2a85777bcb # Parent 6b57e23a26cbaa5e833a4bce1c20aa4f0f6be73e upload echoserver_cbc.cbc diff -r 6b57e23a26cb -r 515c780e1c13 cbcecho/a.out Binary file cbcecho/a.out has changed diff -r 6b57e23a26cb -r 515c780e1c13 cbcecho/detach_test.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbcecho/detach_test.c Tue Jun 07 03:16:39 2011 +0900 @@ -0,0 +1,39 @@ +#include +#include +#include +#include + +void *detach_test(void *ptr) +{ + char *message = (char*)ptr; + printf("%s Start\n",message); + pthread_t self_thread = pthread_self(); + + int status = pthread_detach(self_thread); + + printf("sleep: start\n"); + sleep(5); + printf("sleep: end\n"); +} + + +int main(void) +{ + printf("main: start\n"); + + pthread_t thread1; + char *message1 = "Thread1"; + int iret1; + + printf("pthread_creat()\n"); + iret1 = pthread_create( &thread1, NULL, detach_test, (void*)message1); + + + printf("pthread_join\n"); + + pthread_join(thread1, NULL); + + printf("main: end\n"); + + return 0; +} diff -r 6b57e23a26cb -r 515c780e1c13 cbcecho/detach_test.c~ --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbcecho/detach_test.c~ Tue Jun 07 03:16:39 2011 +0900 @@ -0,0 +1,13 @@ +#include +#include + + + +void *detach_test(void) +{ + printf("detack_test: start"); + sleep(5); + printf("detack_test: end"); +} + + diff -r 6b57e23a26cb -r 515c780e1c13 cbcecho/echoserver.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbcecho/echoserver.c Tue Jun 07 03:16:39 2011 +0900 @@ -0,0 +1,84 @@ +#include +#include ; /* exit() */ +#include ; /* bzero() */ +#include ; +#include ; /* socket(), bind(), listen(), accept(), recv() */ +#include ; /* htons() */ +#include ; + +#define PORT 8080 /* Listenするポート */ +#define MAXDATA 1024 /* 受信バッファサイズ */ + +int 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); + + /* 接続要求を受け付ける */ + if ((conn_fd = accept(listen_fd, (struct sockaddr *)&caddr, &len)) < 0) { + perror("accept"); + exit(EXIT_FAILURE); + } + + /* Listeningソケットを閉じる */ + close(listen_fd); + + /* 送信されたデータの読み出し */ + do { + rsize = recv(conn_fd, buf, MAXDATA, 0); + + if (rsize == 0) { /* クラアイントが接続を切ったとき */ + break; + } else if (rsize == -1) { + perror("recv"); + exit(EXIT_FAILURE); + } else { + write(conn_fd, buf, rsize); + } + } while (1); + + if ( close(conn_fd) < 0) { + perror("close"); + exit(EXIT_FAILURE); + } + + printf("Connection closed.\n"); + return 0; + +} + diff -r 6b57e23a26cb -r 515c780e1c13 cbcecho/echoserver_cbc.cbc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbcecho/echoserver_cbc.cbc Tue Jun 07 03:16:39 2011 +0900 @@ -0,0 +1,129 @@ +#include +#include /* exit() */ +#include /* bzero() */ +#include +#include /* socket(), bind(), listen(), accept(), recv() */ +#include /* htons() */ +#include +#include + +#define PORT 8080 /* 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); + + + /* 接続要求を受け付ける */ + /* + if ((conn_fd = accept(listen_fd, (struct sockaddr *)&caddr, &len)) < 0) { + perror("accept"); + exit(EXIT_FAILURE); + } + */ + + // 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) +//__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"); + exit(0); +} + +__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); +} diff -r 6b57e23a26cb -r 515c780e1c13 cbcecho/echoserver_cbc.cbc~ --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbcecho/echoserver_cbc.cbc~ Tue Jun 07 03:16:39 2011 +0900 @@ -0,0 +1,140 @@ +#include +#include /* exit() */ +#include /* bzero() */ +#include +#include /* socket(), bind(), listen(), accept(), recv() */ +#include /* htons() */ +#include +#include + +#define PORT 8080 /* 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); + + + /* 接続要求を受け付ける */ + /* + if ((conn_fd = accept(listen_fd, (struct sockaddr *)&caddr, &len)) < 0) { + perror("accept"); + exit(EXIT_FAILURE); + } + */ + + // printf("conn_fd = %d\n",conn_fd); + // printf("conn_fd.p = %p\n",&conn_fd); + + // goto echoread((void *)&conn_fd); + + // pthread_t thread; + // pthread_create( &thread, NULL, (void *)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, echoread, (void *)&conn_fd); + printf("sleep(5)\n"); + goto echoaccept(listen_fd, caddr, len); + } +} + + +//__code echoread(int conn_fd) +//__code echoread(void *ptr) +void *echoread(void *ptr) +{ + printf("in echoread()"); + + int conn_fd = *(int*)ptr; + char buf[MAXDATA]; /* 受信バッファ */ + int rsize; + + printf("conn_fd = %d\n",conn_fd); + + 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"); + exit(0); +} + +__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); +}