解決済み

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
masyumaro_sec
記事: 4
登録日時: 9年前

解決済み

#1

投稿記事 by masyumaro_sec » 9年前

解決しました。ありがとうございます。
最後に編集したユーザー masyumaro_sec on 2016年7月07日(木) 15:07 [ 編集 1 回目 ]

かずま

Re: C言語のソケットでbad file descriptor

#2

投稿記事 by かずま » 9年前

write/read の代わりに send/recv を使いましょう。

コード:

		if (send(sock, buffer, num_read, 0) < sizeof(buffer))

コード:

	while ((num_read = recv(sock, buffer, sizeof(buffer), 0)) > 0) {
close の代わりに socketclose を使っていますよね。
WSAStartup/WSACleanup が必要なことからも Windows は Linux とは異なっています。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C言語のソケットでbad file descriptor

#3

投稿記事 by みけCAT » 9年前

masyumaro_sec さんが書きました:送信側はしっかり送信できているはずなのですが
「送信できているはず」と思い込むだけでなく、きちんとパケットキャプチャなどで確認しましたか?
masyumaro_sec さんが書きました:受信側のrecvで
bad file descriptorエラーが出ていることが分かりました。
受信側に(送信側にも)「recv」が見当たりません。
ここに貼られたコードは本当に実行しているものですか?
もしそうなら、「recv」とは何のことですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

masyumaro_sec
記事: 4
登録日時: 9年前

Re: C言語のソケットでbad file descriptor

#4

投稿記事 by masyumaro_sec » 9年前

Send,Recvに変えたことで転送に成功しました。
ありがとうございます。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 解決済み

#5

投稿記事 by みけCAT » 9年前

無駄に記事を削除してはいけません。

C言語何でも質問掲示板~規約~
3. 禁止行為について

以下の行為を禁止行為として定めます。

(中略)


[C言語何でも質問掲示板でのみ適用される事項]

名前を複数利用して質問する行為
記事の内容を無暗に変更する行為
自分勝手な都合で記事を削除する行為
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: 解決済み

#6

投稿記事 by Dixq (管理人) » 9年前

自分の都合で記事を削除するのは規約違反行為ですので、今後されないようにご注意ください。

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

Re: 解決済み

#7

投稿記事 by naohiro19 » 9年前

  • こちらから送ったプライベートメッセージに答えようとしない
  • 勝手に記事内容を削除する行為
  • フォーラムルールの無理解
質問内容を削除するなどは言語道断です。
最後に編集したユーザー naohiro19 on 2016年7月23日(土) 19:06 [ 編集 3 回目 ]

アバター
asd
記事: 319
登録日時: 14年前

Re: 解決済み

#8

投稿記事 by asd » 9年前

google検索のキャッシュに残っていたようなのでそれを基に元投稿を載せてみます。

以下、元の投稿
表題:C言語のソケットでbad file descriptor

ファイル転送プログラムをつくっていてファイルが転送できていないので
デバグプリントをしながらつくっていました。
送信側はしっかり送信できているはずなのですが受信側のrecvで
bad file descriptorエラーが出ていることが分かりました。
何処が間違っているのか分かりません。
ヒントだけでも教えて頂けるととても助かります。
コードが汚いのはご了承ください(´;ω;`)

送信側

コード:

 
#include <stdio.h>
#include <errno.h>
#include <Windows.h>
 
#define Port 4444
#define IPaddr "127.0.0.1"
 
int main(void){
 
    FILE *fp;
    SOCKET sock;
    int i = 0;
    int num_read = 0;
    char buffer[4096];
 
struct sockaddr_in addr;
 
WSADATA wsaData;
 
    WSAStartup(MAKEWORD(2,0), &wsaData);
  sock = socket(AF_INET, SOCK_STREAM, 0);
 
  addr.sin_family = AF_INET;
  addr.sin_port = htons(Port);
  addr.sin_addr.S_un.S_addr = inet_addr(IPaddr);
 
  if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) != 0){
        return -1;
    }
 
 
    fp = fopen("test.jpg","rb");
    if(!fp){
        printf(" Can't open file(test)...\n");
    }
 
printf(" Send start.\n");
    while(num_read = fread(buffer,1,sizeof(buffer),fp)){
        i += 1;
        printf(" count: %d\n",i);
      if(write(sock,buffer,num_read) < sizeof(buffer)) break;
        printf(" Sent buffer\n");
    }
 
printf(" end\n");
 
fclose(fp);
closesocket(sock);
WSACleanup();
 
system("pause");
 
return 0;
}

受信側

コード:

#include <stdio.h>
#include <errno.h>
#include <Windows.h>
 
#define Port 4444
 
int main(void){
 
  WSADATA wsaData;
    SOCKET sock,sock0;
  FILE *fp;
    struct sockaddr_in addr;
    struct sockaddr_in client;
    int len;
  int i = 0;
  int num_read = 0;
  char buffer[4096];
 
    printf("[-] Waiting connection...");
 
  WSAStartup(MAKEWORD(2,0), &wsaData);
 
  sock0 = socket(AF_INET, SOCK_STREAM, 0);
  addr.sin_family = AF_INET;
  addr.sin_port = htons(Port);
  addr.sin_addr.S_un.S_addr = INADDR_ANY;
  bind(sock0, (struct sockaddr *)&addr, sizeof(addr));
  listen(sock0, 5);
 
  len = sizeof(client);
  sock = accept(sock0, (struct sockaddr *)&client, &len);
  printf("\n [*] Accepted connection from %s\n",inet_ntoa(client.sin_addr));
 
 
fp = fopen("cpy.jpg","wb");
 
if(!fp){
  printf(" Can't open file(cpy)...\n");
}
 
printf(" Receive Start.\n");
while( num_read = read(sock,buffer,sizeof(buffer)) ){
  i += 1;
  printf(" count: %d\n",i);
  printf(" num_read = %d\n",num_read);
  fprintf(stderr, "%d %s\n", errno, strerror(errno));
  if(fwrite(buffer,1,num_read,fp) < sizeof(buffer)) break;
  printf(" writed file \n");
}
 
printf(" end\n");
 
fclose(fp);
closesocket(sock);
closesocket(sock0);
WSACleanup();
 
system("pause");
 
return 0;
 
}
Advanced Supporting Developer
無理やりこじつけ(ぉ

閉鎖

“C言語何でも質問掲示板” へ戻る