1 名前:ftp-data mailto:sage [2007/08/07(火) 01:47:35 ] 主にソケットに関しての質疑応答スレッドです。 Programming UNIX Socket FAQ (日本語訳) www.kt.rim.or.jp/~ksk/sock-faq/indexj.html Winsock Programmer's FAQ (日本語訳) www.kt.rim.or.jp/~ksk/wskfaq-ja/ 関連リンクは>>2-10 辺り 足りなかったら適当に付け足してね 前スレ ネットワークプログラミング相談室 Port19 pc10.2ch.net/test/read.cgi/tech/1159692799/ 関連スレ Java ネットワークプログラミング 【教えて!】 pc11.2ch.net/test/read.cgi/tech/1086238859/
426 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 17:57:47 ] いやX3010のうちX3010:2003がC99相当
427 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 18:18:53 ] >>426 なるほど
428 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 18:20:21 ] intのサイズはどうでもいいというか決まってないよね?
429 名前:デフォルトの名無しさん [2007/11/12(月) 10:02:48 ] AcceptExの完了をGetQueuedCompletionStatusで捕捉できない・・・ その次のクライアントからの送信はGetQueuedCompletionStatusで捕捉できるのですが 第4引数のLPOVERLAPPEDはAcceptExに渡したのがきます。 >< 期待したのは メインスレッドでAcceptExを呼ぶ -> クライアントがconnectしてくる -> ワーカースレッドで呼ばれてたGetQueuedCompletionStatusが処理を返す -> クライアントが"Hello"と送る -> ワーカースレッドで呼ばれてた(ry という感じなのですが 実際は メインスレッドでAcceptExを呼ぶ -> クライアントがconnectしてくる -> まだGetQueuedCompletionStatusから返らず@ワーカースレッド -> クライアントが"Hello"と送る -> ここで初めてGetQueuedCompletionStatusが処理を返す となってしまします。 初めてGetQueuedCompletionStatusが返ったときのOVERLAPPED::InternalHighは5となっておりクライアントからの送信に反応したものと思われます。 AcceptExの完了を捕捉しないのが仕様かと思ったのですが ttp://www.codeproject.com/useritems/iocpwalkthrough.aspのコードを見てみるとワーカースレッド内にswitch文内をみるとsend、recvのみならずacceptも捕捉できることを 前提として書かれてるように見えます。 しかし実際コンパイルして実行してみるとやはり上記とおなじことになってしまいました。
430 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 13:13:54 ] いや仕様だし。
431 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 13:52:02 ] >>429 MSDN読んだら。 データを受け取るまで待ちたくないのなら、 dwReceiveDataLengthに0を渡すと良さげ。
432 名前:429 mailto:sage [2007/11/12(月) 16:22:13 ] >>431 おおおおおお ありがとうございます dwReceiveDataLengthに0を指定し期待していた動作を得られました MSDNのdwReceiveDataLengthの説明のところにもろに書いてありました 不覚orz
433 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 22:14:33 ] VB.netのUDPの使用について質問があります。 2台のコンピュータ間で互いに自身の画面をキャプチャして相手に送るソフトを作っています。 それを送信して、受け取り、見ることはできるようになったのですが、外部ネットワークとの通信ではうまくいきません。 恐らく、データの重さから途中でパケットが消えているのだと思うのですが…。 流石に現段階よりもさらにデータを少なくすると、とても見れたモノではないので、 パケット分割をして送信しようと思うのですが分割方法がわかりません。 ※ローカルネットワークではできています。 送信はキャプチャ画像を一旦メモリーに保存し、それをbyte配列に直して送信しています。 TCPは通信する相手との問題で採用する気はありません。 もし、出来ている時点までのソフトウェアのソースコードが必要なら自サイトにアップロードしダウンロードできる状態にします。 開発環境はVB2005、通信相手とはUDPを使用した単純な文字列のみのチャットなら出来ています。 よろしくお願いします。
434 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 23:02:36 ] >>433 うるせえボケTCPでやれ
435 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 23:10:59 ] UDPでやっていちいち検証するくらいならTCPの方がいい
436 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 00:59:48 ] それかRTPを使え。
437 名前:デフォルトの名無しさん [2007/11/13(火) 09:17:27 ] >433 ホールパンチングが必要ならTCPで外にサーバを立てろ。 遅延の問題ならTCPで多重化しろ。 単にFAQ読んでないだけだろ?
438 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 11:17:41 ] >>363 WindowsでのIPv6プログラミング講座 第1回 www.ipv6style.jp/jp/apps/20051024/index.shtml www.ipv6style.jp/jp/list/2005
439 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 16:12:57 ] >>434-437 返信ありがとうございます。 パケットの分割でなんとかなるかと思いましたが、思いのほか他の方法でする回答が多かったので、一から仕様を変更しようと思います。 ありがとうございました。
440 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 17:20:23 ] FTPでQUIT発行してbyeした時に、通常なら受信したバイト数とかの情報を返してくるんだけど、 返って来ない場合があります。どう直せばよいのでしょうか? 221-You have transferred 0 bytes in 0 files 221-Total traffic for this session was 834 bytes in 0 transfers. 221-Thank you for using the FTP service on ftp4.geo.bbt.yahoo.co.jp. 221 Goodbye.
441 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 17:25:40 ] なぜここに?
442 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:15:47 ] tool-6.net/?TESTA Apache2で実行すると 400 Bad Rqest Errorが出るんですが、原因がわかりません。 なぜなんですかね?
443 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 22:40:45 ] HTTP1.0にしたらうまく動作したんですが、1.1ではなぜ出来ないんですかね?
444 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 22:46:49 ] Host情報送って無いんじゃね?
445 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 23:24:51 ] Host情報を送る際のコードが載っているサイトとかないですかね?
446 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 23:30:39 ] 新宿2丁目と
447 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 23:39:12 ] 歌舞伎町
448 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 23:41:03 ] 郵便局
449 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 00:18:05 ] 自力で調べろや坊主 って事ですか?
450 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 00:35:54 ] windumpでパケット調べろ。
451 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 19:10:35 ] GetTCPTableとかで取得したTCPコネクションを切断するにはどうすればいいんですかね?
452 名前:デフォルトの名無しさん [2007/11/15(木) 21:09:01 ] HTTP1.1での通信方法がのっているサイトありましたら教えて頂けませんか?
453 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 21:42:30 ] Host情報を送ってHTTP1.1で通信するのは何も難しいことじゃないが今は1.0でええじゃないか きっとおまえさんにゃまだ早いんだよ
454 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 03:06:54 ] RFCも読まずにHTTPをしゃべろうという人を困らせるために、 サーバはPOSTに対してできるだけ 100 Continue を返すべき。 何かと思ってちゃんと調べるだろうから。
455 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 03:20:59 ] >>452 ttp://ftp.rfc-editor.org/in-notes/rfc2616.txt 分かりやすい日本語サイトなら ttp://www.studyinghttp.net/rfc_ja/ とか・・・
456 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 03:25:26 ] >>454 いや、いっそのことRFCそのものを返したらどうだろう?
457 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 03:52:54 ] でもHTTPとかContent Length義務にしてくれたほうがいいよなー もし最初の200バイトだけ送信して何もレスポンスがないまま5分たってから 残りを送信する仕様の(糞)サーバがあったとして、 Content Lengthが義務だったら待ちつづけるし。。。 あといきなりデータ送信終了してもcloseかけてくれない(糞)サーバがあったとしたら、 データがいつ終わったのか分からないし。。。
458 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 04:34:14 ] >>457 それどちらも Content length の有無と関係ないですよ。
459 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 04:47:06 ] いや例えば後者の場合、サーバがデータ送信終了してもクライアントでrecvの戻り値が0になるなり なんなりしなきゃ終わったかどうか分からなくないですか? Content-lengthあればrecvの戻り値が0であろうがなかろうがそこで自信を持って切れますし。。
460 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 04:59:36 ] >>459 えーとつまり「RFC違反だけど content length だけは正常に返す」という サーバを救済できるから、content length を RFC で義務化すべき、 ということですか? レスポンス開始時にはサイズが分からないので Connection: Close で返す、 というまともなサーバを実装不可能にしてまでやる意味があることとは、 あんまり思えないです。
461 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 05:06:06 ] そうだなレスポンス開始時にサイズが分からないこともあるか。 スマンカッタ でもRTSPとかはContent Length義務だよね。 そうしないとデータ境界わけわかんなくなるし。 こっちのほうがクライアント側がやりやすかったんで 言ってみただけだわ。
462 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 05:14:00 ] なんのためのチャンクだ
463 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 06:09:06 ] >>461 アホですね。
464 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 12:02:36 ] >>462 チャンクってRTSPにもHTTPにもないだろ?
465 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 12:20:06 ] TCP/IPソケット通信で質問します。 一度connectしたら常時接続のままという使い方をしてるんですが、 通常サーバ − クライアントどちらかでソケットcloseすると切断を検出出来ると思うんですが、 相手がcloseしないでリブートなどを行うと切断検出できません(無効となったソケットを維持) プログラムから一定間隔でping通信する 1通信毎にセッションを閉じる(頻繁に通信が発生するのであまりやりたくない) 空の電文を常時やり取りして生存を確認する もっとほかに断検出する良い方法があったら教えて下さい
466 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 12:41:39 ] >>465 TCPはそういうもの。 途中のルータが落っこちても一緒。 TCPとしては検出する仕組みをもっていない。 アプリで検出したくなければ、KeepAliveするぐらいかな。
467 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 12:59:25 ] >>464 >チャンクってRTSPにもHTTPにもないだろ? はぁ?
468 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 13:03:34 ] >>465 > 空の電文を常時やり取りして生存を確認する TCPはデータストリームなので、空のパケットは送れません。 1. データストリームの中のデータを型付けして、 通常データ以外に、alive check用パケットも送れるようにする。 2. keepalive socket optionを使う。(詳しくはFAQを>>1 ) 1.はICMP pingと違って、hostの死活でなく、 peerの死活を調べられるという利点があります。 >>466 「TCPが」というか分散環境ってそういうものだしね。 単純に落ちるfailure以外に、Content-Length: が違うなど、 mal-functional failureだって起りうる。
469 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 13:05:11 ] >>464 ハイパーテキスト転送プロトコル -- HTTP/1.1 3.6.1 チャンク形式転送コーディング www.studyinghttp.net/cgi-bin/rfc.cgi?2616#Sec3.6.1
470 名前:467 mailto:sage [2007/11/16(金) 13:08:15 ] まあchunkedなんてあんま使われてないけどな 自分で使うことはほぼ皆無だし
471 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 13:38:03 ] はぁ?
472 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 14:03:31 ] ム板で騙りとかどんだけ暇なんだよ
473 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 15:26:33 ] >>466 >>468 ありがとうございます。 2.のkeepalive socket optionを試してみます
474 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 15:31:29 ] keepaliveって検出までに2時間ぐらいかかるんじゃなかったっけ
475 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 16:17:42 ] 設定できる。 Windowsはタスクごとに設定できる。
476 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 19:07:36 ] ほんとだチャンクあったんだ。 でもほとんど使われてないよねこれ。
477 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 19:20:15 ] え?apacheなCGIに1.1で喋りかけてみたら、Chunkedな応答を 戻されて焦ってRFC2616読んだ、みたいな経験はないの? delegateに1.1で中継してもらったら、ChunkedとContent-Lengthが同時に 戻ってきて、MLとかみるとどうみても意図的なRFC違反ですありがとうございました、 みたいな経験はないの?
478 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 19:22:04 ] >>476 脳内乙 君はプログラマに向いてません。
479 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 19:34:56 ] >>478 あっそwwww じゃあ実際にコアな部分で使われてるオープンソースのプロジェクトを10個くらい挙げてみてよ。 RFCに準拠させるために実装が必須なサーバは除くよ。
480 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 20:05:31 ] Google code searchも知らないし、 Google APIも使ったことないし、 本当にプログラマじゃないんだろ。 荒れるから放置しる
481 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 20:05:33 ] 例えば2chの.datを全取得する時、大きなものは当然のようにchunkedで返ってくるんだけど
482 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 20:10:19 ] もう一つ HTTP/1.1またはKeep-Aliveで、複数の、 CGIやSSI等のContent-Length不明な物を連続してGETすると mod_deflateによる圧縮が無ければ、当然chunkedで返ってくるね。 >481のは逆に、圧縮時に圧縮後のサイズが64Kを超えた場合のみだけど。
483 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 20:17:29 ] ごめん嘘だ。 HTTP/1.0だったら、Keep-Aliveでも chunked使われるわけ無いな。強制切断だね。
484 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 20:18:10 ] 最近のHTTPライブラリでchunkedサポートしてないのは皆無といっていいし、 HTTP系のRPCは全部chunkedサポート前提だろ。>>480 にあるGoogle APIとか。
485 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 21:02:26 ] chunkedって実装がめんどうなんだよなあ。。。 俺はCGIは全出力結果を取得してからcontent-length付きで投げる派
486 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 00:19:16 ] 余程レスポンスがでかくなければそれでもいいんじゃね
487 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 00:48:53 ] >>485 CGIの場合は特に何も考えずにただ出力すれば HTTPサーバが勝手にchunkedにしてくれるぞ
488 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 01:19:32 ] >>487 受け取る側の実装が、さ>めんどくさい ところで一般的なデータの送受信を行う際に、 効率の良いやり方はどんな感じなんだろう? TAP <--> NIC <------------> NIC <--> TAP のようなtap間のやりとりをするプログラムを作っているんだが、 max = MAX(NIC,TAP); while(1){ FD_ZERO(&read); FD_ZERO(&write); if ( 出力バッファ > 0 ) FD_SET(NIC, &write); if ( 入力バッファ > 0 ) FD_SET(TAP, &write); FD_SET(NIC, &read); FD_SET(TAP, &read); select(max+1, &read, &write); if ( FD_ISSET(NIC,&read) ) NICから入力バッファへ if ( FD_ISSET(TAP,&read) ) TAPから出力バッファへ if ( FD_ISSET(NIC,&write) ) 出力バッファをNICへ if ( FD_ISSET(TAP,&write) ) 入力バッファをTAPへ } 単純に考えたらこれなんだけど、他に何か工夫あるかな?
489 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 01:35:27 ] >>受け取る側の実装が、さ>めんどくさい そのレベルならWinInetでも使ってろ Winならだが
490 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 09:13:18 ] >>488 釣りですかね…
491 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 09:47:19 ] 無知なだけだろ。放置しる
492 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 11:27:48 ] 俺には>>488 のどこが釣りなのかわからん・・・ 誰か解説plz
493 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 14:28:52 ] >>492 釣りではないよ
494 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 14:51:36 ] selectの引数の数は合ってないし、返値もみてないのに、 律儀にmax取っていたり、釣りか間抜けとしか思えん。 効率とか言っちゃってんのワロス
495 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 15:40:06 ] >>494 省略しただけだろ エッセンスの方を見ろよ
496 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 16:10:53 ] おいしい成分は何ひとつありませんでした ちゃんちゃんw
497 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 17:55:11 ] epollを使ってて、切断を検出したいんだけど、 EPOLLOUTが帰ってきたあと、recv(...) == 0だったらclose。 という流れを使ってるんだけど、 EPOLLHUPを使って切断って検出できない?
498 名前:デフォルトの名無しさん [2007/11/19(月) 10:16:40 ] Linuxでプログラム書いてますが、 ソケットの状態を取得する関数はありますか? getsockoptは状態ではなく設定を取得する関数なので要領を得ません とりあえず、接続中か接続済みか未接続かを ソケットディスクリプタから得るだけでもいいです
499 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 10:44:23 ] >>498 getpeernameあたり。
500 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 11:09:21 ] >>499 なるほどその手があるのか ありがとう
501 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 15:44:17 ] >>497 やりたいのはずばりEPOLLRDHUPでのedge triggerちゃいますの?
502 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 18:03:29 ] >>501 エッジトリガっていうのかどうかわ解らないけど、 向こう側でソケットをcloseしても、こっちにHUPが飛んでこないんです 向こう側がcloseしてソケットを閉じたら、HUPが飛んできてほしい。 飛ばない仕様になってるならrecv==0を使うけど。 誰か詳しいひとおせーてください
503 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 18:13:15 ] >>502 提供された情報に反応してください。
504 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 08:52:58 ] >>503 HUPが来ないんじゃ仕方ない
505 名前:デフォルトの名無しさん mailto:age [2007/11/21(水) 10:20:39 ] solarisで開発してるんだけど、 ノンブロッキングモード(?)でrecv()の戻り値が -1なんだけどerrnoが0になるんだが・・・ これってどういう状態なんでしょう? 期待値としてはEAGAIN(?)だと思ってるんですが。 ソケットプログラミング素人にどなたか救いの手をorz。 ちょっと困ってるんでageで。
506 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 10:32:31 ] errnoよりperror()が使いやすいよテスト
507 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 10:35:17 ] >>506 EAGAINの度にエラー吐かれたらたまらんぞ。
508 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 10:38:56 ] そもそもエラってるのにerrnoが0? 差し支えなければ前後のソースを少し晒してくれると
509 名前:506 mailto:sage [2007/11/21(水) 11:12:59 ] >>508 ありがとうございます。えっとソースは抜粋&中略ですが、 大まかな動きはこんな感じです。 現象としては2kbyte程度のデータを流すと一度に取りきれないので、 selectで再ループして残りを取得する動作を期待しているのですが、 2回目以降のrecv()が-1となるのですが、errnoがEAGAINにならないので エラーになって回線を切ってしまいます。 試しにEAGAINと0を対象として(コメント部)selectするようにしたら、 ちゃんと残りのデータを取る事が出来ました。 while( iLeftOver > 0 ) { /* 指定バイト数を受信、または通信の遮断まで受信データを取得 */ errno = 0; if( ( iRcvRet = recv( stSocket, pcBuff, iLeftOver, iFlag ) ) == DCC_SOCKET_ERROR ) { printf("iRcvRet[%d]/recv()直後errno[%d]\n", iRcvRet, errno); iErrCode = dwp_getErrNo(); if( EAGAIN == iErrCode ) //if (( EAGAIN == iErrCode ) || ( 0 == iErrCode )) { /* 受信準備ができていない場合、selectで受信するまで待つ */ FD_ZERO( &stFdSet ); FD_SET( stSocket, &stFdSet ); dcc_setTimeval( 1000, &stTmVal ); /* 待ち時間は1秒 */
510 名前:506 mailto:sage [2007/11/21(水) 11:14:48 ] (一回で送れませんでした。続きです・・・) iSelectRet = select( FD_SETSIZE, &stFdSet, NULL, NULL, &stTmVal ); if( iSelectRet == DCC_SOCKET_ERROR ) { /* selectのエラー */ (中略) return DCC_SOCKET_ERROR; } if( iSelectRet == 0 ) { /* タイムアウト */ (中略) return DCC_SOCKET_ERROR; } /* 受信を検知 */ continue; } /* 受信エラー */ (中略) return DCC_SOCKET_ERROR; } else if( iRcvRet == 0 ) { /* 通信の終了 */ (中略) return 0; /* 通信の切断 */ } /* 一度のrecvで受信し切れなかった場合、受信サイズ、バッファの位置を書き換えて 再度recvを行う*/ iLeftOver = iLeftOver - iRcvRet; pcBuff += iRcvRet; }
511 名前:506 mailto:sage [2007/11/21(水) 11:17:40 ] あまり意味ないけどコンソール上には >iRcvRet[-1]/recv()直後errno[0] 表示されてしまいまふ。
512 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 13:52:59 ] #include <errno.h>はインクルードしてますか? (必要なOSの場合に; 今時pthread絡みで必ず必要だけど) 自分でextern int errnoしてたら殺しますよ。
513 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 14:36:48 ] errno=0をerrno=100にしたら100のままだったりしてねw
514 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 14:38:18 ] Linux&(C or C++)でhttps通信を利用したプログラムを作りたいのですが、 httpsを利用できるライブラリは無いでしょうか。 ghttpがあったのですが、httpsには対応していないようで困っています。
515 名前:506 mailto:age [2007/11/21(水) 15:25:02 ] >>512 errno.hはインクルードはしてあります。 その直後にextern int errnoもしてました。 これは不味いんですか? 恥ずかしながらUNIXはホントわからないんです・・・。 >>513 まさにその通りです。 recv()の前後でerrnoの値が全く更新されません。 と、言うことで「extern int errno」の行を削除して みたのですが現象は変わりません。 その書き込みから見ると非常に基本的な部分で間違いが あると思いますがなんとも分かりません。 他に考えられる原因はありますでしょうか? その他のソース部分には、errno.hのインクルード等は されていません。 ちなみに動作環境はsolaris8、開発環境はeclipse+CDTで、 コンパイラはgccのVer2.8.1を使ってます。 厨な質問で申し訳ないです。m(__)m
516 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 15:42:46 ] >>515 errnoが通常の変数の場合、マルチスレッド環境だと、errnoを取得する前に別スレッドが書き換えてしまう ケースがあり、正常に動作しないので、 最近のOS/ライブラリでは、#defineで「errno」をスレッドごとに確保された記憶領域へアクセスする関数に 置き換えてる。
517 名前:506 mailto:sage [2007/11/21(水) 15:58:11 ] >>515 お付き合いありがとうございます。 要は「#include <errno.h>」のみやれば良いとの認識で 良いでしょうか? manpageによると ------------------------------------------------------------ errno は、ISO C standard で int 型の変更可能な左辺値として 定義されており、明示的に宣言を行ってはならない; errno はマクロの場合もありえる。 errno はスレッド毎に値を持つ。 つまりあるスレッドで errno が設定されても、他のスレッドの errno には 影響しない。 ------------------------------------------------------------ とありました。 しかし、#include <errno.h>をしているのは、 私がUPしたソースのあるファイルのみでしか宣言してなく、 マルチスレッド環境ではありますがこのソースは、 単一のスレッド上でのみ動きます。 (上の説明からだと複数で動いててもそれぞれ独立してerrnoを 持っていると言う事になると思いますが。) にも関わらず>>513 のような挙動になるのは何故なんでしょうか? どこか別のヘッダ等でexternとかしてるんでしょうか・・・ だから俺には短期間じゃ無理な作業だと言ったのに(T。T)>>会社 と、愚痴をこぼしてみる。スイマセン。
518 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 16:23:23 ] とりあえずな、>>506 の言う通り、 perror()をprintf("iRcvRet〜の前に付け加えてみな。 後ろじゃダメだぞ。
519 名前:506 mailto:sage [2007/11/21(水) 16:48:59 ] >>518 ありがとうございます。perror()を使用したところ >>recv(): 資源が一時的に使用できません。 と返ってきて、EAGAINである事が確認出来ました。 と、なると後はなんでerrnoが変更されないのかですね。 一歩前進(?)しましたありがとうございます。 絞る知恵もなくなったので、ネットで検索しまくってます。
520 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 17:11:11 ] 環境のせいかもね 1. errno.h にバグがある 2. インクルードしている errno.h のパスがおかしい 3. ライブラリとコンパイラが不整合
521 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 17:25:47 ] ネットワーク関係なくなってきてるが、 #include <errno.h> int geterrno(void) { return errno; } これだけのファイルをgcc -Eしてみな。 int geterrno(void) { return (*__アドレス返す関数名()); } にならないとまずい。 なってるならソースコードのerronoをgeterrno()に変えて終了。 左辺値参照はどうせまともな意味のあるコードないだろうし。
522 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 18:20:38 ] gcc 2.8.1ってなんだよ… 2.95.4とかなら分かるけど。 窓から捨てろ
523 名前:506 mailto:sage [2007/11/21(水) 22:35:07 ] >>520-522 お返事遅くなってしまいました。 すみません&ありがとうございます。 >>521 明日試してみます。 >>522 用意されたサーバのを使ってるだけなので 私はどうにも出来ませんorz。 察するに「古くて使い物にならねー。」って事で 良いでしょうか?このあたりも原因あるのでしょうか・・・ ソケットなんて昔からあるので大丈夫な気もしますけど。 スレ違いにもなりかけてるので、以上を踏まえて精進します。 皆さん長々とお付き合い下さってありがとうございました。 感謝します(-人-)
524 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 07:17:32 ] サーバ上のCGIに文字列を渡して、その文字列を保存しようとしてるのですが 日本語等の2バイト文字を渡すと正常に受け取ってくれません。 char *mozi = "test.cgi?,testあ" hRequest = HttpOpenRequest( hHttpSession, "GET", mozi,//■CGIへ渡す文字列です NULL,NULL,NULL,0,0); 上記では「testあ」という文字列をCGIに送信していますが、CGI側では 「test0x000000000008p-10224」 という風に2バイト文字のみエラー認識されてしまいます。 どうすればCGIに2バイト文字を送信できるのでしょうか?
525 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 07:44:54 ] %82%A0%82%D9
526 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 07:49:32 ] char *mozi = "test.cgi?,test%94%C2%88%E1%82%A2" hRequest = HttpOpenRequest( hHttpSession, "GET", mozi,//■CGIへ渡す文字列です NULL,NULL,NULL,0,0);