ネットワークプログラミング相談室 Port5
■ このスレッドは過去ログ倉庫に格納されています
0001Unknown
NGNGProgramming UNIX Socket FAQ (日本語訳)
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
Winsock Programmer's FAQ
http://tangentsoft.net/wskfaq/
過去スレ:
ネットワークプログラミング相談室
http://pc.2ch.net/tech/kako/970/970344582.html
ネットワークプログラミング相談室 Port2
http://pc.2ch.net/tech/kako/1006/10062/1006258198.html
ネットワークプログラミング相談室 Port3
http://pc3.2ch.net/test/read.cgi/tech/1023359282/
ネットワークプログラミング相談室 Port4
http://pc3.2ch.net/test/read.cgi/tech/1034236536/
0653デフォルトの名無しさん
NGNGハンドシェイクを行っているんですよ
それで稀に同期がずれることがあるみたいで
シリアルでは送信前にPurgeCommをしてバッファを空にしてたんですが
UDPにもこれ相当のAPIがあれば便利かなあと思いまして、
今はとりあえず空読みして回避しています。
0654デフォルトの名無しさん
NGNGsmbclient等で使われている winpopupのプロトコルはrfcで規定されているんでしょうか?
rfc1001や rfc1002を winpopupで検索して見ましたがヒットしませんでした。
0655デフォルトの名無しさん
NGNG素人はUDPを使うべきじゃない。考慮すべき事が多すぎる。
0657デフォルトの名無しさん
NGNG0658デフォルトの名無しさん
NGNGUDPはトランスポート層を担うプロトコルとして、
## host内のentityをport番号で区別する。
リアルタイム系のプロトコルを支えているし、
DNSをTCPにすると、
SYN →
← SYN/ACK
ACK/req. →
← SYN/res.
となるから、かかる時間が倍になってしまう。
しかし、素人がUDP使って設計するとろくなことにならんので、素人は禁止(w
MTU discoveryとかしらんだろうし。
0659デフォルトの名無しさん
NGNG0660デフォルトの名無しさん
NGNG上手くいくかどうかは非常にあやしいが
0661デフォルトの名無しさん
NGNG0662デフォルトの名無しさん
NGNG0663デフォルトの名無しさん
NGNGどのソースを使いまわすのが良さげですか?
0664デフォルトの名無しさん
NGNG0665デフォルトの名無しさん
NGNGCSocketのOnAcceptみたいな。
0666デフォルトの名無しさん
NGNG>ハンドシェイクを行っているんですよ
>それで稀に同期がずれることがあるみたいで
ハンドシェイクにタイムアウト実装しないヤシはペケ。
>>652 が
>UDPでしょ?相手に届く保証も無い(欠けてる事もある)し、何バイト単位で送信というわけでもないし。
と書いてるだろ。*届く保証が無い*んだから、「来ないこともある」という前提で
ハンドシェイクを久米。
ソケットがどうとか、UDPがどうとかいう以前の問題とケテーイ。
そのハンドシェイクがシリアルで動いてるとしても*運がよいだけ*と認識汁。この度素人が。
0667デフォルトの名無しさん
NGNG>ハンドシェイクを行っているんですよ
>それで稀に同期がずれることがあるみたいで
って何言ってるつもりなの?
オーメン(>>666)分かるなら解説してくれ。
「ハンドシェイク自体に失敗する」ことを「同期がずれる」と称しているのか?
0668666オメーン
NGNG>「ハンドシェイク自体に失敗する」ことを「同期がずれる」と称しているのか?
まったくの推測であるが、
STX -> ACKとか ENQ -> ETXとかそういうことをシリアルであってた経験に
うぬぼれて、そのハンドシェイク(プロトコルと呼ぶべきか)をそのまま
イーサに持ってこようとしているのでは?
たぶん、PC<--->装置だろ。装置は計装関係あたりだろ。
・・・漏れって思い込み禿げしすぎるかも・・・
0669666オメーン
NGNGスマヌスマヌ。>>667 への回答になってなかった。
>「ハンドシェイク自体に失敗する」ことを「同期がずれる」と称しているのか?
結局、漏れが想定してるようなヤシだったら、プロトコルが思ったとおりに動かない、
ときどきこける、あるいはハンドシェイクの周期がずれる、などを
ひっくるめて、「同期がずれる」と言ってるんだろうよ。
プロトコルは穴だらけでタイミング検証もできてない実装だろうよ。たぶんな。
0670デフォルトの名無しさん
NGNG0671デフォルトの名無しさん
NGNG0672デフォルトの名無しさん
NGNG0673667
NGNGやっぱそうなんかな。
そうだとすると、奴はdatagram通信って何なのか理解出来てないな。
UDP datagramがlostしているだけの話で、
期待している奴の次のdatagramが来る→同期がずれるって言ってんだろう、
とも思ったが、そんな時PurgeCommは何も解決してくれないし…
0674デフォルトの名無しさん
NGNG0675デフォルトの名無しさん
NGNG0676デフォルトの名無しさん
NGNG0677デフォルトの名無しさん
NGNGなにも知らないくせに他人を推測で批判しやがって。
漏れはお前みたいな素人と違ってちゃんとUDP理解してるし、
その上で面倒がおきるから使うなと言ってんだバカヤロウ。
味噌汁で顔を洗って出直して故意。(゚д゚)ペッ!
っつーワケですな。
まぁ、聞くほうは答えが出揃うまでは謙虚にしていろっつーことだ罠。
利根川先生もそう仰っている。
0678デフォルトの名無しさん
NGNG0679666オメーン
NGNGPurgeCommみたいなのWinsockには、無い。他は知らん。
ioctlsocket/WSAIoctlでFIONREAD/FIONREAD , SIO_FLUSH
あたりを嫁ってか。
んなもん使ったらドライバ依存しまくりだろ。
PurgeCommがまともに動くのは、シリアルドライバがMS純正だからだろ。
サードパーティ製シリアルボードではハマリまくるぞ。<-逆もあり
漏れは胃ガンぽいヤシが胃薬を買いにきたら、「早く医者へ行けヴォケ」と言いたいけどなぁ。
0680デフォルトの名無しさん
NGNG0681デフォルトの名無しさん
NGNG丸2日かけて浮かんだカキコがソレ?
0682デフォルトの名無しさん
NGNG0683デフォルトの名無しさん
NGNG仕様変更できるなら、TCPにしとけよ〜!
0684デフォルトの名無しさん
NGNG0685デフォルトの名無しさん
NGNG0686デフォルトの名無しさん
NGNG相談しずらくなる。
0687デフォルトの名無しさん
NGNG0688デフォルトの名無しさん
NGNG日本語もまともに使えない奴が何言ってるの?
0689BSDソケ子
NGNG0690デフォルトの名無しさん
NGNG0691デフォルトの名無しさん
NGNGそれが出来ない人間はプログラマとしての適性はありません
0692デフォルトの名無しさん
NGNG0693デフォルトの名無しさん
NGNG0694デフォルトの名無しさん
NGNG0695デフォルトの名無しさん
NGNGCSocketA* m_p1;
CSocketA* m_p2;
とし、別々の場所(同じスレッド内)からそれぞれ
m_p1 = new CSocketA;
m_p2 = new CSocketA;
としてインスタンスを作って使用すると、sockcore.cppの513行目のアサートが発生します。
別々のインスタンスなので大丈夫だと思ったのですが、このような使い方は間違っているのでしょうか?
これを回避するにはどうすればよいのでしょうか?
0696デフォルトの名無しさん
NGNGhttp://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/csocket.html
0697デフォルトの名無しさん
NGNGそこに載っていることとは関係無いと思うんですけど・・・
0698デフォルトの名無しさん
NGNGコンパイラもライブラリバージョンも書かず、513行目と言われても
なんのことやら
0699デフォルトの名無しさん
NGNGVC++6です。
0700デフォルトの名無しさん
NGNG0701デフォルトの名無しさん
NGNGオーバーライドしてるだけなんですけどね・・・
OnSendやOnReceiveの中身をすべてコメントアウトして、
一方のCreate、Connectの両方をコメントアウトすると(つまり一方のインスタンスは
newしてdeleteするだけ)アサートしません。
しかし、Createして実行するとアサートします。
0702701
NGNGCAsyncSocketの派生クラスCTestSockを作り、OnSendをオーバーライドして
CString strCmd = "GET / HTTP/1.0\r\n\r\n";
Send(strCmd, strCmd.GetLength());
とする。
ダイアログのメンバ変数として
CTestSock* m_pSock1;
CTestSock* m_pSock2;
を宣言。これらはダイアログのコンストラクタでNULLで初期化します。
次にダイアログにボタンを二つ作り、一方に
if(m_pSock1 != NULL){
delete m_pSock1;
m_pSock1 = NULL;
}
m_pSock1 = new CTestSock;
m_pSock1->Create();
m_pSock1->Connect("www.yahoo.com", 80);
とし、他方に
// 先のm_pSock1をm_pSock2に換えただけ。
if(m_pSock2 != NULL){
delete m_pSock2;
m_pSock2 = NULL;
}
m_pSock2 = new CTestSock;
m_pSock2->Create();
m_pSock2->Connect("www.yahoo.com", 80);
とします。
後はボタンを交互に連続で何回か押せばアサートが起きます。
0704デフォルトの名無しさん
NGNGたぶん、Create直後にAttachHandleしとけばいい
0705デフォルトの名無しさん
NGNGAttachHandleするとはどういうことでしょうか?
CAsyncSocketメンバ関数にAttachというのはありますが、これではないですよね。
0706デフォルトの名無しさん
NGNG0707デフォルトの名無しさん
NGNGperlだとwhile(<SOCK>){}で全データダウンロードできますが
Cの場合、どのように全データダウンロードできたということを判定したら
よいでしょうか?
0708デフォルトの名無しさん
NGNG0709デフォルトの名無しさん
NGNGrecvの戻り値が0ってことですか?
0710デフォルトの名無しさん
NGNG接続が切れたら終了
0711デフォルトの名無しさん
NGNG接続が切れたことはrecvの戻り値が0かどうかで判断すると思ったのですが。
あっ。とりあえずselectは使ってない場合です。あとでつける予定です。
以前データより先にcloseのパケットが先に到着するような話題があったと思うので
ちょっと心配。
0712BSDソケ斗
NGNGOSは何なの?
recvなんか使わずに、fread使いなさいよ。fdopenしてさ。
Win9xのWinsockは、socketがfile handleじゃないから駄目だけど。
0713デフォルトの名無しさん
NGNGOSはWinです。9x系もありです。スマソ
0714デフォルトの名無しさん
NGNG> recvの戻り値は関係ない
> 接続が切れたら終了
アフォか?
>>711
> 以前データより先にcloseのパケットが先に到着するような話題があったと思うので
> ちょっと心配。
TCP はストリーム型通信だから、そんなことはあり得ない。
実際に順序が逆転してパケットが到着したとしても、
アプリケーションにはちゃんと順番通りに通知されるから、
安心しろ。
0715デフォルトの名無しさん
NGNGthx
安心しますた。
selectもいれて一通りできるようになりました。
たぶん、closeパケットうんぬんはwinsock2で非同期ソケットの
場合のMS独自のバグみたいなものだったかもしれません。うるおぼえでスマソ
0716デフォルトの名無しさん
NGNGMSDNには書かれてる。
> FD_CLOSE should only be posted after all data is read from a
> socket, but an application should check for remaining data upon
> receipt of FD_CLOSE to avoid any possibility of losing data.
CAsyncSocketがこの可能性を考慮してくれるのか
自分でやる必要があるのかまでは知らないけど
0717デフォルトの名無しさん
NGNGそれは、アプリケーションがソケットをクローズした後で
データが到着する可能性がある、って話だろ?
>>711 が言ってるのは、相手からの FIN が相手からのデータ
を追い越して来ちゃうかもしれない、って話だろ?
ごっちゃにするな。
0718デフォルトの名無しさん
NGNGカコ(・∀・)イイ!!
0719デフォルトの名無しさん
NGNGCreateの直後にそれやると今度はsockcore.cppの408行目でアサートしますが・・・
0720デフォルトの名無しさん
NGNG0721デフォルトの名無しさん
NGNG良い悪い以前に、そんなこと必要ないだろ?
0722デフォルトの名無しさん
NGNGエラーが出たら全部クローズしたいんですけど。だめですか?
0723山崎渉
NGNG0724デフォルトの名無しさん
NGNG0725デフォルトの名無しさん
NGNGエラーが出たらクローズするのはいいけどそれが>>720にどう関わってるん?
0726デフォルトの名無しさん
NGNG「WSAAsyncSelect などを使った場合に、コネクションが閉じられたら、FD_CLOSE が飛んでくる。
だが、その時点で、まだソケットバッファにデータが溜まったままになってることがあるから、
データロストしたくなかったら、ソケットバッファをチェック(recvなどで)しといた方がいいよ。」
ってことじゃないかな?
あと、前スレの912も見ておいたほうがいいかも。
0727702
NGNG概要からこれかもしれませんが、まだ解決法は無いみたいです。
0728BSDソケ斗
NGNGつーか、>>716に引用された文の前後読んでも、
何故に「but an application should check for remaining data
upon receipt of FD_CLOSE to avoid any possibility of losing data.」
なのかサパーリわからんよね。(むしろ必要がないと帰結できる説明がなされている)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/wsaasyncselect_2.asp
しかし「やれ(should)」と言っている以上やるのが賢明ですわねえ。
「Win32 APIやMSDNで解釈に迷ったら、悲観的な立場をとれ(w」
0729BSDソケ斗
NGNG同URLより、
> 解決方法: クライアントからのデータ送信を行う際に Sleep API などにより
> 間隔を空けることで回避可能な場合があります。
ぷ 「解決方法:〜場合があります」だってさ。
0730デフォルトの名無しさん
NGNG複数ソケットをオープンしてて、ソケットを閉じるタイミングが違うじゃないっすか?
エラーがでたとき、いちいち開いてるのだけクローズするのって面倒じゃないですか。
0731デフォルトの名無しさん
NGNG0732デフォルトの名無しさん
NGNGUNIX のソケットしか知らないんだけど、あるソケットをクローズしたら、
そのソケットディスクリプタを格納する変数に、-1 を放り込んでおいて、
何らかのエラー発生時には、値が -1 以外のものをクローズする、ってのは
どう? よくやる手法だと思うんだけど。
クローズ時。
close(s);
s = -1;
エラーで全部をクローズする時。
if (s >= 0) close(s);
0733デフォルトの名無しさん
NGNG面倒なので極力しないようにしてまつ。
>>732
(・∀・)イイ!!
なるほどねー
いただきます。
0734BSDソケ斗
NGNGつーか、UNIXだと、
#define MAX_FD (システムごとに違う)
for (int i=0;i<MAX_FD;i++) { (void)close(i); }
こんな乱暴なのもしばしばだわな。
Winsockだと、 二回目はWSAENOTSOCKつーエラーになるだけのはずだけど、
Winsockは油断ならんから、ジェントルにプログラミングしといた方がいいよ。
SO_LINGERしているなら、MSDN参照な。
0735デフォルトの名無しさん
NGNGそのサイズまで達していなかったらリトライ
転送中に切れることまで考慮するのならそうすべき
0736デフォルトの名無しさん
NGNG最悪assert程度でもいいからさ
0737デフォルトの名無しさん
NGNGうわー
それは気づかなかった。
0738デフォルトの名無しさん
NGNGif( (OpenHandle = :InternetOpen( "title", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0 )) != NULL ){
DWORD wk = 5000;
:InternetSetOption( OpenHandle, INTERNET_OPTION_CONNECT_TIMEOUT, &wk, sizeof(wk) );
ConnectHandle = :InternetConnect( OpenHandle, pServer, INTERNET_DEFAULT_FTP_PORT, pUser, pPass, INTERNET_SERVICE_FTP, 0, 2000 );
}
↑のようにタイムアウトを5000msに設定して存在しないサーバーにコネクトすると
1分くらい後に:InternetConnectから抜けてくるのですが
タイムアウトの設定どこがいけないのでしょうか?
0739デフォルトの名無しさん
NGNG0740デフォルトの名無しさん
NGNGげっ、ひょっとして意味無いってことですかねこれを見る限りでは
では、これに代わってタイムアウトを設定する方法ってあるのでしょうか?
0741デフォルトの名無しさん
NGNGunix なら alarm。winsock だと。。。よくわかんない。
てかよく見ると work around が 739 のリンク先に書いてあるじゃん。
0742デフォルトの名無しさん
NGNG0743デフォルトの名無しさん
NGNG自分用のassertを書けばいいじゃん
#define MY_ASSERT(e) ((e)?(void)0:my_assert(__FILE__,__LINE__))
あとはお好きに。
0744デフォルトの名無しさん
NGNGデバッグ用だし別にいーじゃん。
まさかリリース時に有効にしたまま納品してないよな?
0745デフォルトの名無しさん
NGNG0746デフォルトの名無しさん
NGNG0747デフォルトの名無しさん
NGNG0748デフォルトの名無しさん
NGNGassertをソースから消せって話じゃないだろ。
リリース版ではNDEBUGを定義しとけと。
0749デフォルトの名無しさん
NGNGabort()を呼ばずに何のasert()だ?
コア吐いてくれなきゃ意味ねーじゃん。
以上、UNIXバカより。
0750デフォルトの名無しさん
NGNGバグが見付かったら積極的にクラッシュさせて、報告して
もらおうって話でしょ?
0751デフォルトの名無しさん
NGNGエラーメッセージ表示させれ
0752デフォルトの名無しさん
NGNGそんな阿呆なことするか。
■ このスレッドは過去ログ倉庫に格納されています