changeset 1012:a4e57a764cac

sending struct
author ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
date Fri, 14 Jan 2022 03:33:29 +0900
parents ea620dff804c
children 9ca9c36a4633
files src/parallel_execution/examples/socketQueue/LocalDGMQueue.cbc src/parallel_execution/examples/socketQueue/Local_test.cbc src/parallel_execution/examples/socketQueue/RemoteDGMQueue.cbc src/parallel_execution/examples/socketQueue/Remote_test.cbc
diffstat 4 files changed, 39 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/examples/socketQueue/LocalDGMQueue.cbc	Thu Jan 13 23:05:41 2022 +0900
+++ b/src/parallel_execution/examples/socketQueue/LocalDGMQueue.cbc	Fri Jan 14 03:33:29 2022 +0900
@@ -18,14 +18,14 @@
  * Non-blocking queue of Paper: Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms(https://www.research.ibm.com/people/m/michael/podc-1996.pdf).
  */
 
-TQueue* createLocalDGMQueue(struct Context* context) {
+TQueue* createLocalDGMQueue(struct Context* context, char* sNum) {
     struct TQueue* tQueue = new TQueue();
     struct LocalDGMQueue* LocalDGMQueue = new LocalDGMQueue();
     LocalDGMQueue->top = new Element(); // allocate a free node
     LocalDGMQueue->top->next = NULL;
     LocalDGMQueue->last = LocalDGMQueue->top;
     LocalDGMQueue->atomic = createAtomicReference(context);
-    LocalDGMQueue->socket = createSocket(); 
+    LocalDGMQueue->socket = createSocket(sNum); 
 
     tQueue->tQueue = (union Data*)LocalDGMQueue;
     tQueue->take  = C_takeLocalDGMQueue;
@@ -36,11 +36,11 @@
     return tQueue;
 }
 
-int* createSocket(){
+int* createSocket(char* sNum){
     int w_addr, c_sock;
     struct sockaddr_in a_addr;
     char *hostname = "Localhost";
-    char *service = "8080";
+    char *service = sNum;
     struct addrinfo hints, *res0, *res;
     int err;
 
@@ -182,7 +182,9 @@
     char recv_buf[BUF_SIZE], send_buf;
 
     /* クライアントから文字列を受信 */
-    recv_size = recv(tQueue->socket, recv_buf, BUF_SIZE, 0);
+    FileString* fileString = NEW(FileString);
+    recv(tQueue->socket, fileString, sizeof(struct FileString), 0);
+    printf("[%s] [%d]\n", fileString->str, fileString->size);
     if (recv_size == -1) {
         printf("recv error\n");
         goto exit_code();
@@ -193,12 +195,10 @@
     }
         
     /* 受信した文字列を表示 */
-    printf("%s\n", recv_buf);
 
 
-    /**/
     /* 文字列が"finish"ならクライアントとの接続終了 */
-    if (strcmp(recv_buf, "finish") == 0) {
+    if (strcmp(fileString->str, "finish") == 0) {
         /* 接続終了を表す0を送信 */
         send_buf = 0;
         send_size = send(tQueue->socket, &send_buf, 1, 0);
@@ -216,11 +216,9 @@
         }
     }
 
-    FileString* string = NEW(FileString);
-    memcpy(string->str, recv_buf, sizeof(string->str));
-    Gearef(context, TQueue)->data = string;
-
-    goto putLocalDGMQueue(string, next);
+    Gearef(context, TQueue)->data = fileString;
+    
+    goto putLocalDGMQueue(fileString, next);
 }
 
 __code sendData(struct RemoteDGMQueue* tQueue, struct FileString* string, __code next(...)){
--- a/src/parallel_execution/examples/socketQueue/Local_test.cbc	Thu Jan 13 23:05:41 2022 +0900
+++ b/src/parallel_execution/examples/socketQueue/Local_test.cbc	Fri Jan 14 03:33:29 2022 +0900
@@ -12,7 +12,7 @@
 }
 
 __code Task1_stub(struct Context* context){
-    TQueue* localDGMQueue = createLocalDGMQueue(context);
+    TQueue* localDGMQueue = createLocalDGMQueue(context, service_num);
     goto Task1(context, localDGMQueue);
 }
 
@@ -27,8 +27,7 @@
 
 
 __code Task3(TQueue* localDGMQueue, FileString* string){
-    printf("take[%s]\n", string->str);
-    printf("num = %d\n", string->size);
+    printf("take[%s] [num:%d]\n", string->str, string->size);
     goto localDGMQueue->isEmpty(noEmp, whenEmp);
 }
 
@@ -57,5 +56,9 @@
 
 int main(int argc, char** argv) {
     printf("main\n");
+    init(argc, argv);
+    if (service_num == NULL){
+        service_num = "8080";
+    }
     goto Task1();
 }
--- a/src/parallel_execution/examples/socketQueue/RemoteDGMQueue.cbc	Thu Jan 13 23:05:41 2022 +0900
+++ b/src/parallel_execution/examples/socketQueue/RemoteDGMQueue.cbc	Fri Jan 14 03:33:29 2022 +0900
@@ -18,14 +18,14 @@
  * Non-blocking queue of Paper: Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms(https://www.research.ibm.com/people/m/michael/podc-1996.pdf).
  */
 
-TQueue* createRemoteDGMQueue(struct Context* context) {
+TQueue* createRemoteDGMQueue(struct Context* context, char* sNum) {
     struct TQueue* tQueue = new TQueue();
     struct RemoteDGMQueue* RemoteDGMQueue = new RemoteDGMQueue();
     RemoteDGMQueue->top = new Element(); // allocate a free node
     RemoteDGMQueue->top->next = NULL;
     RemoteDGMQueue->last = RemoteDGMQueue->top;
     RemoteDGMQueue->atomic = createAtomicReference(context);
-    RemoteDGMQueue->socket = createSocket(); 
+    RemoteDGMQueue->socket = createSocket(sNum); 
 
     tQueue->tQueue = (union Data*)RemoteDGMQueue;
     tQueue->take  = C_takeRemoteDGMQueue;
@@ -36,11 +36,11 @@
     return tQueue;
 }
 
-int* createSocket(){
+int* createSocket(char *sNum){
     int sock;
     struct sockaddr_in a_addr;
     char *hostname = "localhost";
-    char *service = "8080";
+    char *service = sNum;
     struct addrinfo hints, *res0, *res;
     int err;
 
@@ -170,7 +170,7 @@
     memcpy(send_buf, string->str, sizeof(send_buf));
 
     /* 文字列を送信 */
-    send_size = send(tQueue->socket, send_buf, strlen(send_buf) + 1, 0);
+    send_size = send(tQueue->socket, string, sizeof(struct FileString), 0);
     if (send_size == -1) {
         printf("send error\n");
         close(tQueue->socket);
--- a/src/parallel_execution/examples/socketQueue/Remote_test.cbc	Thu Jan 13 23:05:41 2022 +0900
+++ b/src/parallel_execution/examples/socketQueue/Remote_test.cbc	Fri Jan 14 03:33:29 2022 +0900
@@ -3,16 +3,18 @@
 #interface "Integer.h"
 #interface "FileString.h"
 #interface "DataTransfer.h"
+char* service_num;
 
 __code Task1(TQueue* remoteDGMQueue){ 
     FileString* string = NEW(FileString);
     char word[1024] = "first";
     memcpy(string->str, word, strlen(word));
+    string->size = 456;
     goto remoteDGMQueue->put(string, Task2); 
 }
 
 __code Task1_stub(struct Context* context){
-    TQueue* remoteDGMQueue = createRemoteDGMQueue(context);
+    TQueue* remoteDGMQueue = createRemoteDGMQueue(context, service_num);
     goto Task1(context, remoteDGMQueue);
 }
 
@@ -20,6 +22,7 @@
     printf("Task2\n");
     FileString* string = NEW(FileString);
     char word[1024] = "secound";
+    string->size = 789;
     memcpy(string->str, word, strlen(word));
     goto remoteDGMQueue->put(string, Task3); 
 }
@@ -43,6 +46,7 @@
 }
 
 __code Task4(TQueue* remoteDGMQueue){
+    printf("exit\n"); 
     goto exit_code();
 }
 
@@ -51,7 +55,19 @@
     goto Task4(context, remoteDGMQueue);
 }
 
+void init(int argc, char** argv) {
+    for (int i = 1; argv[i]; ++i) {
+        if (strcmp(argv[i], "-sn") == 0){
+            service_num = argv[i+1];
+        }
+    }
+}
+
 int main(int argc, char** argv) {
     printf("main\n");
+    init(argc, argv);
+    if (service_num == NULL){
+        service_num = "8080";
+    }
     goto Task1();
 }