質問内容
さくらvpsサーバーとクライントpcとでソケット通信を行いたいのですがなぜか提示画面の先にすすめません。これはなぜでしょうか?
知り事
何が原因でサーバーとのやり取りが成立しないのか知りたい。
試したこと
下記のソースコードの
#define SERVER_ADDR "〇〇〇〇"
部のアドレスをクライントはpcの物、サーバーはサーバーのアドレスに置き換えた
2つとも同じクライントの物にした
2つともサーバーの物にした。
参考サイト: https://daeudaeu.com/socket/#i-12
クライアント
c
1#include <sys/socket.h> 2#include <netinet/in.h> 3#include <arpa/inet.h> 4#include <stdio.h> 5#include <string.h> 6#include <unistd.h> 7 8#define SERVER_ADDR "〇〇〇〇" 9#define SERVER_PORT 2222 10#define BUF_SIZE 1024 11 12int transfer(int); 13 14int transfer(int sock) 15{ 16 char send_buf[BUF_SIZE], recv_buf; 17 int send_size, recv_size; 18 19 while (1) { 20 21 /* サーバーに送る文字列を取得 */ 22 printf("Input Message...\n"); 23 scanf("%s", send_buf); 24 25 /* 文字列を送信 */ 26 send_size = send(sock, send_buf, strlen(send_buf) + 1, 0); 27 if (send_size == -1) 28 { 29 printf("send error\n"); 30 break; 31 } 32 33 /* サーバーからの応答を受信 */ 34 recv_size = recv(sock, &recv_buf, 1, 0); 35 if (recv_size == -1) 36 { 37 printf("recv error\n"); 38 break; 39 } 40 if (recv_size == 0) 41 { 42 /* 受信サイズが0の場合は相手が接続閉じていると判断 */ 43 printf("connection ended\n"); 44 break; 45 } 46 47 /* 応答が0の場合はデータ送信終了 */ 48 if (recv_buf == 0) 49 { 50 printf("Finish connection\n"); 51 break; 52 } 53 } 54 55 return 0; 56} 57 58int main(void) 59{ 60 int sock; 61 struct sockaddr_in addr; 62 63 64 /* ソケットを作成 */ 65 sock = socket(AF_INET, SOCK_STREAM, 0); 66 if (sock == -1) 67 { 68 printf("socket error\n"); 69 70 return -1; 71 } 72 73 /* 構造体を全て0にセット */ 74 memset(&addr, 0, sizeof(struct sockaddr_in)); 75 76 /* サーバーのIPアドレスとポートの情報を設定 */ 77 addr.sin_family = AF_INET; 78 addr.sin_port = htons((unsigned short)SERVER_PORT); 79 addr.sin_addr.s_addr = inet_addr(SERVER_ADDR); 80 81 /* サーバーに接続要求送信 */ 82 printf("Start connect...\n"); 83 if (connect(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) == -1) 84 { 85 printf("connect error\n"); 86 close(sock); 87 88 return -1; 89 } 90 91 printf("Finish connect!\n"); 92 93 /* 接続済のソケットでデータのやり取り */ 94 transfer(sock); 95 96 /* ソケット通信をクローズ */ 97 close(sock); 98 99 return 0; 100}
サーバー
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <string.h> #include <unistd.h> #define SERVER_ADDR "〇〇〇〇" #define SERVER_PORT 2222 #define BUF_SIZE 1024 int transfer(int); int transfer(int sock) { int recv_size,send_size; char recv_buf[BUF_SIZE],send_buf; while(true) { recv_size = recv(sock,recv_buf,BUF_SIZE,0); if(recv_size == -1) { printf("recv errro\n"); break; } if(recv_size == 0) { printf("connection ended\n"); break; } printf("%s\n",recv_buf); if(strcmp(recv_buf,"finish") == 0) { send_buf = 0; send_size = send(sock,&send_buf,1,0); if(send_size == 1) { printf("send error\n"); break; } break; } else { send_buf = 1; send_size = send(sock,&send_buf,1,0); if(send_size == -1) { printf("send error\n"); break; } } } return 0; } int main(void) { int w_addr, c_sock; struct sockaddr_in a_addr; /* ソケットを作成 */ w_addr = socket(AF_INET, SOCK_STREAM, 0); if (w_addr == -1) { printf("socket error\n"); return -1; } /* 構造体を全て0にセット */ memset(&a_addr, 0, sizeof(struct sockaddr_in)); /* サーバーのIPアドレスとポートの情報を設定 */ 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; } while (true) { /* 接続要求の受け付け(接続要求くるまで待ち) */ printf("Waiting connect...\n"); c_sock = accept(w_addr, NULL, NULL); if (c_sock == -1) { printf("accept error\n"); close(w_addr); return -1; } printf("Connected!!\n"); /* 接続済のソケットでデータのやり取り */ transfer(c_sock); /* ソケット通信をクローズ */ close(c_sock); /* 次の接続要求の受け付けに移る */ } /* 接続待ちソケットをクローズ */ close(w_addr); return 0; }
回答1件
あなたの回答
tips
プレビュー