トップページ⇒tech
1001コメント360KB

ネットワークプログラミング相談室 Port24

■ このスレッドは過去ログ倉庫に格納されています
0001lmtp2009/07/07(火) 00:46:28
主にソケットに関しての質疑応答スレッドです。

Programming UNIX Socket FAQ (日本語訳)
 http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
Winsock Programmer's FAQ (日本語訳)
 http://www.kt.rim.or.jp/~ksk/wskfaq-ja/

関連リンクは>>2-10辺り
足りなかったら適当に付け足してね

前スレ
ネットワークプログラミング相談室 Port23
http://pc12.2ch.net/test/read.cgi/tech/1230466044/
関連スレ
ネットワークプログラミング雑談
http://pc12.2ch.net/test/read.cgi/tech/1235800707/
Java ネットワークプログラミング 【教えて!】
http://pc11.2ch.net/test/read.cgi/tech/1086238859/
0784デフォルトの名無しさん2009/09/13(日) 18:45:45
>>783
thx!
0785デフォルトの名無しさん2009/09/13(日) 18:50:10
スレッドってどれくらい作れるの?
1万個くらいつくれるの?
0786デフォルトの名無しさん2009/09/13(日) 19:27:46
大抵は、アドレス空間の大きさと、各スレッド毎の使用スタック量に左右される。
他にも制限あるだろうけどね。
07877642009/09/13(日) 19:28:48
>>780
>でもこのアプリはマルチスレッド&非ブロッキングなんですよ。

>>764に挙げたのはselectによるタイマ監視を使用しない、一般的なケースですね。
もし>>750のようにタイマ監視が前提であれば、receiveによるプロセスのブロックは
selectによる監視の妨げになりますから、非ブロッキングなreceiveを使います。
ソケットは1個でも、そのデータ受信イベントとタイムアウト発生イベントを
同時に待ち受けるわけですから、selectの利用は自然な発想だと思います。

あと>>750で気になったのは、acceptをSleepとのループで待っているとの記述です。
acceptも(receiveと同じように)TCPコネクション確立通知イベント発生をタイムアウト付きで
selectを用いて監視できます。Sleepというのが何なのか分かりませんが(おそらくは独自の
マクロかライブラリ関数?)、C標準ライブラリのsleep関数に相当ものであると仮定すれば、
sleepによる待ち時間は無駄ですから、TCPコネクション確立通知に対する応答時間を
遅延させるだけの意味しか持たないように思えます。だから一般的にはタイムアウト付きの
selectでacceptをループさせます。謎のSleepについて、調査する必要があるかもしれません。

(長いので続く)
07887642009/09/13(日) 19:34:47
(787の続き)

>しかし本当の意味?での非ブロッキングはすごく複雑そうですね・・・

非ブロッキング処理を一般的に書くと>>764のようになって難解に見えますが、
その実装方法は「イベント駆動プログラミング」です。GUIアプリ開発では一般的ですよね。
普通の対話型Cプログラムだとscanf/printfのループで処理しますが、イベント駆動なGUIだと、
まずイベント待ちループに入り、マウスクリック/キー押下イベントが発生すると、事前に
登録しておいたアクションが実行され、そのアクションの中でウィジェットを操作します。

ネットワークプログラムにおけるイベント駆動プログラミングも同様に、イベント待ちループ内の
selectでTCPコネクション確立通知/データ受信(複数)/タイムアウトといったイベントの発生を
同時に待ち受け、イベントが発生すると対応するアクションを実行し、そのアクションの中で
独自プロトコルを実装した有限状態機械(Finite State Machine)へ発生イベントを送ります。

何度か開発経験を重ね、慣れてくるとイベント駆動処理を独自のライブラリ関数として
設計できるようになると思います。またGUIアプリ開発でも考え方は同じですから、
その本質を理解できれば、Webブラウザやメーラのようなネットワーク対応GUIアプリも、
自分で一から開発できるようになる訳で、(>>781が言うように)後の人生で応用が利きます。
大変ですが技術の習得をお勧めします。
0789デフォルトの名無しさん2009/09/13(日) 19:37:05
>acceptはSleepとセットのループ
Sleep(0)を呼び出しているんじゃないのか?
Sleepに与えている時間は何ミリ秒なんだ?>>780
0790デフォルトの名無しさん2009/09/13(日) 20:29:14
通信を暗号化したいんだけど、一番ソース改変の少ない方法ってなんだろ
サーバもクライアントも自作なのでなんでもし放題です
0791デフォルトの名無しさん2009/09/13(日) 20:42:54
>>790
ipsecとか、ssh port forwardとか。
0792デフォルトの名無しさん2009/09/14(月) 00:00:25
>>787
レスありがとうございます。

同期recvのみでもデータ受信とタイムアウト発生を待機出来るような気がしますが、
やはりselectの方が良いのでしょうか?

sleepは>>789さんの仰る通り、Win32APIのSleepを呼び出しているようです。
接続が無い場合の無駄なループを減らすためか、100ms待機しています。
しかし>>787さんのselectを使う方が理にかなっていますね。
あと勘違いしてましたが、acceptの場合は非ブロッキングやselectのメリットって多いんですね。
というか同期acceptのみだと、停止(やるとすると無理矢理かWSACancelBlockingCallかな?)や受け入れ数制限とか出来ないんですね。

>>788
おかげさまで少しだけイメージが掴めてきたような気がします。
でもブロッキングに比べて、スレッドやメモリは節約できますが、コアが多くなるほど全体的なパフォーマンスが落ちるような気もします。
その場合はある程度接続が多くなると、スレッドを増やす感じなのかな?(イベントオブジェクトの場合は必然的にそういう実装になるようですが)

おもーい腰を上げて、もう少し他のP2Pあたりのソースコードでも読みつつ勉強しようと思います。。
07937642009/09/15(火) 01:09:01
>>792

スマン、自分はWinSockについてはまるで詳しくない。
勝手にUNIXソケットだと思い込んでレスしてた。

>同期recvのみでもデータ受信とタイムアウト発生を待機出来るような気がしますが、
>やはりselectの方が良いのでしょうか?

UNIXの場合は(シグナルを除いて)receiveではタイムアウト発生を待機できないから、
select使用が必須になる。WinSockが待機できるのなら、それで実装してもいいと思う。
自分なら(>>788で述べた)イベント待ちループ内で、すべてのイベント発生を待機させるけどね。
言い換えると、selectを使用して、イベント監視を1カ所に局所化した設計を選ぶ。

ただ、(>>783が指摘しているように)WinSockはselectのオーバヘッドが大きい。
だから、receiveで待機させる設計を選んだのかもしれない。自分に分かるのはここまで。
(UNIXであれば、それなりのリソースを用意することで、数10から数百TCPコネクションくらい
 までなら実用的な性能を実現できる。シングルプロセッサの時代には多用された手法です。)

>でもブロッキングに比べて、スレッドやメモリは節約できますが、
>コアが多くなるほど全体的なパフォーマンスが落ちるような気もします。

その通りだと思う。

今でもシングルスレッド&非ブロックが多用されるのは、クライアントの開発。
GUIツールキットがあるから、マルチスレッディングが使いづらいのと、
性能や規模拡大性(スケーラビリティ)は、それほど重視されないのが理由。(Winnyが典型例かな?)
サーバ開発で採用されるのは、組み込み用途でリソースが極端に制限される場合が多い。
今時のサーバ開発では、(UNIXであっても)マルチスレッディングが一般に採用されるはず。
0794デフォルトの名無しさん2009/09/15(火) 09:29:25
winsockについてですが、TCPサーバーで既に1つクライアントがacceptして接続しているとき、他のクライアントが接続してきても最初のクライアントがcloseするまで受け入れずに待機させたいときどうやれば良いですか?
0795デフォルトの名無しさん2009/09/15(火) 10:22:15
最初のクライアントがcloseするまでacceptせずに放っておけばいいかと
0796デフォルトの名無しさん2009/09/15(火) 16:30:18
>>793
マルチスレッドだと、スレッドからのプロセスのフォークが怖かったので
シングルスレッドでやることが多かったな。
今は怖くないから問題ないけど。
0797デフォルトの名無しさん2009/09/15(火) 17:39:29
winsockで複数のクライアントから接続要求があったとき、サーバーで意図的な順番で並ばせる方法はありますか?
たとえば210.58.02.XX君は58.697.67.XXX君の後ろで・・・とか
0798デフォルトの名無しさん2009/09/15(火) 17:45:27
待ち行列作って並ばせればいいだけじゃないの?
0799デフォルトの名無しさん2009/09/15(火) 17:49:30
接続要求を受けるためにはacceptする以外の方法はない。
acceptする場合にクライアントの選択は出来ないので、不可能。
0800デフォルトの名無しさん2009/09/15(火) 17:57:01
擬似的にやろうとすると
 接続要求は 即accept → クライアントのIPをプール
 予定セッション数未満ならそのまま受け付け、予定セッション数いっぱいの場合には
 優先順位の低いクライアントのIPかを判定して、そいつを切断
 クライアント側は再接続をトライさせる
こういう管理になるんかねぇ
0801デフォルトの名無しさん2009/09/15(火) 18:09:36
>>800
予定セッション数いっぱいの場合には、
acceptせずに放っておく方法(>>795)もあるね。
0802デフォルトの名無しさん2009/09/15(火) 18:16:01
予定セッション数いっぱいでも、より優先度高い接続がきたら処理する必要があるのでは?
0803デフォルトの名無しさん2009/09/15(火) 18:25:13
だから「擬似的(>>800)」なのでわ
0804デフォルトの名無しさん2009/09/15(火) 18:28:13
そうそう より優先度の高い接続を生かす為に
クライアントのIPをプール って書いたつもりだったが言葉足らずだったかも

accept 直後の奴も 一旦プールの中に収めたうえで
「プールしたIP内で最も優先度の低い接続を切断しちゃおう」 という発想ね
0805デフォルトの名無しさん2009/09/15(火) 18:30:39
なんか斧みたいなアプロダを作ろうとしてるみたいw
0806デフォルトの名無しさん2009/09/15(火) 20:19:41
切断する場合には、いきなり切る(close)んじゃなくて、
その理由をメッセージとして送ってから切る(send&close)ほうがいいだろね。
だって、せっかく待ち行列に並んでマダカナ・マダカナーって待ってたのに、
後から来たヤローに割り込まれてキャンセルさせられるわけだから涙目になる。
きちんとクライアントに説明してあげたほうがいいと思われ。

あと最初の受け付けを拒否される場合も、理由の説明は必要だろうね。
普通はクライアントが時間を置いてリトライすれば、いつかは成功するんだろうけど、
何か障害が発生していて、何度リトライしても成功しない状況だってありえるから。
0807デフォルトの名無しさん2009/09/15(火) 20:54:45
>>806
切断をする時点で明示的に切断されてるから
ある程度の説明責任は果たしてると思う。
なんか障害発生してたら接続された上で放置されたり
そもそも接続できないことがほとんどな気がする
0808デフォルトの名無しさん2009/09/15(火) 21:52:03
無限ループrecvしてるときソフト終了させるとWSACleanupしてないってことになるのか?
変な挙動起こしたりするんかな
0809デフォルトの名無しさん2009/09/15(火) 21:55:06
デバッグ中のプロセス止めるとか日常茶飯事だけど、変な挙動起こしたことは無いな。
0810デフォルトの名無しさん2009/09/15(火) 22:03:30
>>805
斧は待ち行列じゃないよ
排卵と精子の関係だお
0811デフォルトの名無しさん2009/09/15(火) 22:20:33
>>808
たぶんないな。
システムが割り当てたWSA系のリソース開放でしょ
だとすれば最悪メモリリーク起こすぐらいで挙動に大きな問題を抱えるものじゃないと思う。
0812デフォルトの名無しさん2009/09/15(火) 23:35:31
>>798
どういう意味?
0813デフォルトの名無しさん2009/09/16(水) 10:23:26
クライアントからサーバーに対してUDPパケットを送信した場合、サーバーはポートが解放されているから受信出来るとして
その後、サーバーからクライアントに返信した場合、クライアントアプリケーション側で受信できるのって

クライアントからサーバーに送信した地点で一時的にポート解放されてるから?
ファイアウォール等で受信拒否していてもつながるのも同じ理由なんだろうか

もしそうだとしたら、サーバーと通信中の2つのクライアントにお互いのIPとポートを教えて
お互いに何度かパケットを送信すれば何回目かで届き、
一度サーバーを経由するけど、そんな感じでP2Pネットワークを構築することってできる?

ためしにサンプルプログラムを組んでみたらうまくいったんだが、理論的にはどうなんだろう。
ルーターとかネットワーク環境によってはだめなんかな・・・

長文すまそ
あとスレチだったらすまそ
0814デフォルトの名無しさん2009/09/16(水) 10:45:16
全然違うから。ファイアーウォール調べ直しな。
0815デフォルトの名無しさん2009/09/16(水) 11:20:09
ああ、ファイアウォールはなかったことにしてくれ
0816デフォルトの名無しさん2009/09/16(水) 12:29:54
なら、無かった事にして質問まとめなおせ。
0817デフォルトの名無しさん2009/09/16(水) 12:46:42
>>813
セッションハイジャックとかしらべてみたらどうかな

0818デフォルトの名無しさん2009/09/16(水) 13:05:00
>>817
サーバーとの接続は公開鍵方式で、その後クライアント同士の接続はサーバーが指定した
秘密鍵で行う予定なのでその辺は問題ない…と思う

セキュリティー云々は置いといて、ファイアウォールはアプリケーション許可してもらう前提で
これで一般家庭でつながらないことは無いのかな?と思ったまでです
0819デフォルトの名無しさん2009/09/16(水) 16:04:15
winsockいじるようになってから画面右下のインターネットのアイコンが光りっぱなしになったんですがどうしてですか?
0820デフォルトの名無しさん2009/09/16(水) 16:05:20
気のせいです
0821デフォルトの名無しさん2009/09/16(水) 16:08:25
そこを何とかお願いします・・・
何か垂れ流してるみたいで気持ちが悪い
0822デフォルトの名無しさん2009/09/16(水) 16:20:02
バカか?
0823デフォルトの名無しさん2009/09/16(水) 16:23:26
バカですお願いします
0824デフォルトの名無しさん2009/09/16(水) 16:31:09
1.winsockが本気出した
2.液晶画面の局所的なフレネル反射の本気
3.819が光過敏性てんかんになった
4.ソケットを開いたプロセスが終了しきれずに生きている
5.知らね
0825デフォルトの名無しさん2009/09/16(水) 16:34:40
再起動してネット接続してもすぐに症状が出ます・・・
0826デフォルトの名無しさん2009/09/16(水) 16:37:46
6. 実は前から光りっぱなしだったが、これまでは気にしていなかった
0827デフォルトの名無しさん2009/09/16(水) 16:40:41
いえ、4日前からです。送信40kbps/受信4kbps位
0828デフォルトの名無しさん2009/09/16(水) 16:54:18
7.気になるならパケットをキャプチャすればいーじゃん
0829デフォルトの名無しさん2009/09/16(水) 20:00:09
バカさ加減酷すぎワロタwww
Wiresharkも回せないのか?
0830デフォルトの名無しさん2009/09/17(木) 09:07:17
俺的には「インターネットのアイコン」てのが気に入った。
なんでそういう単語を照れもなく使っちゃうレベルの人が
Winsock なんかに手ぇ出すかなあ。
0831デフォルトの名無しさん2009/09/17(木) 18:38:25
いつの間にか1Gbpsで繋がるようになった
0832デフォルトの名無しさん2009/09/17(木) 20:38:44
クライアントがInternets Explorerなんだけど
こいつにレスポンスコード302返したらどうなるん?
0833デフォルトの名無しさん2009/09/17(木) 21:03:23
期待通りに動く。
0834デフォルトの名無しさん2009/09/17(木) 21:36:18
IEの場合クッキー情報は一時的にTemporary Internet Filesフォルダにあると思ったのですが
セッションクッキー情報はTemporary Internet Filesに作られないのでせうか?
0835デフォルトの名無しさん2009/09/17(木) 21:49:58
あるだろ。
0836デフォルトの名無しさん2009/09/17(木) 22:40:05
セッションクッキーは永続的である必要が無いからファイルに持つ必要無いだろ。
0837デフォルトの名無しさん2009/09/18(金) 03:01:40
Firefoxだと作られるよ
0838デフォルトの名無しさん2009/09/18(金) 15:55:07
winsockについて質問です。

サーバープログラムに、クライアント数制限をつけたいと思っています。
例えば、10人までしか接続が確立できない。という類です。

FD_ACCEPTが呼ばれた際、acceptをします。
定員を超えていたら、次の行でacceptから帰ってきたSOCKET(正常なもの)をshutdownし、closesocketしました。
そうしたところ、どうやらクライアントに切断したことが伝わらないようで、クライアントのrecvがSOCKET_ERRORを返してくれません。

FD_ACCEPTを抜けた後、別の場所(メインループなど)でshutdown & closesocketした場合は伝わるようです。

・FD_ACCEPT内でclosesocketしてはダメなのでしょうか?
・そもそも上限に達していたら、acceptしないという方法はないのでしょうか?

ご教示よろしくお願いいたします
0839デフォルトの名無しさん2009/09/18(金) 16:20:07
・recvは0を返してるんじゃない?
・recvが0を返したら、通信終了でいいんじゃない?

> ・そもそも上限に達していたら、acceptしないという方法はないのでしょうか?
それぞれのクライアントに対する処理は非同期で動作してる前提で話すけど、
acceptする前に、セマフォとかで調停する。
0840デフォルトの名無しさん2009/09/18(金) 16:35:28
>>839
お返事ありがとうございます。なるほど。SOCKET_ERRORではなく、recvの返り値が0の場合も切断なのですね。
調べてみたところ、recvが0を返すのは「正常な終了」が行われた時とありました。
どうもありがとうございます。
0841デフォルトの名無しさん2009/09/18(金) 16:40:43
>>839
aaceptする前に既にクライアントには受理されたことになってしまうので
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-3.html#ss3.3
acceptする前に調停しても、クライアントには伝わらないんじゃないかな。

acceptしないだけだと、たぶんクライアント側をしばらく待たせることになるので
それよりは一旦acceptだけしてから切断するほうが親切じゃないかな。
0842デフォルトの名無しさん2009/09/18(金) 17:07:45
>>841
ありがとうございます。
最初から拒否しておく。ということはできないのですね。
意外でした。

・FD_ACCEPTの中で切断しても大丈夫
・上記の結果、クライアント側のrecvの返り値が0になる
のが確認できました。
0843デフォルトの名無しさん2009/09/20(日) 19:01:52
listenって接続くるまで実行が停止状態になるんだよね?
既に接続が確立されてる相手からの送信データを待ちつつ
新たな接続が無いかどうかチェックするにはどうしたらいいの?
0844デフォルトの名無しさん2009/09/20(日) 19:47:02
listenはすぐ戻るやろ、接続がクルまでブロックされるのはaccept

acceptでブロックされたくないなら
該当descriptorをselect/pollすりゃいい
0845デフォルトの名無しさん2009/09/20(日) 19:47:03
C/C++でのソケットだと仮定して答えると、

接続待ちになるのはacceptね。

> 既に接続が確立されてる相手からの送信データを待ちつつ
> 新たな接続が無いかどうかチェックするにはどうしたらいいの?
接続が確立した相手用に新しいスレッド起こすか、
select使って複数のソケットに対してデータ待ちするか。
Windowsなら他の方法もあったかもしれない。
0846デフォルトの名無しさん2009/09/20(日) 19:47:20
素人でしゃばんな
0847デフォルトの名無しさん2009/09/20(日) 20:06:14
>>844
select/pollのとこでフリーズしてしまいましたが。。
0848デフォルトの名無しさん2009/09/20(日) 20:30:14
>>846
別に>>844,845は、特に変な事は言っていないと思うけどな。

>>845に細かすぎる指摘(改善)すると、以下のようになるけど。

>select使って複数のソケットに対してデータ待ちするか。
 ==>select使って複数のソケットに対してデータ受信と接続を同時に待つか。

文句付けるなら、自分ならこうだ!ってのをレスしたほうがいいと思われ。
0849デフォルトの名無しさん2009/09/20(日) 20:30:42
>>848
素人でしゃばんな
0850デフォルトの名無しさん2009/09/20(日) 21:15:37
>>847
それは使い方が悪いからだろう。たぶん。
0851デフォルトの名無しさん2009/09/21(月) 02:17:11
>>849
夏厨は土に返ったはずであるが?
にーとさんかな?
0852デフォルトの名無しさん2009/09/21(月) 07:09:59
なにファビョってるんだ?
0853デフォルトの名無しさん2009/09/21(月) 12:58:08
馬鹿にはソケットは無理。
0854デフォルトの名無しさん2009/09/21(月) 14:22:25
馬鹿にも使える(ばかちょんで高パフォーマンス)ソケットというか、ネットワークライブラリ欲しいけど、
言語とかトラフィックパターン依存になるから、
プリミティブなソケット以上の共通化は不可能なのかね。
スレッドプールの共通インターフェイスが先か。
0855デフォルトの名無しさん2009/09/21(月) 15:57:50
大学はまだ夏休みだぜ
0856デフォルトの名無しさん2009/09/21(月) 16:24:00
>>847
俺のとこじゃフリーズしなかった
0857デフォルトの名無しさん2009/09/21(月) 18:27:22
>>856
select/pollのとこで止まってしまって先に進まなくなるのです。
0858デフォルトの名無しさん2009/09/21(月) 19:13:01
accept可能になるのってreadableだったかwritableだったか忘れた・・・
0859デフォルトの名無しさん2009/09/21(月) 19:19:50
readable
0860デフォルトの名無しさん2009/09/21(月) 21:17:27
クライアント側のconnectはwritableだっけ
0861デフォルトの名無しさん2009/09/21(月) 22:26:20
>>854
どこまでライブラリに機能を提供させるかという、境界線を引くのが難しい気がする。
トラフィックパターンが一方向の要求/応答に限定できるならRPC(JavaならRMI?)あるいは
HTTPライブラリで済むけど、わざわざソケットに手を出すのは、それ以外のパターンが
必要になる、ある程度複雑な(高機能な)アプリケーションを開発するケースだと思う。
ただ、そうなると、メッセージの衝突/送信権、分割/連結、優先制御/流量制御なども、
ライブラリが提供すべき機能要素として要求される(要求する人もいる)だろう。
またマルチスレッド/マルチプロセス/ファイバに関しても、どこまでライブラリで
対応させるべきか、人によって意見は分かれるはず。

だから、最終的には必要最低条件を満たしたソケットで落ち着いてしまうのだと思う。
個人的にはレコード指向(TCPのメッセージ境界対応)で全二重な機能だけを提供し、
あとは上位レイヤのプロトコル(アプリケーション)の実装にまかせる、軽いライブラリが
あってもよさげだと思うんだけどね。
0862デフォルトの名無しさん2009/09/22(火) 15:55:58
>>857
よかったね。
コード見せてくれないとわからんがな
0863デフォルトの名無しさん2009/09/23(水) 16:30:48
相手がcloseしたかどうか知るには?
0864デフォルトの名無しさん2009/09/23(水) 16:35:36
>>863
「readして読んだバイト数が0の場合」ってのじゃなくて、なんかのひっかけ?
0865デフォルトの名無しさん2009/09/23(水) 16:35:44
recvが0を返すかどうかを見る
0866デフォルトの名無しさん2009/09/23(水) 16:51:05
recvがエラーを返した場合も
0867デフォルトの名無しさん2009/09/23(水) 16:55:47
>>866 状況によるだろ?
Unix 系の EBADF, ENOTCONN, EINTR, EFAULT は
相手がクローズするしないに関わらず発生する
0868デフォルトの名無しさん2009/09/23(水) 19:07:23
>>867
EINTR以外はプログラムバグじゃないの?
0869デフォルトの名無しさん2009/09/23(水) 19:24:59
>>868
そうだけど、そんなん言ったらECONNRESETだけじゃないか
明示的にエラーになってクローズされてるのは
0870デフォルトの名無しさん2009/09/23(水) 21:32:37
>>869
ですな〜
でも、recvが想定外なエラーを返した時点でそのソケットは捨てるしかないけど。
0871デフォルトの名無しさん2009/09/24(木) 14:51:00
一つのUDP同期ソケットで、スレッドAではrecv待機しスレッドBではsendするのって危ない?

一つのソケットでrecvとsendしたい場合はやっぱり非同期にするしかないのか・・・
0872デフォルトの名無しさん2009/09/24(木) 15:23:51
>>871
危なくはないと思うが。shutdown/closeさえ気をつければ。
ただ、recvとsendを別スレッドにすると、スレッド間でデータの共有が
必要になって面倒だから、普通はシングルスレッドで作るんじゃねえか?
完全にスレッドが分離してるんなら、別々でも無問題だろ。
0873デフォルトの名無しさん2009/09/24(木) 15:24:47
>>871
すくなくとも *nix は大丈夫なもよう
08748712009/09/24(木) 15:46:39
>>872-871
レスありがとう

Winsock中級者向けの議論からも次の様な一文を発見

一方のスレッドが send() を呼び出し、別のスレッドが同一のソケットに対して recv() を呼び出すのは安全である、という伝説があります。
しかし私はこれを確認したことはありません。より堅固な情報やデモンストレーション用のコード、さらなる伝説などがあれば、教えていただけると幸いです。

まあとりあえず大丈夫だろうってことですね
0875デフォルトの名無しさん2009/09/24(木) 15:50:58
>>872-873
安価ミス
0876デフォルトの名無しさん2009/09/24(木) 22:21:00
>>871
Solarisは不定期にハングしてたよ
今はどうだかしらんけど・・・
0877デフォルトの名無しさん2009/09/25(金) 12:10:34
送信したらすぐcloseするもの作ってて
close後にレスポンス着てるみたいなんだがshutdownしないとだめ?
0878デフォルトの名無しさん2009/09/25(金) 12:17:15
こっち側で何やっても、レスポンス来るのは抑止できない。
0879デフォルトの名無しさん2009/09/25(金) 12:19:31
>>877
送信スレッドと受信スレッドが別とかって話か?
必要なレスポンスなら何とかしてやるのが筋だろ?
送信側: SHUT_WR 送信で終了
受信側: 読込みバイト数0になるまでレスポンス読んで close
とか………
つか、プロトコル設計見直した方がええんちゃうか?
0880デフォルトの名無しさん2009/09/25(金) 13:55:05
Winsock2を使ってプロミスキャスなパケットモニタを作る場合
送信パケットもモニタできるようにするのは不可能ですか?

WinPcapドライバを使えば送信パケットもモニタできるのだけど・・
0881デフォルトの名無しさん2009/09/25(金) 21:03:37
>>880
できんことは無いけど、それを作り上げていくと
WinPcapドライバが出来てしまうわけで
意味無いよな
0882デフォルトの名無しさん2009/09/26(土) 20:27:52
recvってなんて読むの?
0883デフォルトの名無しさん2009/09/26(土) 20:46:56
>>882
あーるいーしーぶい
■ このスレッドは過去ログ倉庫に格納されています