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

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

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

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Debian

Debianは、Debian GNU/Linux などのOS(オペレーティングシステム)です。

Q&A

解決済

1回答

1137閲覧

Linux Cにおけるソケット通信(サーバ側:サンプルプログラム)

cafe_takai

総合スコア27

C

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Debian

Debianは、Debian GNU/Linux などのOS(オペレーティングシステム)です。

0グッド

0クリップ

投稿2018/06/29 01:22

編集2018/06/29 01:26

◆行いたいこと
Linux(debian8)・Cにおけるサーバ側ソケットサンプルプログラムを動かしたい。

◆症状
サーバ側プログラムにおいて、UDPでの通信は上手く行くが、TCPの通信において、次のエラーが出てしまいます。
failed to receive initial bytes from clienterrno is : Socket operation on non-socket

◆調べたこと
プログラム中のclientHandleがゼロであり、これに起因しているであることは分かったのですが、関連するコマンドを調べたのですが、なぜ取得できないのかが分かりません。

どなた様か、ご教授いただけましたら幸いです。

C

1#include <stdio.h> 2#include <sys/socket.h> 3#include <arpa/inet.h> 4#include <stdlib.h> 5#include <string.h> 6#include <unistd.h> 7#include <netinet/in.h> 8 9#define MAX_BUF 256 10 11void post_error(const char* inMsg){ 12 fprintf(stderr, "%s", inMsg); 13 perror("errno is "); 14 exit(-1); 15} 16 17void handle_client(int client){ 18 char buffer[MAX_BUF]; 19 int received = -1; 20 21 /* [TCP]メッセージを受ける */ 22 received = recv(client, buffer, MAX_BUF, 0); 23 if (received < 0) post_error("error: connection - failed to receive initial bytes from client"); 24 25 while (received > 0){ 26 printf("%s", buffer); 27 received = recv(client, buffer, MAX_BUF, 0); 28 29 if (received < 0) 30 post_error("error: connection - failed to received pending bytes from client"); 31 } 32 close(client); 33} 34 35// メインプログラム... 36int main(int argc, char* argv[]){ 37 int serverHandle; 38 int clientHandle; 39 struct sockaddr_in server; 40 struct sockaddr_in client; 41 42 if (argc != 3) post_error("usage: server [tcp or udp] [port number]"); 43 44 int udp; 45 if (strcmp(argv[1], "tcp") == 0){ 46 udp = 0; 47 serverHandle = socket(AF_INET, SOCK_STREAM, 0); 48 } 49 else if (strcmp(argv[1], "udp") == 0){ 50 udp = 1; 51 serverHandle = socket(AF_INET, SOCK_DGRAM, 0); 52 } else { 53 post_error("error: invalid arguments - first argument must be either \"tcp\" or \"udp\""); 54 } 55 56 /* 構造体のセット... */ 57 memset(&server, 0, sizeof(server)); 58 server.sin_family = AF_INET; 59 server.sin_addr.s_addr = htonl(INADDR_ANY); 60 server.sin_port = htons(atoi(argv[2])); 61 62 /* バインド */ 63 if (bind(serverHandle, (struct sockaddr*)&server, sizeof(server)) < 0) 64 post_error("error: failed to bind to target port"); 65 66 if (!udp) 67 { 68 /* [TCP] 許可待ち */ 69 if (listen(serverHandle, 1) < 0) 70 post_error("error: failed to listen on bound port"); 71 } 72 73 fprintf(stdout, "server initialized.\nwaiting for messages...\n"); 74 fflush(stdout); 75 76 /* データが来るのを待つ */ 77 while (1){ 78 if (udp) { 79 char buffer[MAX_BUF]; 80 socklen_t len = sizeof(client); 81 ssize_t received = recvfrom(serverHandle, buffer, MAX_BUF, 0, (struct sockaddr*)&client, &len); 82 83 fprintf(stdout, "> %s", buffer); 84 fflush(stdout); 85 } 86 else { 87 /* 接続待ち */ 88 socklen_t len = sizeof(client); 89 if (clientHandle = accept(serverHandle, (struct sockaddr *) &client, &len) < 0) 90 post_error("error: failed to accept client connection"); 91 92 fprintf(stdout, "client connected: %s\n", inet_ntoa(client.sin_addr)); 93 fflush(stdout); 94 handle_client(clientHandle); 95 } 96 } 97} 98

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

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

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

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

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

guest

回答1

0

ベストアンサー

ご提示のコードに問題があって、acceptで返されたクライアントのソケットディスクリプターがなくなってしまっています。以下の部分で、

C

1 /* 接続待ち */ 2 socklen_t len = sizeof(client); 3 if (clientHandle = accept(serverHandle, (struct sockaddr *) &client, &len) < 0)

演算子の優先順位で、=より<の方が優先順位が高い為にaccept() < 0が最初に評価されて、偽、つまり0 になり、clientHandle=0が代入されています。

下のように直せば、意図通り正しく動作します。

C

1clientHandle = accept(serverHandle, (struct sockaddr *) &client, &len); 2if (clientHandle < 0) { 3 post_error("error: failed to accept client connection"); 4} 5....

投稿2018/06/29 04:16

dodox86

総合スコア9183

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

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

cafe_takai

2018/06/29 04:31

dodox86 様 ご教授ありがとうございます。ご指摘の方法にて上手くいきました。 ご指摘いただき「ハッ」としまし、まったく気づきませんでした。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問