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

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

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

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

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

1回答

5669閲覧

ファイルの転送プログラム

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2016/03/05 12:26

ファイル転送をするプログラムを書いたのですがうまくいきません.
しようとしまして最初にheaderを送信し, server 側はファイル名のペイロードの長さを知りbufを用意します

次にファイルの中身の長さをserver は送り還し, clientはbufを用意します
その後serverからファイルを送信します

送受信の部分は以下になります
ファイル名すらそうしんできません

C

1//header 2struct msgh { 3 uint8_t type; 4 uint8_t status; 5 uint8_t flags; 6 uint8_t reserved; 7 uint32_t payload_length; 8}; 9struct content_req { 10 struct msgh msgh; 11 char* content_name; 12}; 13struct content_rply { 14 struct msgh msgh; 15 char* payload; 16}; 17

C

1//client 2 struct content_req req; 3 struct content_rply rply; 4 ssize_t len; 5 6 req.content_name = "./index.html"; 7 req.msgh.payload_length = strlen(req.content_name); 8 9 fprintf(stdout,"req.msgh.payload_length = %d\n",req.msgh.payload_length); 10 fprintf(stdout,"mojiretu:%s\n",req.content_name); 11 fprintf(stderr,"SIZE:%lu\n",sizeof(req)); 12 13 /* 送信 */ 14 if ((len = send(soc, &req, sizeof(struct content_req), 0)) == -1) { 15 /* エラー */ 16 perror("send"); 17 } 18 19 /* 受信 */ 20 if ((len = recv(soc, &rply.msgh, sizeof(struct msgh), 0)) == -1) { 21 /* エラー */ 22 perror("recv"); 23 } 24 25 rply.payload = (char *)malloc(sizeof(char) * rply.msgh.payload_length); 26 27 if ((len = recv(soc, rply.payload, sizeof(char) * rply.msgh.payload_length, 0)) == -1) { 28 /* エラー */ 29 perror("recv"); 30 } 31 32 fprintf(stdout,"%s\n",rply.payload);

C

1//server 2for(;;) { 3 4 if((len = recv(acc, &req.msgh, sizeof(struct msgh), 0)) == -1) { 5 perror("recv"); 6 } 7 8 req.content_name = (char *)malloc(sizeof(char) * req.msgh.payload_length); 9 fprintf(stdout,"req.msgh.payload_lenght = %d\n",req.msgh.payload_length); 10 11 if((len = recv(acc, req.content_name, sizeof(char) * req.msgh.payload_length, 0)) == -1) { 12 perror("recv"); 13 } 14 15 printf("mojisuu:%lu, moji:%s\n",strlen(req.content_name),req.content_name); 16 17/* 18 FILE* fp; 19 if ((fp = fopen(req.content_name, "r")) == NULL) { 20 perror("file open"); 21 exit(EXIT_FAILURE); 22 } 23 24 while((*(rply.payload + i) = fgetc(fp)) != EOF){ 25 i++; 26 } 27 28 *(rply.payload + i) = '\0'; 29 fclose(fp); 30*/ 31 rply.payload = "AAAAA"; 32 rply.msgh.payload_length = strlen(rply.payload); 33 if((len = send(acc, &rply, sizeof(struct content_rply), 0)) == -1) { 34 perror("send"); 35 break; 36 } 37 38 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

通信自体はできているのですよね?
つまり、msghは受信できているけど、content_nameに何か変な値が入っているのですね?

content_nameはchar型へのポインタなので、"./index.html"の先頭アドレスが入っています。
その「アドレス」を送ってます。64bitsアプリなら、8バイトの何やら変なデータの筈です。

msghとcontent_nameに対してそれぞれsend()すると良いと思います。

投稿2016/03/05 12:37

Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問