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

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

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

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

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

Linux

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

Q&A

解決済

3回答

1772閲覧

ソケット通信のシミュレーションに出てきたdatagram errorの治し方を知りたいです

SioRyu

総合スコア28

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

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

Linux

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

0グッド

0クリップ

投稿2018/10/04 13:06

大学の授業で習っている最中なのですが、通信システムのシミュレーションをしたいプログラムで。出された課題内容がプログラムの機能を拡張するもので。一つ目の課題は特に問題なくクリアしたのですが二つ目でエラーが出てしまいどう解決すればいいかわからず、皆様に直し方をお聞きしたいです。
二つ目の課題では
人名1,人名2
の複数の入力がされた場合それぞれの人名の携帯番号を返すようにプログラムを拡張するものでした。
5つポインター関係のエラーが出ていたのですが、そちらは何とかいろいろ調べながら自力でエラーを消したのですが、もしかしたらポインターをいじりすぎたのではないかと思っております。

問題が出ているのはサーバー側の

c

1/* 検索したデータをソケットに書き込む */ 2 datalen = strlen(*data[i]); 3 if(sendto(socd, data, datalen, 0, (struct sockaddr *)&c_address, c_addrlen) != datalen) { 4 fprintf(stderr, "datagram error\n"); 5 exit(1); 6 } 7

この部分です

動作環境は大学のパソコンで
仮想マシンCentOS Linux socket通信環境
0. サーバー側

c

1/* コネクションレスの簡単なデータ検索サーバ(dg_server.c) */ 2#include <stdio.h> 3#include <stdlib.h> 4#include <sys/types.h> 5#include <sys/socket.h> /* ソケットのための基本的なヘッダファイル */ 6#include <netinet/in.h> /* インタネットドメインのためのヘッダファイル */ 7#include <netdb.h> /* gethostbyname()を用いるためのヘッダファイル */ 8#include <errno.h> 9#include <string.h> 10#define MAXHOSTNAME 64 11#define S_UDP_PORT (u_short)5000 /* 本サーバが用いるポート番号 */ 12#define MAXKEYLEN 128 13#define MAXDATALEN 256 14int setup_dgserver(struct hostent*, u_short); 15void db_search(int); 16 17main() 18{ 19 int socd; 20 char s_hostname[MAXHOSTNAME]; 21 struct hostent *s_hostent; 22 23 /* サーバのホスト名とそのInternetアドレス(をメンバに持つhostent構造体)を求める */ 24 gethostname(s_hostname, sizeof(s_hostname)); 25 s_hostent = gethostbyname(s_hostname); 26 27 /* データグラムサーバの初期設定 */ 28 socd = setup_dgserver(s_hostent, S_UDP_PORT); 29 30 /* クライアントからのデータ検索要求の処理 */ 31 db_search(socd); 32} 33 34int setup_dgserver(struct hostent *hostent, u_short port) 35{ 36 int socd; 37 struct sockaddr_in s_address; 38 39 /* インターネットドメインのSOCK_DGRAM(UDP)型ソケットの構築 */ 40 if((socd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket");exit(1); } 41 42 /* アドレス(Internetアドレスとポート番号)の作成 */ 43 bzero((char *)&s_address, sizeof(s_address)); 44 s_address.sin_family = AF_INET; 45 s_address.sin_port = htons(port); 46 bcopy((char *)hostent->h_addr, (char *)&s_address.sin_addr, hostent->h_length); 47 48 /* アドレスのソケットへの割り当て */ 49 if(bind(socd, (struct sockaddr *)&s_address, sizeof(s_address)) < 0) { perror("bind");exit(1); } 50 51 return socd; 52} 53 54void db_search(int socd) /* クライアントがデータ検索要求を処理する */ 55{ 56 struct sockaddr_in c_address; 57 int c_addrlen; 58 char key[MAXKEYLEN+1], data[5][MAXDATALEN+1]; 59 int keylen, datalen; 60 static char *db[] = {"amano-taro","0426-91-9418","ishida-jiro","0426-91-9872", 61 "ueda-saburo","0426-91-9265","ema-shiro","0426-91-7254", 62 "ooishi-goro","0426-91-9618",NULL}; 63 int i=0; 64 char token; 65 char **dbp; 66 67 while(1) { 68 /* キーをソケットから読み込む */ 69 c_addrlen = sizeof(c_address); 70 if((keylen = recvfrom(socd, key, MAXKEYLEN, 0, (struct sockaddr *)&c_address, &c_addrlen)) < 0) { 71 perror("recvfrom"); 72 exit(1); 73 } 74 key[keylen] = '\0'; 75 printf("Received key> %s\n",key); 76 /* キーを用いてデータ検索 */ 77 token = *strtok(key, ","); 78 do{ 79 dbp = db; 80 while(*dbp) { 81 if(strcmp(&token, *dbp) == 0) { 82 strcpy(data[i], *(++dbp)); 83 break; 84 } 85 dbp += 2; 86 } 87 i++; 88 }while(token == *strtok(NULL,",")); 89 if(*dbp == NULL) strcpy(*data, "No entry"); 90 91 /* 検索したデータをソケットに書き込む */ 92 datalen = strlen(*data[i]); 93 if(sendto(socd, data, datalen, 0, (struct sockaddr *)&c_address, c_addrlen) != datalen) { 94 fprintf(stderr, "datagram error\n"); 95 exit(1); 96 } 97 for(i=0;i<5;i++){ 98 printf("Sent data> %s\n", data[i]); 99 } 100 } 101}
  1. クライアント側

c

1/* コネクションレスの簡単なデータ検索クライアント(dg_client.c) */ 2#include <stdio.h> 3#include <stdlib.h> 4#include <sys/types.h> 5#include <sys/socket.h> /* ソケットのための基本的なヘッダファイル */ 6#include <netinet/in.h> /* インタネットドメインのためのヘッダファイル */ 7#include <netdb.h> /* gethostbyname()を用いるためのヘッダファイル */ 8#include <errno.h> 9#include <string.h> 10#define MAXHOSTNAME 64 11#define S_UDP_PORT (u_short)5000 12#define MAXKEYLEN 128 13#define MAXDATALEN 256 14int setup_dgclient(struct hostent*, u_short, struct sockaddr_in*, int*); 15void remote_dbsearch(int, struct sockaddr_in*, int); 16 17main() 18{ 19 int socd; 20 char s_hostname[MAXHOSTNAME]; 21 struct hostent *s_hostent; 22 struct sockaddr_in s_address; 23 int s_addrlen; 24 25 /* サーバのホスト名の入力 */ 26 printf("server host name?: "); scanf("%s",s_hostname); 27 /* サーバホストのInternetアドレス(をメンバに持つhostent構造体)を求める */ 28 if((s_hostent = gethostbyname(s_hostname)) == NULL) { 29 fprintf(stderr, "server host does not exists\n"); 30 exit(1); 31 } 32 33 /* データグラムクライアントの初期設定 */ 34 socd = setup_dgclient(s_hostent, S_UDP_PORT, &s_address, &s_addrlen); 35 36 /* リモートデータベース検索 */ 37 remote_dbsearch(socd, &s_address, s_addrlen); 38 39 close(socd); 40 exit(0); 41} 42 43int setup_dgclient(struct hostent *hostent, u_short port, struct sockaddr_in *s_addressp, int *s_addrlenp) 44{ 45 int socd; 46 struct sockaddr_in c_address; 47 48 /* インターネットドメインのSOCK_DGRAM(UDP)型ソケットの構築 */ 49 if((socd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket");exit(1); } 50 51 /* サーバのアドレス(Internetアドレスとポート番p)); 52 s_addressp->sin_family = AF_INET; 53 s_addressp->sin_port = htons(port); 54 bcopy((char *)hostent->h_addr, (char *)&s_addressp->sin_addr, hostent->h_length); 55 *s_addrlenp = sizeof(*s_addressp); 56 57 /* クライアントのアドレス(Internetアドレスとポート番号)の作成 */ 58 bzero((char *)&c_address, sizeof(c_address)); 59 c_address.sin_family = AF_INET; 60 c_address.sin_port = htons(0); /* ポート番号の自動割り当て */ 61 c_address.sin_addr.s_addr = htonl(INADDR_ANY); /* Internetアドレスの自動割り当て */ 62 63 /* クライアントアドレスのソケットへの割り当て */ 64 if(bind(socd, (struct sockaddr *)&c_address, sizeof(c_address)) < 0) { perror("bind");exit(1); } 65 66 return socd; 67} 68 69void remote_dbsearch(int socd, struct sockaddr_in *s_addressp, int s_addrlen) /* サーバにキーを送り検索結果(データ)を受け取る */ 70{ 71 char key[MAXKEYLEN+1], data[MAXDATALEN+1]; 72 int keylen, datalen; 73 while(1){ 74 /* キーを標準入力から入力 */ 75 printf("key?: "); 76 if(scanf("%s",key)==EOF)break; 77 /* キーをソケットに書き込む */ 78 keylen = strlen(key); 79 80 if(sendto(socd, key, keylen, 0, (struct sockaddr *)s_addressp, s_addrlen) != keylen) { 81 fprintf(stderr, "datagram error\n"); 82 exit(1); 83 } 84 /* 検索データをソケットから読み込む */ 85 if((datalen = recvfrom(socd, data, MAXDATALEN, 0, NULL, &s_addrlen)) < 0) { 86 perror("recvfrom"); 87 exit(1); 88 } 89 /* データを標準出力に出力 */ 90 data[datalen] = '\0'; 91 fputs("data: ",stdout);puts(data); 92 93 } 94}

実行結果:

[root@skt52 Linux_share]# gcc -o dg_client dg_client.c
[root@skt52 Linux_share]# ./dg_client
server host name?: skt52
key?: amano-taro
datagram error

[root@skt52 Linux_share]# gcc -o dg_server dg_server.c
[root@skt52 Linux_share]# ./dg_server

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

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

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

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

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

guest

回答3

0

ベストアンサー

複数の人名が入力された場合、その電話番号を返すように修正しました。client側の修正は必要ありません。
サーバー側です。

C

1/* コネクションレスの簡単なデータ検索サーバ(dg_server.c) */ 2#include <stdio.h> 3#include <stdlib.h> 4#include <sys/types.h> 5#include <sys/socket.h> /* ソケットのための基本的なヘッダファイル */ 6#include <netinet/in.h> /* インタネットドメインのためのヘッダファイル */ 7#include <netdb.h> /* gethostbyname()を用いるためのヘッダファイル */ 8#include <errno.h> 9#include <string.h> 10#define MAXHOSTNAME 64 11#define S_UDP_PORT (u_short)5000 /* 本サーバが用いるポート番号 */ 12#define MAXKEYLEN 128 13#define MAXDATALEN 256 14#define MAXKEYCOUNT 5 //ADD 15int setup_dgserver(struct hostent*, u_short); 16void db_search(int); 17 18main() 19{ 20 int socd; 21 char s_hostname[MAXHOSTNAME]; 22 struct hostent *s_hostent; 23 24 /* サーバのホスト名とそのInternetアドレス(をメンバに持つhostent構造体)を求める */ 25 gethostname(s_hostname, sizeof(s_hostname)); 26 s_hostent = gethostbyname(s_hostname); 27 28 /* データグラムサーバの初期設定 */ 29 socd = setup_dgserver(s_hostent, S_UDP_PORT); 30 31 /* クライアントからのデータ検索要求の処理 */ 32 db_search(socd); 33} 34 35int setup_dgserver(struct hostent *hostent, u_short port) 36{ 37 int socd; 38 struct sockaddr_in s_address; 39 40 /* インターネットドメインのSOCK_DGRAM(UDP)型ソケットの構築 */ 41 if((socd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket");exit(1); } 42 43 /* アドレス(Internetアドレスとポート番号)の作成 */ 44 bzero((char *)&s_address, sizeof(s_address)); 45 s_address.sin_family = AF_INET; 46 s_address.sin_port = htons(port); 47 bcopy((char *)hostent->h_addr, (char *)&s_address.sin_addr, hostent->h_length); 48 49 /* アドレスのソケットへの割り当て */ 50 if(bind(socd, (struct sockaddr *)&s_address, sizeof(s_address)) < 0) { perror("bind");exit(1); } 51 52 return socd; 53} 54//ADD開始 55//文字列strをカンマで分割し、keyaddrの配列へそのアドレスを返す(MAXKEYCOUNTまでしか処理しない) 56void get_keys(char *str,char *keyaddr[MAXKEYCOUNT],int *key_count) 57{ 58 int ix = 0; 59 keyaddr[ix] = str; 60 while(*str != 0x00){ 61 if (*str == ','){ 62 *str = 0x00; 63 if (ix + 1 == MAXKEYCOUNT) break; 64 keyaddr[ix+1] = str + 1; 65 ix++; 66 } 67 str++; 68 } 69 *key_count = ix + 1; 70} 71//db内の名前をstrで検索し、電話番号へのポインターを返す。NotFound時はNULLを返す。 72char *find_name(char *str,char **db) 73{ 74 int i = 0; 75 while(1){ 76 if (db[i] == NULL) break; 77 if (strcmp(db[i],str)==0) return db[i+1]; 78 i += 2; 79 } 80 return NULL; 81} 82//ADD終了 83void db_search(int socd) /* クライアントがデータ検索要求を処理する */ 84{ 85 struct sockaddr_in c_address; 86 int c_addrlen; 87 char key[MAXKEYLEN+1], data[(MAXDATALEN+1)*MAXKEYCOUNT+1]; //MOD 88 char *keyaddr[MAXKEYCOUNT]; 89 int keylen, datalen; 90 static char *db[] = {"amano-taro","0426-91-9418","ishida-jiro","0426-91-9872", 91 "ueda-saburo","0426-91-9265","ema-shiro","0426-91-7254", 92 "ooishi-goro","0426-91-9618",NULL}; 93 int i=0; 94 char token; 95 char *dbp; //MOD 96 int key_count; //ADD 97 98 while(1) { 99 /* キーをソケットから読み込む */ 100 c_addrlen = sizeof(c_address); 101 if((keylen = recvfrom(socd, key, MAXKEYLEN, 0, (struct sockaddr *)&c_address, &c_addrlen)) < 0) { 102 perror("recvfrom"); 103 exit(1); 104 } 105 key[keylen] = '\0'; 106 printf("Received key> %s\n",key); 107 //全面改訂開始 108 /* キーを,で分割*/ 109 get_keys(key,keyaddr,&key_count); 110 /* キーを用いてデータ検索 */ 111 strcpy(data,""); 112 for (i= 0; i < key_count; i++){ 113 printf("%d<%s>\n",i,keyaddr[i]); 114 dbp = find_name(keyaddr[i],db); 115 if (i != 0) strcat(data,"\n"); 116 if (dbp == NULL){ 117 strcat(data,"No entry"); 118 }else{ 119 strcat(data,dbp); 120 } 121 } 122 /* 検索したデータをソケットに書き込む */ 123 datalen = strlen(data); 124 if(sendto(socd, data, datalen, 0, (struct sockaddr *)&c_address, sizeof(c_address)) != datalen) { 125 fprintf(stderr, "datagram error:%d\n",errno); 126 exit(1); 127 } 128 printf("Sent data> %s\n", data); 129 //全面改訂終了 130 } 131}

尚、処理するのは5人(MAXKEYCOUNT)迄とし、それを超えた場合は、打ち切っています。
まず、人名へのポインターを
keyaddr[0]・・・1人目の名前へのポインター
keyaddr[1]・・・2人目の名前へのポインター、以降同様
のように作成し、
その名前で、dbを検索し、あれば、その電話番号をセット、なければ、No entryをdataへセットして行きます。

投稿2018/10/10 12:02

tatsu99

総合スコア5438

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

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

0

とりあえず、修正しておきました。
サーバー側

C

1/* コネクションレスの簡単なデータ検索サーバ(dg_server.c) */ 2#include <stdio.h> 3#include <stdlib.h> 4#include <sys/types.h> 5#include <sys/socket.h> /* ソケットのための基本的なヘッダファイル */ 6#include <netinet/in.h> /* インタネットドメインのためのヘッダファイル */ 7#include <netdb.h> /* gethostbyname()を用いるためのヘッダファイル */ 8#include <errno.h> 9#include <string.h> 10#define MAXHOSTNAME 64 11#define S_UDP_PORT (u_short)5000 /* 本サーバが用いるポート番号 */ 12#define MAXKEYLEN 128 13#define MAXDATALEN 256 14int setup_dgserver(struct hostent*, u_short); 15void db_search(int); 16 17main() 18{ 19 int socd; 20 char s_hostname[MAXHOSTNAME]; 21 struct hostent *s_hostent; 22 23 /* サーバのホスト名とそのInternetアドレス(をメンバに持つhostent構造体)を求める */ 24 gethostname(s_hostname, sizeof(s_hostname)); 25 s_hostent = gethostbyname(s_hostname); 26 27 /* データグラムサーバの初期設定 */ 28 socd = setup_dgserver(s_hostent, S_UDP_PORT); 29 30 /* クライアントからのデータ検索要求の処理 */ 31 db_search(socd); 32} 33 34int setup_dgserver(struct hostent *hostent, u_short port) 35{ 36 int socd; 37 struct sockaddr_in s_address; 38 39 /* インターネットドメインのSOCK_DGRAM(UDP)型ソケットの構築 */ 40 if((socd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket");exit(1); } 41 42 /* アドレス(Internetアドレスとポート番号)の作成 */ 43 bzero((char *)&s_address, sizeof(s_address)); 44 s_address.sin_family = AF_INET; 45 s_address.sin_port = htons(port); 46 bcopy((char *)hostent->h_addr, (char *)&s_address.sin_addr, hostent->h_length); 47 48 /* アドレスのソケットへの割り当て */ 49 if(bind(socd, (struct sockaddr *)&s_address, sizeof(s_address)) < 0) { perror("bind");exit(1); } 50 51 return socd; 52} 53 54void db_search(int socd) /* クライアントがデータ検索要求を処理する */ 55{ 56 struct sockaddr_in c_address; 57 int c_addrlen; 58 char key[MAXKEYLEN+1], data[MAXDATALEN+1]; //MOD 59 int keylen, datalen; 60 static char *db[] = {"amano-taro","0426-91-9418","ishida-jiro","0426-91-9872", 61 "ueda-saburo","0426-91-9265","ema-shiro","0426-91-7254", 62 "ooishi-goro","0426-91-9618",NULL}; 63 int i=0; 64 char token; 65 char *dbp; //MOD 66 67 while(1) { 68 /* キーをソケットから読み込む */ 69 c_addrlen = sizeof(c_address); 70 if((keylen = recvfrom(socd, key, MAXKEYLEN, 0, (struct sockaddr *)&c_address, &c_addrlen)) < 0) { 71 perror("recvfrom"); 72 exit(1); 73 } 74 key[keylen] = '\0'; 75 printf("Received key> %s\n",key); 76 /* キーを用いてデータ検索 */ 77 //全面改訂開始 78 i = 0; 79 dbp = NULL; 80 while(1){ 81 if (db[i] == NULL) break; 82 if (strcmp(db[i],key) == 0){ //名前が一致なら 83 dbp = db[i+1]; //電話番号をセット 84 break; 85 } 86 i += 2; 87 } 88 if(dbp == NULL){ 89 strcpy(data, "No entry"); 90 }else{ 91 strcpy(data,dbp); 92 } 93 /* 検索したデータをソケットに書き込む */ 94 datalen = strlen(data); 95 if(sendto(socd, data, datalen, 0, (struct sockaddr *)&c_address, sizeof(c_address)) != datalen) { 96 fprintf(stderr, "datagram error:%d\n",errno); 97 exit(1); 98 } 99 printf("Sent data> %s\n", data); 100 //全面改訂終了 101 } 102}

次がクライアント側

C

1/* コネクションレスの簡単なデータ検索クライアント(dg_client.c) */ 2#include <stdio.h> 3#include <stdlib.h> 4#include <sys/types.h> 5#include <sys/socket.h> /* ソケットのための基本的なヘッダファイル */ 6#include <netinet/in.h> /* インタネットドメインのためのヘッダファイル */ 7#include <netdb.h> /* gethostbyname()を用いるためのヘッダファイル */ 8#include <errno.h> 9#include <string.h> 10#define MAXHOSTNAME 64 11#define S_UDP_PORT (u_short)5000 12#define MAXKEYLEN 128 13#define MAXDATALEN 256 14int setup_dgclient(struct hostent*, u_short, struct sockaddr_in*, int*); 15void remote_dbsearch(int, struct sockaddr_in*, int); 16 17main() 18{ 19 int socd; 20 char s_hostname[MAXHOSTNAME]; 21 struct hostent *s_hostent; 22 struct sockaddr_in s_address; 23 int s_addrlen; 24 int i; 25 /* サーバのホスト名の入力 */ 26 printf("server host name?: "); scanf("%s",s_hostname); 27 /* サーバホストのInternetアドレス(をメンバに持つhostent構造体)を求める */ 28 if((s_hostent = gethostbyname(s_hostname)) == NULL) { 29 fprintf(stderr, "server host does not exists\n"); 30 exit(1); 31 } 32 /* データグラムクライアントの初期設定 */ 33 socd = setup_dgclient(s_hostent, S_UDP_PORT, &s_address, &s_addrlen); 34 35 /* リモートデータベース検索 */ 36 remote_dbsearch(socd, &s_address, s_addrlen); 37 38 close(socd); 39 exit(0); 40} 41 42int setup_dgclient(struct hostent *hostent, u_short port, struct sockaddr_in *s_addressp, int *s_addrlenp) 43{ 44 int socd; 45 struct sockaddr_in c_address; 46 47 /* インターネットドメインのSOCK_DGRAM(UDP)型ソケットの構築 */ 48 if((socd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket");exit(1); } 49 50 /* サーバのアドレス(Internetアドレスとポート番p)); 51 s_addressp->sin_family = AF_INET; 52 s_addressp->sin_port = htons(port); 53 bcopy((char *)hostent->h_addr, (char *)&s_addressp->sin_addr, hostent->h_length); 54 *s_addrlenp = sizeof(*s_addressp); 55 56 /* クライアントのアドレス(Internetアドレスとポート番号)の作成 */ 57 bzero((char *)&c_address, sizeof(c_address)); 58 c_address.sin_family = AF_INET; 59 //c_address.sin_port = htons(0); /* ポート番号の自動割り当て */ 60 c_address.sin_port = htons(port); /* ポート番号の自動割り当て */ //MOD 61 //c_address.sin_addr.s_addr = htonl(INADDR_ANY); /* Internetアドレスの自動割り当て */ 62 bcopy((char*)hostent->h_addr,(char*)&c_address.sin_addr.s_addr,hostent->h_length); //MOD 63 *s_addressp = c_address; //ADD 64 /* クライアントアドレスのソケットへの割り当て */ 65 //if(bind(socd, (struct sockaddr *)&c_address, sizeof(c_address)) < 0) { perror("bind");exit(1); } //DEL 66 67 return socd; 68} 69 70void remote_dbsearch(int socd, struct sockaddr_in *s_addressp, int s_addrlen) /* サーバにキーを送り検索結果(データ)を受け取る */ 71{ 72 char key[MAXKEYLEN+1], data[MAXDATALEN+1]; 73 int keylen, datalen; 74 while(1){ 75 /* キーを標準入力から入力 */ 76 printf("key?: "); 77 if(scanf("%s",key)==EOF)break; 78 /* キーをソケットに書き込む */ 79 keylen = strlen(key); 80 81 //if(sendto(socd, key, keylen, 0, (struct sockaddr *)s_addressp, s_addrlen) != keylen) { 82 if(sendto(socd, key, keylen, 0, (struct sockaddr *)s_addressp, sizeof(struct sockaddr_in)) != keylen) { //MOD 83 fprintf(stderr, "datagram error:%d\n",errno); //MOD 84 exit(1); 85 } 86 /* 検索データをソケットから読み込む */ 87 //if((datalen = recvfrom(socd, data, MAXDATALEN, 0, NULL, &s_addrlen)) < 0) { 88 if((datalen = recvfrom(socd, data, MAXDATALEN, 0, NULL, 0)) < 0) { //MOD 89 perror("recvfrom"); 90 exit(1); 91 } 92 /* データを標準出力に出力 */ 93 data[datalen] = '\0'; 94 fputs("data: ",stdout);puts(data); 95 96 } 97}

不明点は質問してください。

投稿2018/10/06 14:02

tatsu99

総合スコア5438

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

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

SioRyu

2018/10/10 09:20

今回の条件で 人名1,人名2 の複数の入力がされた場合それぞれの人名の携帯番号を返すようにプログラムを拡張するもので このプログラムの場合 入力:amano-taro,ishida-jiro 出力:0426-91-9418    0426-91-9872 のように二つ出る必要がありまして、そのために二つの名前を区切る","が必要不可欠でして、dataが配列になっているのは複数ためて、一度にクライアントに書き出すのが目的です。自分の説明不足のようで、すみません。
guest

0

datalen = strlen(*data[i]);

datalen = strlen(data);

じゃない?


datalen = strlen(data[i]);
if(sendto(socd, data[i], datalen, 0, (struct sockaddr *)&c_address, c_addrlen) != datalen) {

こっちのほうか。

投稿2018/10/04 13:09

編集2018/10/04 13:15
y_waiwai

総合スコア87749

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

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

SioRyu

2018/10/04 16:53

ありがとうございます、さっそく明日試してみたいと思います。
SioRyu

2018/10/10 09:35

書いていただいたとおりに直した上で試してみたのですが、やはり [root@skt60 Linux_share]# gcc -o dg_client dg_client.c [root@skt60 Linux_share]# ./dg_client server host name?: skt60 key?: amano-taro datagram error こんな感じでして、どこがだめでdatagram errorに落ちるのかわかりません。自分が浅い知識でいろいろといじってしまった上の部分に原因があるのかもしれません。 エラーで dg_server.c:92: 警告: passing argument 1 of ‘strlen’ makes pointer from integer without a cast /usr/include/string.h:399: note: expected ‘const char *’ but argument is of type ‘char’ このように出ていた部分をに*やら&やらをつけたり消したり、いろいろ試しながら消していったので、もしかしたらこのせいかと。 よろしければどこか自分の間違えを見つけていただけると助かります。
y_waiwai

2018/10/10 09:43

そのsendto関数の戻り値が何を返しているのかを調べてみればどうでしょう 動かない、なぜ?ということで思考停止するんではなくて、コードを単純化して、何がまずいのかを探っていくようにしましょう また、EclipseのようなC言語のデバッグができる統合環境を入れてはどうでしょうか。 任意の行で止めて、変数のナカミを参照することができます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問