大学の授業で習っている最中なのですが、通信システムのシミュレーションをしたいプログラムで。出された課題内容がプログラムの機能を拡張するもので。一つ目の課題は特に問題なくクリアしたのですが二つ目でエラーが出てしまいどう解決すればいいかわからず、皆様に直し方をお聞きしたいです。
二つ目の課題では
人名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}
- クライアント側
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
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。