68user's page 掲示板

Prev< No. 3103〜3108> Next  [最新発言に戻る] [過去ログ一覧]
No. 3103 # wataru [E-mail] 2003/02/18 (火) 14:45:54
send()について教えてください。

send()にてデータを送信しようとするとperrorにて「Illegal Seek」
と返ってきます。もちろんデータも送信できていません。

この現象の原因と対処法を教えていただけないでしょうか?
socketとconnectはできています。

No. 3104 # 68user 2003/02/18 (火) 15:02:41
>>3103 wataru
> Illegal Seek
ってことは errno が ESPIPE なのでしょうけれど、手もとにある FreeBSD と
Solaris2.6/8 を見ても、send(2) が ESPIPE を返すとは書いてありませんので、
わかりません。

てゆーか、OS 名も、OS のバージョンも、エラーの起こるコード例も提示せず
質問している、あなたという人間がわかりません。

No. 3105 # wataru [E-mail] 2003/02/18 (火) 16:09:42
ご無礼大変申し訳ありませんでした。現在私はHard Hut Linux2.0
でプログラムを組んでいます。

原因のソースコードは以下の様です。

    if ((*s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { // TCPでソケットを開く
        perror("socket");
        s_vMsgSnd(TSK_ER , 71 , 40);
        return -1;
    }
    syslog(LOG_DEBUG,"s = %d",*s);
    syslog(LOG_DEBUG,"port = %d",port);
    
    // 接続に必要な情報を設定する
    memset((char *) &server, 0, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = dst_ip; //<GT_0010>
    server.sin_port = htons(port);

    s_vSigTimer(TIMER_START);
    alarm(TIMEOUT_SEC);
        if (connect(*s, (struct sockaddr *) &server, sizeof server) < 0) { // サーバとのコネクションを確立する
            perror("connect");
            s_vSigTimer(TIMER_STOP); return -1; //<GT_0003> add
        }
        s_vSigTimer(TIMER_STOP);
        signal(SIGPIPE,ReCNCT);
        if(usCnctNG == FLAG_ON)
            return -1;

上記の方法でconnectまで持っていきます。
その後

    while(sendbytes < MaxLENGTH){
            nSended=send(*s,psz,strlen(psz),0);
        if(nSended == -1){
            perror("SendError:"); s_vMsgSnd(TSK_ER , 71 , 57);
            s_vSigTimer(TIMER_STOP);return -1;
        }else if(counttim > 0){
            syslog(LOG_DEBUG,"+*+*+*+*time over +*+*+*+*");
            s_vSigTimer(TIMER_STOP);return -1;
        }
        psz+=nSended;
        sendbytes+=nSended;
    }

でMaxLENGTHに達するまでデータを送信します。

No. 3106 # bebe 2003/02/18 (火) 17:32:36
>>3102 68user
解凍有り難うございました。
        (1)% find . ! -user root ⇒うまくいきました。
        (2)% find . -false -user root
        (3)% find . -not -user root

(2)(3)は、ダメでした。オプションエラーになってしまいます。
でも、(1)だけでも使えればとりあえずはOKなので、重宝しています。

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3107 # 68user 2003/02/18 (火) 20:56:27
>>3105 wataru
> Hard Hut Linux2.0
Embedded ですか (Hut じゃなくて Hat ですね)。この OS の存在を
初めて知りました。

    http://www.linux.or.jp/JM/html/LDP_man-pages/man2/send.2.html
の内容が正しければ、Linux の send(2) は ESPIPE を返しません。

ただし開発元がカーネルに手を入れている可能性があるので
Hard Hat Linux の send(2) は ESPIPE を返すのかもしれません。
マニュアルに send(2) がどういうときに ESPIPE を返すか書いて
ありませんか?

# まぁライセンスは GPL でしょうから、最悪ソースを読めばわかる
# わけで。

あと、
>>3105 wataru
のソースを眺めましたが、間違いらしきものは見付けられませんでした。

ただ、TCP では普通 send(2) は使いません。別に使っても構わない
はずですが、埋もれているバグを踏まないという意味では、素直に
write(2) を使った方がよいと思います。ただ、それで直るかどうかは
わかりません。

あとは、マルチスレッド環境なので errno の値が別のスレッドに上書き
されたとか…(多分違うと思いますけど)。

No. 3108 # 68user 2003/02/18 (火) 23:02:18
>>3102 68user
> ソースを見ると -not は効きそうなんだけれども。
そっか。

options はソートされていることが前提なのに (bsearch(3) に渡すから)、
        { "-nouser",c_nouser,f_nouser,0 },
        { "-not",c_simple,f_not,0 },
の順で並んでいるからか。

# http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/find/option.c?rev=HEAD

Prev< No. 3103〜3108> Next  [最新発言に戻る] [過去ログ一覧]