質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

さくらのVPS

さくらのVPSは、さくらインターネット社が提供するVPS(仮想専用サーバー)です。高速なSSDの選択や複数台構成も可能。利用者に応じた柔軟なプランが用意されています。大規模システムにも対応可能なスケーラビリティを備えたホスティングサービスです。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

VPS

VPS(バーチャル・プライベート・サーバ)は、仮想化されたサーバをレンタルするサービスで、共有サーバでありながら専門サーバと同等の機能を果たします。物理的な専門サーバより安価で提供できるメリットがあります。

Q&A

解決済

1回答

1172閲覧

C言語でソケット通信で vpsとpc上での通信を行いたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

さくらのVPS

さくらのVPSは、さくらインターネット社が提供するVPS(仮想専用サーバー)です。高速なSSDの選択や複数台構成も可能。利用者に応じた柔軟なプランが用意されています。大規模システムにも対応可能なスケーラビリティを備えたホスティングサービスです。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

VPS

VPS(バーチャル・プライベート・サーバ)は、仮想化されたサーバをレンタルするサービスで、共有サーバでありながら専門サーバと同等の機能を果たします。物理的な専門サーバより安価で提供できるメリットがあります。

0グッド

1クリップ

投稿2021/09/30 04:26

質問内容

さくら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; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/09/30 04:43

ご提示のコードが正しいものとしてですが、ポートは解放されていますでしょうか。
guest

回答1

0

ベストアンサー

まず、bindに渡すアドレスは、サーバアドレスではなくて、
待ち受けるクライアントのアドレスを入れます。
どっからでも接続を受け付ける、って場合はINADDR_ANYをいれときます

投稿2021/09/30 04:53

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2021/10/01 03:34 編集

>まず、bindに渡すアドレスは、サーバアドレスではなくて、 >待ち受けるクライアントのアドレスを入れます。 本当でしょうか? bindに渡すアドレスは、サーバアドレスでよかったと思います。 待ち受けるクライアントのアドレスを入れる例は見たことがありません。 質問者の方から返信がないので、あえて検証作業までは行うつもりはありませんが・・・。
y_waiwai

2021/10/01 04:02

むかしむかしに同じような問題でINADDR_ANYいれて通るようになったような覚えが、ってことで調べてみると http://chokuto.ifdef.jp/advanced/function/bind.html グローバルアドレスじゃなくて、サーバのローカルアドレスを入れるってことかな。 うろ覚えで間違った理解してたようですね ってことは、クライアントでローカルアドレス入れてる、ってはなしかねー 問題はそこらへんにありそうですね
tatsu99

2021/10/01 05:05

質問者は#define SERVER_ADDR "〇〇〇〇"部のアドレスを2つともサーバーのものを使用した状態で、 試験されてるようです。具体的な値が提示されていないので、断定はできませんが、グローバルアドレスを使用していると思われます。 Waiting Conect/Start Connectまで表示され、だんまりになるということは、 サーバー側はBind/Listenは正常終了し、クライアントからの接続待ち クライアント側は、サーバーへの接続でまたされている状態 と考えられます。 この場合、ファイアウォールによるポートの抑止が原因ではないかと個人的には思っています。 jimbe様の問いに質問者が返信していないので、それ以上はなんとも言えませんが・・・。
y_waiwai

2021/10/01 05:17

ぜひそういう旨の回答をしてやって下さい いろんな回答があってこそ解決に向かうと言うもんです。 質問者からレスポンスがないってのは、推測でしか答えることができないんでなかなかつらいですわな。
tatsu99

2021/10/01 05:23

>質問者からレスポンスがないってのは、推測でしか答えることができないんでなかなかつらいですわな。 そうですね。とりあえず、質問者から返信があるまでは、様子見といたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問