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();
+}