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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/10/14(水) 03:43:08
主にソケットに関しての質疑応答スレッドです。

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辺り
足りなかったら適当に付け足してね

前スレ
ネットワークプログラミング相談室 Port24
http://pc12.2ch.net/test/read.cgi/tech/1246895188/
関連スレ
ネットワークプログラミング雑談
http://pc12.2ch.net/test/read.cgi/tech/1235800707/
Java ネットワークプログラミング 【教えて!】
http://pc12.2ch.net/test/read.cgi/tech/1086238859/
0446デフォルトの名無しさん2009/12/27(日) 17:08:56
メインスレッドがちゃんと渡してないのでは。
0447デフォルトの名無しさん2009/12/27(日) 17:17:37
Winsock2は詳しくないんだが、エラーコード10038の意味は何?
それを調べる事から調査が始まるのではないかと。
0448デフォルトの名無しさん2009/12/27(日) 18:23:22
>>446
デバッグ用にコードを仕込んで確認しました。
acceptから受けたsock(メインスレッド) と WSAEventSelectに渡されるsock(別スレッド)は同じでした。

>>447
WSAENOTSOCK
10038
Socket operation on nonsocket.
An operation was attempted on something that is not a socket.
Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.

です。
有効なソケットではないという感じです。
04494452009/12/27(日) 23:10:32
>接続中のスレッドが3コになったら、空きができるまでaccept()には戻りません。
この部分を1コに変更する(つまり、ひとつの接続が完了するまで次のaccept()には戻らない)と上記のようなエラーは発生しなくなります。
0450デフォルトの名無しさん2009/12/28(月) 13:18:33
メインスレッドからポインタでデータを渡していて
スレッドで読んでる最中に上書きしちゃてるとか
0451デフォルトの名無しさん2009/12/28(月) 14:54:36
タイムアウトのためだけにselect使う場合は
FD_ISSETは使うわなくていいんだよな?
0452デフォルトの名無しさん2009/12/28(月) 15:17:55
>>451
エラー要因はちゃんと見とけよ
割り込みだったら待ちなおしだ
04534452009/12/28(月) 18:06:48
>>450
SOCKET型変数を値渡ししています。
どこかで上書きしちゃっている可能性も考えたので>>448で実験していましたが
エラー発生時のメインスレッドのsock(SOCKET型) と値渡ししたsock(SOCKET型) は同じ数値でした。
また>>445の1〜4のうち、1と2の間でも、acceptの戻り値がINVALID_SOCKETであるかどうかの確認を行っています。
このときにはINVALID_SOCKETではないのに、別スレッドに渡した後のWSAEventSelect()やWSAEnumNetworkEvents()でSOCKET_ERRORになります。
SOCKET_ERRORの時はif(WSAGetLastError()==WSAEWOULDBLOCK)...の処理を入れてあります。
0454デフォルトの名無しさん2009/12/28(月) 18:39:56
別のとこで同じソケット使おうとしてるんだろ
0455デフォルトの名無しさん2009/12/28(月) 18:41:34
よく分からないけど、WSAEventSelect()のほかのパラメタも
見直してみてはどうかな

第一引数のソケットは正しくても WSAENOTSOCKが返ることも
あるみたいだし
http://groups.google.co.jp/group/microsoft.public.win32.programmer.networks/browse_thread/thread/f7cf0ce6e7e2aefa
0456デフォルトの名無しさん2009/12/28(月) 22:47:31
排他制御が出来て無くて他のスレッドで無効にしてるんだろ。
04574452009/12/29(火) 00:06:22
>>455
ありがとうございます。
リンク先のURLはWSAEventSelect(...)の2番目の引数はWSAEVENT*ではなく、WSAEVENTだよってことですよね?
(ソースはWSAEVENT**を渡そうとしているようですが)

>第一引数のソケットは正しくても WSAENOTSOCKが返ることもあるみたいだし
SOCKET_ERRORを返した場合でも、一定時間待機後リトライするようにしたところ、成功することがあるということが分かりました。
それでもまだ失敗する場合もあるようですが、かなり改善しました。
いろいろ試してみます。

>>456
それはないと思うのですが。
スレッド間で異なる値のソケットを持っていますし、アドレスで渡してはいないので別スレッドのソケットを参照してしまうこともないです。
スレッド間の排他制御以前の問題だと思います。
0458デフォルトの名無しさん2009/12/29(火) 08:27:42
>>457
> スレッド間の排他制御以前の問題だと思います。
自分のコードが間違っていると言う考えには至らず、システムに原因があると考える、
典型的な初心者。
100%に近い確率でお前のコードのどこかが、SOCKETを無効にしているか無効なソケット
を渡されたのをチェックせず見逃している。
0459デフォルトの名無しさん2009/12/29(火) 10:29:25
コードをうpすれば間違いを指摘してやるのにな
0460 ◆0uxK91AxII 2009/12/29(火) 10:40:02
>>453
>エラー発生時のメインスレッドのsock(SOCKET型) と値渡ししたsock(SOCKET型) は同じ数値でした。
それは、acceptの戻り値と一致するのかな、っと。
04614452009/12/29(火) 18:33:55
>>458
>自分のコードが間違っていると言う考えには至らず、システムに原因があると考える、
違いますね。
排他制御以前に自分の「winsock2の取り扱い方」に問題があると思っています。

>>460
>メインスレッドのsock(SOCKET型)
これがacceptの戻り値です。
0462デフォルトの名無しさん2009/12/29(火) 19:09:11
>461
ぐだぐだ言ってねぇでいいからSOCKETを渡してるとこと受け取ってるとこをmutexでくくれ。
話はそれからだ
0463デフォルトの名無しさん2009/12/29(火) 19:29:44
> 排他制御以前に自分の「winsock2の取り扱い方」に問題があると思っています。
socket, acceptでSOCKET作る。使う。閉じる。これだけなのに使いこなせないとは
よほどのヘボということになるが。
0464デフォルトの名無しさん2009/12/29(火) 19:34:22
仕事の話なら「死んでくだしあ」になるけど
趣味ならしょうがないというか、よくある話でしょう。
0465デフォルトの名無しさん2009/12/29(火) 22:03:57
勘違いしてました、とかよくあるからな
0466デフォルトの名無しさん2009/12/29(火) 22:26:02
2ちゃんねるはもっと親切な場所だと勘違いしてました(><)
0467デフォルトの名無しさん2009/12/29(火) 22:44:11
2ちゃんねるが親切とか、どこを見ればそんな勘違いできるんだろう
0468デフォルトの名無しさん2009/12/29(火) 22:47:40
俺がいるからこういう勘違いをさせてしまう
0469デフォルトの名無しさん2009/12/30(水) 02:50:22
オヤギリ・・・ゴクリ
0470デフォルトの名無しさん2009/12/30(水) 11:49:29
みんな、すまん
0471デフォルトの名無しさん2009/12/30(水) 12:04:37
うむ
0472デフォルトの名無しさん2009/12/30(水) 15:49:10
2ちゃんねるは 匿名で知らない新人のかげぐちを言う
最低のゴミクズのチンカス野郎のあつまりですよ(^-^)
0473デフォルトの名無しさん2009/12/30(水) 15:52:37
チンカスって何?
0474デフォルトの名無しさん2009/12/30(水) 16:01:04
>>473
あなたのことですよ(^-^)
0475デフォルトの名無しさん2009/12/30(水) 19:30:21
>>453
> SOCKET_ERRORの時はif(WSAGetLastError()==WSAEWOULDBLOCK)...の処理を入れてあります。

こういうWSAGetLastErrorの使い方されれると、
ドキュメントに書いてあること守っているかどうか気になるなあ。
0476デフォルトの名無しさん2009/12/31(木) 06:13:07
いっそオープンソースでやればいいが
ぱくられる、たたかれる、異常なほどの知識をもったキチガイがくる
のいずれかに該当するので結局オープンにしない
そして、車輪の再開発はまた繰り返される
これが日本のクオリティ
04774452010/01/03(日) 00:45:04
原因が分かった。

別の接続で(>>445とは関係のない部分)のミスだった。

別の接続がソケットを使用し、ある条件によって即座にclosesocket()する場合としない場合があるのだけど
closesocket()した場合でも、その後オブジェクトの破棄時にまたclosesocket()を呼び出していることが原因だった。

最初のclosesocket()によって開放したソケット(と同じ値)を>>445のサーバが再利用するようになったときに
オブジェクトの破棄時にまたclosesocket()を呼び出したせいでサーバが取得したソケットを無効にしてしまっていたようでした。
0478デフォルトの名無しさん2010/01/04(月) 13:22:25
大きなファイル or ストリームデータもスムーズに流せるパイプライン的動作の
http proxyを作りたいのですが、Keep-Aliveのセッションに流れているリクエスト間の及び
レスポンス間を検出をする効率的な方法を教えてください
Content-Lengthヘッダは必須ではないようですし
1Byteづつシフトさせてある程度の量を読んでリクエストライン/ステータスラインを
検知するような方法だとbody内等に類似の文字列が含まれた場合に
意図しない動作をする可能性が考えられます
(検知に必要なリソースが増える上に遅くなるので避けたいと言うのもあります)
・・・どうしても不確定要素が排除できない・・・(´・ω・`)

よろしくお願いします
0479デフォルトの名無しさん2010/01/04(月) 14:00:22
RFC 2626 §8.1.2.1 より
> In order to remain persistent, all messages on the connection MUST
> have a self-defined message length (i.e., one not defined by closure
> of the connection), as described in section 4.4.
0480デフォルトの名無しさん2010/01/04(月) 23:56:38
SystemVとPosixのメッセージキューってどっちが高速なんでしょうか?
0481デフォルトの名無しさん2010/01/05(火) 07:08:06
お前の環境で実測しろ、馬鹿
04824782010/01/05(火) 19:55:43
>>479
レスthx。そんなところに書いてあったのか
Content-Lengthでやってみます
0483デフォルトの名無しさん2010/01/05(火) 22:41:25
>>480
一般的にはposixの方が速いけど、>>481のレスのとおりだと思います。
0484デフォルトの名無しさん2010/01/05(火) 22:50:30
一般的とは?速い根拠は?
0485デフォルトの名無しさん2010/01/05(火) 23:13:09
>>484
SystemVが遅いからいろんな方法が生まれたということを考えるとねぇ
0486デフォルトの名無しさん2010/01/06(水) 00:04:41
だから、根拠は?
あんたの妄想なんていらないんだよ
0487デフォルトの名無しさん2010/01/06(水) 00:09:19
なんて偉そうな教えてくん
0488デフォルトの名無しさん2010/01/06(水) 00:11:17
で、根拠はまだかね?
0489デフォルトの名無しさん2010/01/06(水) 00:14:06
おい、根拠はまだか
0490デフォルトの名無しさん2010/01/06(水) 00:15:01
こっちだって忙しいんだからさっさと根拠だせよ無能ども
0491デフォルトの名無しさん2010/01/06(水) 00:21:32
根拠は出せないみたいだな
知ったかの馬鹿ばっかだったってことだ
今日も俺の勝ち
0492デフォルトの名無しさん2010/01/06(水) 01:07:22
ねんねの時間だぞオイ
0493デフォルトの名無しさん2010/01/06(水) 16:47:15
誰?こいつにこんなとこ教えたの
0494デフォルトの名無しさん2010/01/06(水) 16:48:38
深夜に会社にもぐりこんでパソコンやってんのかね
キモチワルイ ヒマジン キチガイ モノゴイ
0495デフォルトの名無しさん2010/01/06(水) 17:13:42
ほんと、一般的〜とか 〜の方が速いとか 〜が遅いからとか
真面目なスレに出てきてほしくないよね、何が楽しいんだろうか
0496デフォルトの名無しさん2010/01/06(水) 17:36:59
そもそもメッセージキューって、このスレと関係ないだろ。

>>495
お前も何が楽しくてレスしてんだよ。
0497デフォルトの名無しさん2010/01/06(水) 17:50:24
この一連が楽しくないからレスしたのだが、それがなにか?
0498デフォルトの名無しさん2010/01/06(水) 19:01:45
争いの発生源
深夜時刻の書き込みを規制すればいいような
0499デフォルトの名無しさん2010/01/06(水) 19:13:50
そんなできもしない事を書いて何になるのか
0500デフォルトの名無しさん2010/01/06(水) 19:18:15
根拠や実現性の無い事ばかり言う奴っているよね。
邪魔でしょうがない。
0501デフォルトの名無しさん2010/01/06(水) 20:18:27
マスコミとか?
0502デフォルトの名無しさん2010/01/06(水) 20:45:33
手元の環境で簡単に実測できることを、いつまでぐだぐだ言ってんだ
0503デフォルトの名無しさん2010/01/07(木) 00:56:32
>>500はナイコン族。キーボードの写真を見ながらプログラムを夢想してる。
0504デフォルトの名無しさん2010/01/07(木) 01:01:37
ナイコン族なつかしー
0505デフォルトの名無しさん2010/01/07(木) 21:50:38
>>496
UNIXネットワークプログラミングのVol.2の内容だな
このスレとは関係ないけどな
0506デフォルトの名無しさん2010/01/08(金) 22:19:30
意図的にパケットロスや遅延を起こすようなブリッジっぽいプログラムを探してるんだけど
なんかお勧めはありますか?
0507デフォルトの名無しさん2010/01/08(金) 22:26:19
dummynet, altq
0508デフォルトの名無しさん2010/01/09(土) 22:05:50
linee
0509デフォルトの名無しさん2010/01/10(日) 12:54:45
WMICコマンドでNICのレジスタを操作したいのですがどの程度できるものなのでしょうか?
また参考になるサイトは有りますか?
0510デフォルトの名無しさん2010/01/15(金) 18:52:31
データ収集のためにあるサイトに10000回ぐらいHTMLファイルの要求したいんですが
1回ごとにどのぐらい、間を開けるべきですか?
曖昧な質問ですが教えてください。
自分としては10日ぐらいにわけて要求しようと思っているのですが
それが多いのか少ないのかわかりません。
0511デフォルトの名無しさん2010/01/15(金) 18:53:54
そのサイトの管理者に聞きなさい
0512デフォルトの名無しさん2010/01/15(金) 23:27:13
>>510
あまり頻繁に同一アクセスすると、DOSアタックと間違えられて、塞がれるからかもしれないぞ。
0513デフォルトの名無しさん2010/01/16(土) 10:07:48
>>511さん>>512さんありがとうございます。
難しいですね。
アクセスする度にIP変えるとしてもホストでわかるでしょうし。

とりあえずまだ時間はあるので自分で考えてから決めようと思います。
0514デフォルトの名無しさん2010/01/16(土) 14:02:32
>>510,511,513
何を言ってるんだ、おまいらは?
それはネットワークプログラミングの問題ではなくて、サイトの運営ポリシーの問題だ
512 が正論だと思うが… … …
0515デフォルトの名無しさん2010/01/16(土) 14:48:49
おまえは2chをなんだとおもってるんだ
0516デフォルトの名無しさん2010/01/16(土) 16:13:26
掲示板かな
0517デフォルトの名無しさん2010/01/16(土) 18:47:05
アクセス少ないサイトで10000回もアクセスされたら嫌がらせだな。
100万PVのサイトなら誤差?

開発日記でもブログに書いて10000回アクセスしてログ見てみたらw
0518デフォルトの名無しさん2010/01/16(土) 21:32:09
>>517
1日当たりのアクセス数調べてみたら5000万はありそうです。

とっても嫌な気持ちになると思われます。。
0519デフォルトの名無しさん2010/01/16(土) 22:17:37
アクセスランキング上位の超人気サイト
0520デフォルトの名無しさん2010/01/16(土) 22:53:51
google相手だったら恐らくbanされるな(規約で自動化について触れている)
0521デフォルトの名無しさん2010/01/19(火) 02:51:20
winsockでconnectのタイムアウトをつけるにはどうすればいい?
0522デフォルトの名無しさん2010/01/19(火) 11:03:01
ノンブロッキングでconnect
0523デフォルトの名無しさん2010/01/19(火) 11:30:29
スレッドでコネクト
0524デフォルトの名無しさん2010/01/24(日) 01:45:41
シリアルポートを使うアプリ開発しているんですが、
PC1台しかないんで、もう一つ対抗装置をエミュするアプリ作って
同じPC上で通信ってできますか?
ソケットならループバックできるけど、シリアルポートはさすがに無理?
物理的につながった相手としか交信できませんか?
0525デフォルトの名無しさん2010/01/24(日) 01:55:13
VMwareとかVirtualBoxとかを使えばできるんじゃない?
0526デフォルトの名無しさん2010/01/24(日) 01:58:41
>>525
なるほど!その手があったか。
ありがとうございます!
0527デフォルトの名無しさん2010/01/24(日) 02:05:15
安いPCでも買えばいいのに
0528デフォルトの名無しさん2010/01/24(日) 02:07:19
普通にUSBシリアル変換を1つ持ってくれば良いんでないの?
0529デフォルトの名無しさん2010/01/24(日) 02:29:03
古いPC何台かあまってるけど
あげようか?
0530デフォルトの名無しさん2010/01/24(日) 03:46:52
>>525
仮想ポート同士を繋げるなんて出来たっけ?
0531デフォルトの名無しさん2010/01/24(日) 05:44:16
全然ネットワークじゃ無い様な気もする。
シリアルなんて付いてるpc探すほうが苦労するし、もうusbでよくね?

http://pc12.2ch.net/test/read.cgi/tech/1162901243/
USBプログラミング入門
http://pc12.2ch.net/test/read.cgi/tech/1162801793/
RS-232cについての質問(初心者)
0532デフォルトの名無しさん2010/01/24(日) 09:56:16
MAX232使えばいいよ
0533デフォルトの名無しさん2010/01/24(日) 13:42:30
え?今のPCってシリアルついてないの?
0534デフォルトの名無しさん2010/01/24(日) 14:39:46
今もPCってパラレルポートもなかったりして
0535デフォルトの名無しさん2010/01/24(日) 15:01:48
>>530
データの読み書き程度なら、VMwareの場合シリアルポートを名前付きパイプに
マップしたり出来るらしいし、なんとかなるかも
0536デフォルトの名無しさん2010/01/24(日) 17:15:36
telnetdを作ってるのですが、
0x1bのESCだけが送られてきた時と、
エスケープシーケンス(0x1b[Aとか)の区別は
続く文字がこない場合、タイムアウトでやるしかないでしょうか。
0537デフォルトの名無しさん2010/01/24(日) 17:29:58
どっちみちクライアント側からは
行単位でしか送られてこないケースが多いけど
0538デフォルトの名無しさん2010/01/24(日) 17:32:26
エコーバックがあるからそんなことないだろ
0539デフォルトの名無しさん2010/01/24(日) 17:34:33
次が来るまで保留
0540デフォルトの名無しさん2010/01/24(日) 17:38:18
>>536
タイムアウトしてはいけない
0541デフォルトの名無しさん2010/01/24(日) 17:54:46
何故、区別する必要があるのだろう?
0542デフォルトの名無しさん2010/01/24(日) 17:59:24
そういえば最後の1バイトが0x1bで終わってると
ハングアップする糞メールソフトがあったな
NeXTのMail.appだったかな
0543デフォルトの名無しさん2010/01/24(日) 20:28:00
シリアルで電文コマンド送出するプログラム書いたから
内容によって返答を返してくれるレスポンスプログラムも用意してデバッグしたいってこと?
素直にお古のPCを持ってきた方がいいんじゃない?
0544デフォルトの名無しさん2010/01/24(日) 21:26:02
送る処理と受ける処理を混同してるような
0545デフォルトの名無しさん2010/01/24(日) 22:01:47
s/送る/攻める/
■ このスレッドは過去ログ倉庫に格納されています