◆行いたいこと
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/29 04:31