• 締切済み

プログラミング

教えてください。以下のプログラムを修正してソケットを使った残高照会プログラムを作成。 関数searchdata(long key, char *dp, int size)を最後に追加する。 #include <stdio.h> /* for printf() and fprintf() */ #include <sys/socket.h> /* for recv() and send() */ #include <unistd.h> /* for close() */ #include <string.h> #define RCVBUFSIZE 32 /* Size of receive buffer */ int searchdata(long key, char *dp, int size); long id; void DieWithError(char *errorMessage); /* Error handling function */ void HandleTCPClient(int clntSocket) { char echoBuffer[RCVBUFSIZE]; /* Buffer for echo string */ int recvMsgSize; /* Size of received message */ /* Receive message from client */ if ((recvMsgSize = recv(clntSocket, echoBuffer, RCVBUFSIZE, 0)) < 0) DieWithError("recv() failed"); sscanf(echoBuffer, "%ld", &id); if (searchdata(id,echoBuffer,sizeof(echoBuffer))==EOF) { snprintf(echoBuffer,sizeof(echoBuffer),"%ld",0L); } if (send(clntSocket, echoBuffer, strlen(echoBuffer), 0) != strlen(echoBuffer)) DieWithError("send() failed"); close(clntSocket); /* Close client socket */ }

みんなの回答

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.2

#1の補足に書かれているurlのどこにも作るべきsearchdataの仕様は書かれていないようですけど? その仕様が他者にわかるように説明してください。 それと他の回答者については存じませんが私はアドバイス程度しかするつもりはありませんので、あしからず。

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.1

先生やお友達にでもお尋ねください。 ソケット通信の内容もわからないし 関数searchdata(long key, char *dp, int size)の仕様もわからないしで 回答のしようがありませんし。

wakatyu1
質問者

補足

関連するQ&A

  • 配列とポインタについて

    こんばんわ。 WinSockを利用してネットワークプログラミングを行っています。 以下のようなプログラムを作成したのですが、実行できません。 以下のプログラムは質問箇所を抜き出したものです。 [プログラム] int Receive(u_short portNo) { char recv_Buf[1025],recv_Buff[1025]; size = recvfrom(s2, recv_Buf, (int)sizeof(recv_Buf) - 1, 0, (SOCKADDR *)&from, &fromlen); recv_Buff = recv_Buf; Sender(portNo,szServer,recv_Buff); } int Send(unsigned short portNo,char *szServer,char *recv_Buff) { sendto(s1, recv_Buff, (int)strlen(recv_Buff), 0, (LPSOCKADDR)&addrin1, sizeof(addrin1)); } このプログラムは、Receive関数内のrecvfrom関数で1024Byte(recv_Buf[1025])受信したデータをSend関数内のsendto関数で送信するというプログラムです。 recv_Buf = recv_Buffにてエラーが発生します。なにか解決策はりますでしょうか? また、Receive関数およびSend関数は何回も呼ばれるのですが、配列は初期化する必要があるのでしょうか? よろしくお願いします。

  • c言語のプログラミングについて教えてください!

    コネクション型Soket通信のプログラミングについて教えてください。 空欄と打ってるところを教えてほしいです。かなり急ぎです! #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <stdio.h> #include <fcntl.h> #include <stdlib.h> #include <strings.h> #define PORT_NO 8001 void cliepro(int); /*メインルーチン(クライアント)*/ main(int argc, char **argv) { int sofd; /* ソケット記述子*/ struct hostent *shost; /* hostent構造体*/ struct sockaddr_in sv_addr; /* sockaddr_in構造体 */ /*ソケットの作成(TCP) 空欄 空欄 空欄 */ /*サーバのアドレスを取得 空欄 空欄 空欄 */ /*サーバのアドレスを設定*/ bzero((void *)&sv_addr,sizeof(sv_addr)); sv_addr.sin_family = AF_INET; sv_addr.sin_port = htons(PORT_NO); memcpy((void *)&sv_addr.sin_addr,(void *)shost->h_addr,shost->h_length); /*ソケットの接続要求 空欄 空欄 空欄 */ cliepro(sofd); close(sofd); exit(0); } /*処理ルーチン(クライアント)*/ void cliepro(int sofd) { int cc,nbyte, MAXRMSG; char smsg[100], rmsg[100]; MAXRMSG=sizeof(rmsg); bzero(rmsg, MAXRMSG); while(1){ printf("Enter string :"); fgets(smsg, sizeof(smsg), stdin); if(feof(stdin)) break; nbyte=strlen(smsg); if (send(sofd, smsg, nbyte, 0) < 0) { perror("send"); } else { cc=recv(sofd,rmsg,MAXRMSG,0); if(cc<0) perror("recv"); else { printf("%s",rmsg); bzero(rmsg,MAXRMSG); } } } }

  • 大文字を小文字に、小文字を大文字にするプログラム

    問題は、 ファイルにあるアルファベットの大文字を小文字に変換し、小文字は大文字に変換して、ファイルに保存するプログラムを作りなさい というものです。 色々考えて、 #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <unistd.h> #include <ctype.h> int main(int argc,char **argv){ int fd,flag1,flag2; int i,n; char buffer[512],x; fd = open(argv[1],O_RDWR); if(fd == -1) perror("open"); while((n = read(fd,buffer,sizeof(buffer)))>0){ x = buffer[i]; flag1 = islower(x); flag2 = isupper(x); for(i=0;i<n;++i) if(flag1 == 1){ buffer[i] = toupper(buffer[i]); }else if(flag2 == 1){ buffer[i] = tolower(buffer[i]); } write(fd,buffer,n); } close(fd); exit(0); } のようなプログラムを考えましたが、うまくいきません。 toupperのような関数を使ったのは初めてなのでよく使い方が分からずこのようなプログラムになってしまいました。 どうか正しく動くようなプログラムを教えてください。お願いします。

  • チャットプログラムでのselectの使い方について

    linux開発環境でC言語を用いて1対5程度のチャットプログラムを作成しています。クライアントから送信された内容はサーバに表示されるのですが、この内容を他のクライアントにも表示したいです。そこでselect関数を用いたいのですが、どこにどのようなコードで挿入すればよいかわかりません。以下にプログラムを載せるので、できれば詳しいコードで回答をよろしくお願いいたします。 サーバプログラム #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/wait.h> #include <unistd.h> #include <signal.h> #include <netdb.h> #define PORT 5320 void kill_zombie_process(int sig); void close_process(int unused); char *show_ip(char *ip_address); int main(void) { int soc, acc, size; char buffer[80]; struct sockaddr_in client, server; struct hostent *server_host; pid_t pid; char host_name[257]; int temp; memset(host_name, 0, sizeof(host_name)); gethostname(host_name, 256); server_host = gethostbyname(host_name); printf("\n-------- informations of server ----------\n"); printf("Host name:%s\n", host_name); printf("IP = %s\n", show_ip(server_host->h_addr)); printf("\n\n"); soc = socket(AF_INET, SOCK_STREAM, 0); memset((char *)&server, 0, sizeof(server)); server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(PORT); bind(soc, (struct sockaddr *)&server, sizeof(server)); size = sizeof(client); listen(soc, 5); signal(SIGINT, close_process); signal(SIGCHLD, kill_zombie_process); while(1) { acc = accept(soc, (struct sockaddr *)&client, &size); pid = fork(); if(pid == 0) { close(soc); while(1) { memset(buffer, '\0', sizeof(buffer)); recv(acc, buffer, 80, 0); printf("%s> ", show_ip((char *)&client.sin_addr)); printf("%s", buffer); if(strncmp(buffer, "exit", 4) == 0) break; } close(acc); exit(0); } else { close(acc); } } return 0; } void kill_zombie_process(int sig) { while(waitpid(-1, NULL, WNOHANG) > 0); signal(SIGCHLD, kill_zombie_process); } void close_process(int unused) { exit(0); } char *show_ip(char *ip_address) { static char ip[7]; char ipnum[4]; bcopy(ip_address, ipnum, 4); sprintf(ip, "%u.%u.%u.%u",(unsigned char)ipnum[0], (unsigned char)ipnum[1], (unsigned char)ipnum[2],(unsigned char)ipnum[3]); return ip; } クライアントプログラム #include<stdio.h> #include<string.h> #include<stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #define PORT 5320 int main(int argc, char *argv[]) { int soc; char message[80],ip_address[16]; struct sockaddr_in server; if(argc == 1) { printf("引数にIPアドレスが必要です/n"); exit(0); } strcpy(ip_address,argv[1]); soc = socket(AF_INET,SOCK_STREAM,0); memset((char *)&server,0,sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(PORT); server.sin_addr.s_addr = inet_addr(ip_address); connect(soc,(struct sockaddr *)&server,sizeof(server)); while(1) { printf("メッセージを入力してください:"); fgets(message,80,stdin); send(soc,message,strlen(message),0); if(strncmp(message,"exit",4) == 0)break; } close(soc); return 0; }

  • ポインタ勉強中です。しかも実行するとおかしいです。

    <本に載ってたソース> #include<stdio.h> #include<string.h> int main() { char msg[20]; char *str=NULL; int i; int cnt; str=&msg[0]; printf("文字を入力してください"); scanf("%s",&str); cnt=strlen(msg); str=msg+cnt; for(i=cnt;i>=0;i--){ printf("%c",*(str--)); } printf("\n"); return 0; } char *str=NULL;は、ポインタstrを空にするということでしょうか? いつもながらstrlenとsizeofが混じります。 sizeofがバイトの大きさで、strlenが、文字数でしたっけ?

  • プログラミング教えてください

    プログラミングの問題分かりません教えてください! mcut.c, mpaste.cを参考にしてmcut.cによって 書き込かれたデータの小文字を全て大文字に変換後、共有メモリに 再度書き込むプログラムを作成してください。関数toupper()を使用する。 mcut.c #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *head; char in_data[4096], *in_ptr; char *pos; int i, in_tmp, shmid; key_t shmkey; shmkey=ftok("mcut",'a'); shmid=shmget(shmkey,sizeof(in_data),IPC_CREAT|0666); head=pos=shmat(shmid,0,0); in_ptr=in_data; for (i=0; i<sizeof(in_data)-1; i++) { if ((in_tmp=getchar())==EOF) { break; } *in_ptr=in_tmp; in_ptr++; } *in_ptr=(char)NULL; in_ptr=in_data; strncpy(pos,in_ptr,sizeof(in_data)); shmdt(head); return EXIT_SUCCESS; } mpaste.c #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *head; char out_data[4096], *out_ptr; char *pos; int shmid; key_t shmkey; shmkey=ftok("mcut",'a'); shmid=shmget(shmkey,sizeof(out_data),IPC_CREAT|0666); head=pos=shmat(shmid,0,0); out_ptr=out_data; strncpy(out_ptr,pos,sizeof(out_data)); printf("%s",out_data); fflush(stdout); return EXIT_SUCCESS; }

  • C言語によるBerkeley DB アクセスでエラー

    FreeBSD 6.1でC言語によるプログラムを書いています。 ここでデータベースにBerkeley DBを使用しているのですがputで引数エラーが出ます。 以下テストプログラムです。 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <limits.h> #include <db.h> #include <fcntl.h> #include <string.h> #include <errno.h> int main() { DB* db; DBT key, val; memset(&key, 0, sizeof(DBT)); memset(&val, 0, sizeof(DBT)); key.data = (char *)"key"; key.size = strlen((char *)key.data); val.data = (char *)"データです。"; val.size = strlen((char *)val.data); if((db = dbopen("test.db", O_CREAT | O_RDWR, 644, DB_BTREE, NULL)) == NULL) { perror("dbopen"); exit(1); } if(db->put(db, &key, &val, R_SETCURSOR) == -1) { perror("put"); exit(1); } if(db->close(db) == -1) { perror("close"); exit(1); } } 結果:put: Invalid argument マニュアルやGoogleのソースコード検索等をして調べてみたのですが、どうしても解決できません。 お分かりになる方、ぜひ御教示お願いします。

  • プログラミング

    プログラミング教えてください 子プロセスはsleep時間をカウントし、シグナルSIGTSTP受信後、親プロセスにsleep時間をパイプラインで通知し親プロセスは、 sleep時間をプリントして終了せよ 上のプログラムが親で、下が子です。子のプログラムに付け足すだけでいいです。 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <time.h> int main() { char read_fd[3],write_fd[3]; int fd[2],st; time_t result; if (pipe(fd)<0) { perror("pipe"); exit(EXIT_FAILURE); } snprintf(read_fd,sizeof(read_fd),"%d",fd[0]); snprintf(write_fd,sizeof(write_fd),"%d",fd[1]); if (fork()==0) { if (execl("hw6-c","hw6-c",read_fd,write_fd,NULL)<0) { exit(EXIT_FAILURE); } } else { signal(SIGTSTP,SIG_IGN); // 親は Ctrl-Zを無視 } wait(&st); read(fd[0],&result,sizeof(result)); printf("elapsed time = %ld\n",result); close(fd[0]); close(fd[1]); return EXIT_SUCCESS; } #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h> time_t start; int read_fd,write_fd; int main(int argc,char *argv[]) { void stop(); read_fd=atoi(argv[1]); write_fd=atoi(argv[2]); signal(SIGTSTP,stop); time(&start); while (1) { sleep(1); printf(":"); fflush(stdout); } } void stop() { time_t end; この部分を考えて下さい Ctrl-Z後に子が行うことを書く 1)終了時刻(end)を測定 2)end-startをパイプバッファに書く close(read_fd); close(write_fd); exit(EXIT_SUCCESS); }

  • winsockについて教えてください。

    winsockについて教えてください。 ネットワーク系は初心者なので、理解が遅いと思いますが、お手柔らかに御願いします。 始めは、perlでクライアント側もサーバ側もソケットで通信するプログラムを書いたんですが、 クライアント側のpcはperlが標準装備ではないので、クライアント側だけVC++で書き直そうと、現在しているのですが、うまくクライアント側で受信してくれません。 書いたソースは、 #include <stdlib.h> #include <conio.h> #include <stdio.h> #include <winsock2.h> #include <cstdlib> #include <iostream> #include <fstream> #define BUFSIZE 256 #define FILENAME "C:\\abc.dat" int main(void) { FILE *fp; int nRtn; char fname[BUFSIZE] = FILENAME; char StrRcv[RECVSIZE]; SOCKET s; //ソケット //接続するサーバの情報 struct sockaddr_in dest; //接続するサーバのIPアドレス //xxx.xxx.xxx.xxxの形式で指定する char destination[] = "xxx.xxx.xxx.xxx"; char buffer[BUFSIZE]; char send_buf[BUFSIZE]; //ソケット通信の準備 WSADATA data; WSAStartup(MAKEWORD(2,0), &data); //接続先(サーバ)のアドレス情報を設定 memset(&dest, 0, sizeof(dest)); //ポート番号はサーバプログラムと共通 dest.sin_port = htons(3001); dest.sin_family = AF_INET; dest.sin_addr.s_addr = inet_addr(destination); //ソケットの生成 s = socket(AF_INET, SOCK_STREAM, 0); //サーバへの接続 if(connect(s, (struct sockaddr *) &dest, sizeof(dest))){ printf("%sに接続できませんでした\n", destination); return -1; } printf("%sに接続しました\n", destination); //ファイルの読込み if((fp=fopen(fname,"r"))==NULL){ printf("ファイルを開けませんでした\n"); exit(1); } //ファイルサイズ取得(フルパスで書く) ifstream ifs(FILENAME, ios_base::binary); //VC++の場合、peek()で読み込まないとファイルが開かれない ifs.peek(); streamsize size = ifs.rdbuf()->in_avail(); //ファイルサイズを出力します printf("size = %d\n",size); while((fgets(send_buf,size,fp)) != 0){ send(s,send_buf,size, 0); }    fclose(fp); //サーバからデータを受信 while(1){ memset(StrRcv, '\0', sizeof(StrRcv)); nRtn = recv(s, StrRcv, (int)sizeof(StrRcv) - 1, 0); printf("→ %s\n\n", StrRcv); if(nRtn == 0) break; if(nRtn ==SOCKET_ERROR){ perror("recvエラーです。\n"); break; } } recv(s, buffer, size , 0); printf("→ %s\n\n", buffer); // Windows でのソケットの終了 shutdown(s,2); closesocket(s); WSACleanup(); return 0; } とこんな感じです。 abc.datの中身はabc。 どこがおかしいかどなたかご教授ください。

  • C言語で自作したcpコマンドが上手く動作しません

    当方、プログラミングを勉強中の学生です。 先日、ファイル入出力関数を用いてcpコマンドを自作しました。 一応、コンパイルは通るのですが、コピーしたファイルを開くことができません。 そのファイルのパーミッションを確認してみたところ 「----------」となっており、読み書き実行すべて不可となっていました。 ソースは以下の通りなのですが、何が問題でしょうか。 回答よろしくお願い致します。 #include<stdio.h> #include<fcntl.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/uio.h> #include <unistd.h> #define SIZE 8192 int main(int argc, char *argv[]) { int fd1, fd2; char buf[SIZE]; if ( argc != 3 ){ char err_message[] = "ファイル名を指定して下さい。\n"; write(2, err_message, strlen(err_message)); return 1; } argv[0] = "mycopy"; fd1 = open(argv[1], O_RDONLY); fd2 = open(argv[2], O_WRONLY | O_CREAT); if (fd1 < 0 || fd2 < 0) { char err_message[] = "ファイルをオープンできません。"; write(2, err_message, strlen(err_message)); write(2, strerror(errno), strlen(strerror(errno))); write(2, "\n", 1); return 1; } while(1) { if (read(fd1, buf, SIZE) == 0) { break; } else if (read(fd1, buf, SIZE) > 0) { write(fd2, buf, SIZE); } else { char err_message[] = "エラーが発生しました。"; write(2, err_message, strlen(err_message)); write(2, strerror(errno), strlen(strerror(errno))); write(2, "\n", 1); return 1; } } close(fd1); close(fd2); return 0; }