Mercurial > hg > Gears > Gears
changeset 993:762bd4cea38b
add socket_test
author | ichikitakahiro <e165713@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 03 Dec 2021 21:07:30 +0900 |
parents | a7d1288cf58e |
children | bb9cc6115890 |
files | src/parallel_execution/examples/socket_test/Server.h src/parallel_execution/examples/socket_test/ServerImpl.cbc src/parallel_execution/examples/socket_test/ServerImpl.h src/parallel_execution/examples/socket_test/socket_test.cbc |
diffstat | 4 files changed, 157 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/parallel_execution/examples/socket_test/Server.h Fri Dec 03 21:07:30 2021 +0900 @@ -0,0 +1,7 @@ +typedef struct Server <>{ + union Data* server; + __code getData(Impl* server, __code next(...)); + __code putData(Impl* server, __code next(...)); + __code acceptConnect(Impl* server, __code next(...)); + __code next(...); +} Server;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/parallel_execution/examples/socket_test/ServerImpl.cbc Fri Dec 03 21:07:30 2021 +0900 @@ -0,0 +1,120 @@ +#include "../../../context.h" +#interface "Server.h" +#impl "Server.h" as "ServerImpl.h" + + +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +#define SERVER_ADDR "127.0.0.1" +#define SERVER_PORT 8080 +#define BUF_SIZE 1024 + + +Server* createServerImpl(struct Context* context) { + struct Server* server = new Server(); + struct ServerImpl* server_impl = new ServerImpl(); + server->server = (union Data*)server_impl; + + server_impl->w_sock = createSocket(); + server_impl->c_sock = NULL; + server->getData = C_getDataServerImpl; + server->putData = C_putDataServerImpl; + server->acceptConnect = C_acceptConnectServerImpl; + return server; +} + +int* createSocket(){ + int w_addr, c_sock; + struct sockaddr_in a_addr; + + struct in_addr { + u_int32_t s_addr; + }; + + w_addr = socket(AF_INET, SOCK_STREAM, 0); + if (w_addr == -1) { + printf("socket error\n"); + return -1; + } + + memset(&a_addr, 0, sizeof(struct sockaddr_in)); + + a_addr.sin_family = AF_INET; + a_addr.sin_port = htons((unsigned short)SERVER_PORT); + a_addr.sin_addr.s_addr = inet_addr(SERVER_ADDR); + + if (bind(w_addr, (const struct sockaddr *)&a_addr, sizeof(a_addr)) == -1) { + printf("bind error\n"); + close(w_addr); + return -1; + } + + if (listen(w_addr, 3) == -1) { + printf("listen error\n"); + close(w_addr); + return -1; + } + return w_addr; +} + +__code getData(struct ServerImpl* server, __code next(...)) { + int recv_size, send_size; + char recv_buf[BUF_SIZE], send_buf; + + /* クライアントから文字列を受信 */ + recv_size = recv(server->c_sock, recv_buf, BUF_SIZE, 0); + if (recv_size == -1) { + printf("recv error\n"); + } + if (recv_size == 0) { + /* 受信サイズが0の場合は相手が接続閉じていると判断 */ + printf("connection ended\n"); + } + + /* 受信した文字列を表示 */ + printf("%s\n", recv_buf); + + /**/ + /* 文字列が"finish"ならクライアントとの接続終了 */ + if (strcmp(recv_buf, "finish") == 0) { + + /* 接続終了を表す0を送信 */ + send_buf = 0; + send_size = send(server->c_sock, &send_buf, 1, 0); + if (send_size == -1) { + printf("send error\n"); + } + } else { + /* "finish"以外の場合はクライアントとの接続を継続 */ + send_buf = 1; + send_size = send(server->c_sock, &send_buf, 1, 0); + if (send_size == -1) { + printf("send error\n"); + } + } + goto getData(); +} + +__code putData(struct ServerImpl* server, __code next(...)) { + goto next(...); +} + +__code acceptConnect(struct ServerImpl* server, __code next(...)){ + printf("Waiting connect...\n"); + server->c_sock = accept(server->w_sock, NULL, NULL); + if (server->c_sock == -1) { + printf("accept error\n"); + close(server->w_sock); + return -1; + } + printf("Connected!!\n"); + + goto getData(); +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/parallel_execution/examples/socket_test/ServerImpl.h Fri Dec 03 21:07:30 2021 +0900 @@ -0,0 +1,5 @@ +typedef struct ServerImpl <> impl Server{ + int* w_sock; + int* c_sock; + +} ServerImpl;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/parallel_execution/examples/socket_test/socket_test.cbc Fri Dec 03 21:07:30 2021 +0900 @@ -0,0 +1,25 @@ +#include "../../../context.h" +#interface "Server.h" + +__code Task1(Server* server){ + goto server->acceptConnect(Task2); +} + +__code Task1_stub(struct Context* context){ + Server* server = createServerImpl(context); + goto Task1(context, server); +} + +__code Task2(Server* server){ + printf("task2"); +} + +__code Task2_stub(struct Context* context){ + Server* server = (struct Server*)Gearef(context, Server)->server; + goto Task2(context, server); +} + +int main(int argc, char** argv) { + printf("main\n"); + goto Task1(); +}