ページ 11

解決済み

Posted: 2016年7月06日(水) 10:33
by masyumaro_sec
解決しました。ありがとうございます。

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

Posted: 2016年7月06日(水) 11:23
by かずま
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 とは異なっています。

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

Posted: 2016年7月06日(水) 13:10
by みけCAT
masyumaro_sec さんが書きました:送信側はしっかり送信できているはずなのですが
「送信できているはず」と思い込むだけでなく、きちんとパケットキャプチャなどで確認しましたか?
masyumaro_sec さんが書きました:受信側のrecvで
bad file descriptorエラーが出ていることが分かりました。
受信側に(送信側にも)「recv」が見当たりません。
ここに貼られたコードは本当に実行しているものですか?
もしそうなら、「recv」とは何のことですか?

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

Posted: 2016年7月06日(水) 17:13
by masyumaro_sec
Send,Recvに変えたことで転送に成功しました。
ありがとうございます。

Re: 解決済み

Posted: 2016年7月07日(木) 17:59
by みけCAT
無駄に記事を削除してはいけません。

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

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

(中略)


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

名前を複数利用して質問する行為
記事の内容を無暗に変更する行為
自分勝手な都合で記事を削除する行為

Re: 解決済み

Posted: 2016年7月07日(木) 23:48
by Dixq (管理人)
自分の都合で記事を削除するのは規約違反行為ですので、今後されないようにご注意ください。

Re: 解決済み

Posted: 2016年7月08日(金) 01:59
by naohiro19
  • こちらから送ったプライベートメッセージに答えようとしない
  • 勝手に記事内容を削除する行為
  • フォーラムルールの無理解
質問内容を削除するなどは言語道断です。

Re: 解決済み

Posted: 2016年7月08日(金) 14:14
by asd
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;
 
}