[過去ログ] ネットワークプログラミング相談室 Port4 (1001レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
14(3): デフォルトの名無しさん [sage] 02/10/13 17:08 AAS
前スレの最後で、TCP/IP が並列動作しているのを見たことあるか?
という話題が出ていたが、マルチプロセッサでの race condition
が原因のバグを何度も見たことあるぞ。
シロートは引っ込んでなさいってんだ。
55(4): デフォルトの名無しさん [sage] 02/10/18 00:27 AAS
WSAStartup( MAKEWORD(1,1),&wsadata );
client_socket = socket( AF_INET, SOCK_STREAM, 0 );
・
・
とsocketのプログラム書いてるんですが、
connect()でサーバと繋がった状態で、サーバ側が落ちた(接続が切れた)時の判断って
どうやればいいんでしょうか?
try catchとかで例外を拾えるのかと思ったのですがそれも駄目でして・・。
(selectはつかえないですよね・・)
使用開発ツールはVisual C++です。
61(3): デフォルトの名無しさん [sage] 02/10/18 09:38 AAS
>>55
「相手が落ちた(接続が落ちた)」の定義にもよる。
相手が単純にソケットをクローズしただけなら、TCP レベルで FIN を受信
するから、recv() が 0 return する。
相手が RST を飛ばしてきたら(強制切断) recv() が -1 return で
エラーコードは ECONNRESET (WinSock の場合表現が違うかもしれない)。
相手のマシン自体がホントに落ちた(panic とか) だったら、何も
おこらない。recv() でブロックしたまま。
質問する時は、どういう状況について質問するのか、できるだけ、
具体的にしよう。
とりあえず、ソケットプログラミングの一般論として
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#ss2.1
に目を通しとけ。
71(4): デフォルトの名無しさん [sage] 02/10/18 13:37 AAS
>>70
> もっともありもののTCPスタックはRSTとか勝手に返しそうだから
ごめん。意味が分かりません。TCP がどういう場合に RST を送信
するか、理解してます?
> サーバのコネクション数には限界があるわけで、
ありません。
91(3): デフォルトの名無しさん [sage] 02/10/18 20:48 AAS
>>90
SYN flood の話で、プロセスやらスレッドやらを出してきちゃだめ。
SYN_RCVD 状態のコネクションは、まだアプリケーションに通知
されない(accept(2) できない状況)から、サーバアプリケーションが
fork() やら、スレッド生成やら、したりしないの。
で、カーネル内では、そのハーフオープンのコネクションのため
のテーブルがどんどん増えていくんだけど、消しようがないから、
そのうち、資源無しになっちゃうってのが SYN Flood 攻撃です。
アプリケーションが引き取ってるんなら、アプリケーションが close
すれば済むんだけど、ハーフオープン状態だとアプリケーションが介在
できず、カーネル内で TCP もそれを消すことができずに、ああ、困った
ね、って話。
SYN Flood の話を持ち出してきたのは、勘違いしている人でしょ?
101(3): デフォルトの名無しさん [sage] 02/10/19 09:44 AAS
とりあえずネットワークプログラミングをやるんなら、Stevens本ぐらいは嫁。
素人の巣窟かここは...
>>91
後半は大嘘だな。
以下、「UNIXネットワークプログラミング 第2版 Vol.1」からの引用。
-確立待ちコネクションキューが満杯の場合、Posix.1gではSYNを無視、
-あるいはRSTで応答のどちらの挙動を示しても良いことになっている。
-Berkeley派生のインプリメンテーションでは、到着したSYNを無視する
-ことになっている。
114(5): デフォルトの名無しさん [] 02/10/19 21:17 AAS
telnetでhttp://hostname/index.htmlをHTTP/1.1でGETして標準出力に出す場合、画面に収まり切らない部分って皆さんどうやって見ていますか?
現在はGETするだけのHTTPクライアントを作って結果をリダイレクトしてファイルに落してから後程ファイルを開いて先頭の方を見るという面倒な事をしています。
121(3): デフォルトの名無しさん [] 02/10/20 01:10 AAS
Cのマルチスレッドなのですが,
_beginthread等で起動するスレッドで
_beginthreadに渡すパラメータを参照する場合と、
グローバル変数を参照する場合とで違いはあるのでしょうか?
161(3): デフォルトの名無しさん [] 02/10/24 23:09 AAS
教えてください
WinSockを使いSOCK_STREAMでADSL回線使用の場合
1秒間に送れるデーターは5KByte程度でしょうか?
たぶんプログラムが悪いんですが。
通常もっと早いですよね?‘
174(3): デフォルトの名無しさん [] 02/10/26 19:16 AAS
質問す
sockaddr_in
の各メンバに値をいれたのち
bindなどに引数として渡すときに
(struct sockaddr*)sockaddr_in
というふうにキャストする理由というのは
ポート番号IPアドレスなどを
アドレスデータとしてまとめて読み込んでしまうから
なんでしょうか?
ソース見てないのですが
そんなところであってますか
175(4): デフォルトの名無しさん [sage] 02/10/26 21:31 AAS
>174 ちがう。単にbindのプロトタイプ宣言が
int bind(SOCKET s, const struct sockaddr* name, int namelen);
だから
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/bind_2.asp
176(4): デフォルトの名無しさん [sage] 02/10/26 21:53 AAS
>>175
ちょっと補足しとくと、bind() なんかのソケットライブラリは IP 専用じゃなくて、他のプロトコルにも使うつもりだったから、そう言うプロトタイプになっている。
(でも、IP 以外で使ったことある奴はあんまりいないと思う...。)
185(4): デフォルトの名無しさん [] 02/10/27 23:07 AAS
Socket プログラミングについて質問があるんですが。
最初、WSAStartup 関数やって、socket 関数でソケットを取得すると思いますが、
既存のソケット(他のプログラムが作ったソケット)を取得したいんですがやりかたがよくわかりません。
開発環境は WinXP Prp. VC++6.0 です。よろしくお願いします。
API でそういうようのがあればいうことないです。(API なら VB で使える)
212(3): デフォルトの名無しさん [] 02/10/31 01:50 AAS
大学の研究室にはLANが組まれていて、二台のコンピュータ間でネットワークプログラムを動かすときは、互いのマシン名が存在しているので、それでやりとりするんですが、
家にはwindowsパソコン一台しかないので、ネットワークプログラミングの勉強ができません。
DOS窓を二つ開けば擬似的にコンピュータが二台あるように見せることができるらしいですが、各DOS窓を識別する名前などが存在しないようで、こまっています。
パソコン一台でもLAN環境が整っているように見せるにはどうしたらよいのでしょうか?
ちなみにJAVAのHORBというやつを勉強してます。
230(3): 224 [sage] 02/10/31 15:13 AAS
Perlでは他の要因の方が大きいだろうけど、
Cの場合は同じように1バイトずつ読む場合でも、
fdopen()してストリームからgetc()とかで読むのと、
ファイルディスクリプタからrecv()で読むのでは
バッファの関係で速度に雲泥の差がある。
移植性の問題もあるし、fdopen()しなくても
自前でバッファリングすれば問題ないが。
>>229
保証されてるかは知らんが、毎回FILE*のバッファが
一杯になるまで満たすような実装にはしないだろ。
236(4): デフォルトの名無しさん [] 02/10/31 19:07 AAS
winsockを使ってTCP/IPをC言語でプログラムしてます。
recv関数は相手が送られてくるまでまちつづけてると思うのですが、受信スタートしたときの時間を取りたい場合どうすればいいのでしょうか?
待ち時間と受信にかかった時間をとりたいとおもってます。
244(3): デフォルトの名無しさん [sage] 02/11/01 00:16 AAS
>>236
最初に書いた条件だとselect()する必要ないと思うが。
複数のソケットを待機するか、タイムアウトさせたいのでなければ必要ない。
おそらく、最初のselect()が完了してからを「受信にかかった時間」としたいんだろうけど、
select()直後のrecv()が復帰するまでにかかる時間は無視できる範囲内になるし、
場合によったらオーバーヘッドによって生まれる誤差の方が大きいかもしれない。
341(3): デフォルトの名無しさん [sage] 02/11/18 10:30 AAS
分厚い本を何冊も読み漁って勉強してると、
同じだけ勉強してたら弁護士にでもなれそうな気がするんですが・・
388(3): デフォルトの名無しさん [ sage ] 02/11/19 16:38 AAS
だから、君の所はDHCPが通ってるんでしょうが。
SMBが動き出す前に、DHCPがTCP/IPの設定を
ひと揃い終わらせるの。 IPアドレスの決まったあとで、
SMBは動き出して、自分の初期化をするわけ。
599(3): SMB [] 02/11/24 13:49 AAS
DOSでWinsockをつかうにはどうしたらいいのだろう?
sambaのソースはおかしいみたいでそのままではコンパイルできないところがたくさんあります。
>>597
ネタじゃないです。
607(8): デフォルトの名無しさん [] 02/11/24 19:31 AAS
X11Windowにおける、ネットワークゲームなのですが。
TCP/IP通信を非同期で行うルーチンのループと、Xeventを取得するループがどうも上手くいきません。
2つをいい感じにかみ合わせるにはどうしたらいいのでしょうか?
619(3): 618 [sage] 02/11/24 22:04 AAS
ちょっと調べてみたが
ConnectionNumber(Display*)
がそうらしい。(「接続数を返す」は誤りだそうだ)
これの戻り値のfdをselectの仲間に加えてやって、
if (FD_ISSET(x11_display_fd)) {
XPeekEvent();
}
とかやればいいんじゃないかな。
>>610 安直にスレッド立てるな馬鹿野郎(5,7,5)
697(3): デフォルトの名無しさん [sage] 02/11/29 15:41 AAS
udp_open(&namein, NSPORT, 0L, 0, 0);
udp_open(&log, 0, logip, LOGPORT, 0) == 0)
NSPORTとかLOGPORTってのは何か教えて下さい。
721(3): デフォルトの名無しさん [sage] 02/12/03 23:49 AAS
selectシステムコールにタイムアウトを設けたら0しか返さなくなりました。
タイムアウトを設けなかった(NULLに設定)場合にはブロックされるかわりにちゃんと受信しています。
一体何を疑うべきでしょうか?
742(3): デフォルトの名無しさん [sage] 02/12/05 15:46 AAS
VC6で
#include<windows.h>
#include<winsock.h>
int main( int argc, char *argv[] )
{
int sd;
sd = socket( AF_INET, SOCK_STREAM, 0 );
return 0;
}
をメイクすると
test.obj : error LNK2001: 外部シンボル "_socket@12" は未解決です
Debug/test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー
となります。なにかプロジェクトの設定をしないといけないと思うんですが、なにをしていいのか分かりません。
ご教授ください。
757(3): デフォルトの名無しさん [sage] 02/12/06 12:03 AAS
>>756
おいおい、自分のネットワークアドレスやネットマスクを知らないときには
どうするんだ? ブート時のDHCPクライアントとか。
776(3): 769 [sage] 02/12/06 21:44 AAS
buf_size = 1;
setsockopt( sd, SOL_SOCKET, SO_SNDBUF, (char *)&buf_size, sizeof(buf_size) );
でもあまり改善されなかったので
buf_size = 1;
setsockopt( sd, IPPROTO_TCP, TCP_NODELAY, (char*)&buf_size, sizeof(buf_size) );
とやったら劇的に良くなりました。
>>774さんが言ってるnagleアルゴリズムってヤシですね。なんでこんな仕様なんだ、クソTCP。
788(4): デフォルトの名無しさん [ sage ] 02/12/07 07:59 AAS
場合もある、だろ。
あれは一種のお節介。
797(6): デフォルトの名無しさん [sage] 02/12/07 19:01 AAS
>>796
んなこたぁない。
HTTP、SMTP、IIOP、RPC、他多数でTCP_NODELAYが邪魔。
当然ながら実装がヘタレだったら別だよ。
つーか、リクエスト/レスポンス型のプロトコルで
TCP_NODELAYが役に立つのってあるんか?
876(6): デフォルトの名無しさん [] 02/12/12 10:42 AAS
ちょうどマルチスレッドの話もでているので便乗させてください
不特定多数が参加するMMO(というわりには規模がちいさいけど、イメージ的にはそれ)を作っています
マルチスレッドを使おうと思ったのですが、色々訳あって現在はシングル+非同期winsockでやっております
そこで質問なのですが、winsockでconnectを同期せず(connectで止まらず)に行うには
AASyncを使うしかないのでしょうか
recv, sendはソケットのオプション変更で非同期にできたのですが…
プレイヤーがログインしたとき、データベースサーバーにコネクションを張らせたいのです
マルチスレッドにするしかないでしょうか?
885(3): デフォルトの名無しさん [sage] 02/12/12 20:11 AAS
>>876
connectって非同期にできない?
リファレンス見ると、できそうに書いてあるけど。
> With a nonblocking socket, the connection attempt cannot be completed immediately. In this case, connect will return SOCKET_ERROR, and WSAGetLastError will return WSAEWOULDBLOCK.
886(3): デフォルトの名無しさん [sage] 02/12/12 23:24 AAS
>>885
どう読んだらそうなるんだ?
「connect要求は直ちに完了できない(ノンブロッキングにできない)ので
エラーになる」と書いてあるが。
888(5): 885 [sage] 02/12/13 00:07 AAS
>>886
え。だって、ノンブロッキングソケットって、いつもエラーリターンでそ? recv とか send とかも。
EWOULDBLOCK は、本来ならブロッキングしてたはずのところを、ノンブロッキングだからすぐリターンしたよって意味ではなかった?
896(5): デフォルトの名無しさん [sage] 02/12/13 09:03 AAS
>>888
「いつも」ではない。その場で処理されてすぐに戻ってくるかもしれない。
いつもWSAEWOULDBLOCKが返ってくることを前提にした
コードを書いてはならない。
900(5): デフォルトの名無しさん [sage] 02/12/13 14:18 AAS
>>888より
> え。だって、ノンブロッキングソケットって、いつもエラーリターンでそ? recv とか send とかも。
>>896より
> 「いつも」ではない。その場で処理されてすぐに戻ってくるかもしれない。
>>899より
> the connection attempt cannot ...
後は自分で判断しような>他の人
909(3): デフォルトの名無しさん [sage] 02/12/13 15:24 AAS
nonblockingなソケットの場合
1. connect()は必ずWSAEWOULDBLOCK.が返ってくる。
2. recv()やsend()とかはいきなり正常終了する可能性がある。
connect()する時は相手からの応答を待つから、即座の復帰はありえない。
recv()やsend()ではバッファの関係で正常/WSAEWOULDBLOCK.両方の可能性がある。
ごっちゃにしたのが混乱の原因(w
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.046s