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

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

■ このスレッドは過去ログ倉庫に格納されています
0001UnknownNGNG
主にソケットに関しての質疑応答スレです。

Programming 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
>>652
ハンドシェイクを行っているんですよ
それで稀に同期がずれることがあるみたいで
シリアルでは送信前にPurgeCommをしてバッファを空にしてたんですが
UDPにもこれ相当のAPIがあれば便利かなあと思いまして、
今はとりあえず空読みして回避しています。
0654デフォルトの名無しさんNGNG
sambaがインストールされていないマシンから winpopupメッセージを送りたいのですが、
smbclient等で使われている winpopupのプロトコルはrfcで規定されているんでしょうか?
rfc1001や rfc1002を winpopupで検索して見ましたがヒットしませんでした。
0655デフォルトの名無しさんNGNG
>>653
素人はUDPを使うべきじゃない。考慮すべき事が多すぎる。
0656デフォルトの名無しさんNGNG
>>655
それじゃ一生使えないでしょが・・
で、>>653に対して何も返答できない言い訳でつか?
知らないならレスするなよな
0657デフォルトの名無しさんNGNG
UDP自体もう要らないんじゃないの?
0658デフォルトの名無しさんNGNG
>>657
UDPはトランスポート層を担うプロトコルとして、
## host内のentityをport番号で区別する。
リアルタイム系のプロトコルを支えているし、
DNSをTCPにすると、
SYN →
  ← SYN/ACK
ACK/req. →
  ← SYN/res.
となるから、かかる時間が倍になってしまう。

しかし、素人がUDP使って設計するとろくなことにならんので、素人は禁止(w
MTU discoveryとかしらんだろうし。
0659デフォルトの名無しさんNGNG
誰も>>658のような返答を期待してはいない
0660デフォルトの名無しさんNGNG
TCP_NODELAY とか
上手くいくかどうかは非常にあやしいが

0661デフォルトの名無しさんNGNG
ってUDPには関係無いや
0662デフォルトの名無しさんNGNG
知ったかぶりだったんか・・
0663デフォルトの名無しさんNGNG
up2dateみたいなアップデートシステムを簡単に作るには
どのソースを使いまわすのが良さげですか?
0664デフォルトの名無しさんNGNG
up2dateじゃない?
0665デフォルトの名無しさんNGNG
winsockのacceptをcallするトリガになるようなメッセージとかって無いすか?
CSocketのOnAcceptみたいな。
0666デフォルトの名無しさんNGNG
>>653
>ハンドシェイクを行っているんですよ
>それで稀に同期がずれることがあるみたいで
ハンドシェイクにタイムアウト実装しないヤシはペケ。
>>652 が
>UDPでしょ?相手に届く保証も無い(欠けてる事もある)し、何バイト単位で送信というわけでもないし。
と書いてるだろ。*届く保証が無い*んだから、「来ないこともある」という前提で
ハンドシェイクを久米。
ソケットがどうとか、UDPがどうとかいう以前の問題とケテーイ。
そのハンドシェイクがシリアルで動いてるとしても*運がよいだけ*と認識汁。この度素人が。
0667デフォルトの名無しさんNGNG
つーか、
>ハンドシェイクを行っているんですよ
>それで稀に同期がずれることがあるみたいで
って何言ってるつもりなの?

オーメン(>>666)分かるなら解説してくれ。
「ハンドシェイク自体に失敗する」ことを「同期がずれる」と称しているのか?
0668666オメーンNGNG
>>667
>「ハンドシェイク自体に失敗する」ことを「同期がずれる」と称しているのか?
まったくの推測であるが、
STX -> ACKとか ENQ -> ETXとかそういうことをシリアルであってた経験に
うぬぼれて、そのハンドシェイク(プロトコルと呼ぶべきか)をそのまま
イーサに持ってこようとしているのでは?
たぶん、PC<--->装置だろ。装置は計装関係あたりだろ。
・・・漏れって思い込み禿げしすぎるかも・・・
0669666オメーンNGNG
>>668
スマヌスマヌ。>>667 への回答になってなかった。
>「ハンドシェイク自体に失敗する」ことを「同期がずれる」と称しているのか?
結局、漏れが想定してるようなヤシだったら、プロトコルが思ったとおりに動かない、
ときどきこける、あるいはハンドシェイクの周期がずれる、などを
ひっくるめて、「同期がずれる」と言ってるんだろうよ。
プロトコルは穴だらけでタイミング検証もできてない実装だろうよ。たぶんな。
0670デフォルトの名無しさんNGNG
ネットワークスペシャリスト持ってますか?
0671デフォルトの名無しさんNGNG
パスワードのパケットをそのまま投げてなにがどう問題になるの?
0672デフォルトの名無しさんNGNG
他の人に読まれていいのであれば。
0673667NGNG
>>669
やっぱそうなんかな。
そうだとすると、奴はdatagram通信って何なのか理解出来てないな。

UDP datagramがlostしているだけの話で、
期待している奴の次のdatagramが来る→同期がずれるって言ってんだろう、
とも思ったが、そんな時PurgeCommは何も解決してくれないし…
0674デフォルトの名無しさんNGNG
次はTCP上で独自なSTXとかACKとか飛ばすのかな
0675デフォルトの名無しさんNGNG
なんでそんなに叩いてるの?
0676デフォルトの名無しさんNGNG
656、659等の発言を見よ。
0677デフォルトの名無しさんNGNG
ああ。

なにも知らないくせに他人を推測で批判しやがって。
漏れはお前みたいな素人と違ってちゃんとUDP理解してるし、
その上で面倒がおきるから使うなと言ってんだバカヤロウ。
味噌汁で顔を洗って出直して故意。(゚д゚)ペッ!

っつーワケですな。
まぁ、聞くほうは答えが出揃うまでは謙虚にしていろっつーことだ罠。
利根川先生もそう仰っている。
0678デフォルトの名無しさんNGNG
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/lame-list.html
0679666オメーンNGNG
>>676
PurgeCommみたいなのWinsockには、無い。他は知らん。

ioctlsocket/WSAIoctlでFIONREAD/FIONREAD , SIO_FLUSH
あたりを嫁ってか。
んなもん使ったらドライバ依存しまくりだろ。
PurgeCommがまともに動くのは、シリアルドライバがMS純正だからだろ。
サードパーティ製シリアルボードではハマリまくるぞ。<-逆もあり

漏れは胃ガンぽいヤシが胃薬を買いにきたら、「早く医者へ行けヴォケ」と言いたいけどなぁ。
0680デフォルトの名無しさんNGNG
お前等口だけだね(´,_ゝ`)
0681デフォルトの名無しさんNGNG
>>680
丸2日かけて浮かんだカキコがソレ?
0682デフォルトの名無しさんNGNG
socket通信くらいで何いばってんの?
0683デフォルトの名無しさんNGNG
>>648はどこいったんだ?

仕様変更できるなら、TCPにしとけよ〜!
0684デフォルトの名無しさんNGNG
そのsocketもまともに使えない奴が何言ってるの?
0685デフォルトの名無しさんNGNG
(´Д`;)ヘコム・・・
0686デフォルトの名無しさんNGNG
トゲトゲしなさんな。
相談しずらくなる。
0687デフォルトの名無しさんNGNG
相談しづらくなる
0688デフォルトの名無しさんNGNG
>>686
日本語もまともに使えない奴が何言ってるの?
0689BSDソケ子NGNG
(・∀・)ニヤニヤ
0690デフォルトの名無しさんNGNG
なぁ〜んか知ったかぶりの厨房が何かほざいてますねぇ
0691デフォルトの名無しさんNGNG
知ったかぶりはプログラマとして最低限必要な技術です
それが出来ない人間はプログラマとしての適性はありません
0692デフォルトの名無しさんNGNG
>>691のような勘違い君は上げですな
0693デフォルトの名無しさんNGNG
HSPスレかと思った
0694デフォルトの名無しさんNGNG
粘 着 U z eeeeeeeeeeee
0695デフォルトの名無しさんNGNG
CAsyncSocketの派生クラスCSocketAを作り、
CSocketA* m_p1;
CSocketA* m_p2;
とし、別々の場所(同じスレッド内)からそれぞれ
m_p1 = new CSocketA;
m_p2 = new CSocketA;
としてインスタンスを作って使用すると、sockcore.cppの513行目のアサートが発生します。
別々のインスタンスなので大丈夫だと思ったのですが、このような使い方は間違っているのでしょうか?
これを回避するにはどうすればよいのでしょうか?
0696デフォルトの名無しさんNGNG
CSocket Considered Harmful
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/csocket.html
0697デフォルトの名無しさんNGNG
>>696
そこに載っていることとは関係無いと思うんですけど・・・
0698デフォルトの名無しさんNGNG
>>695
コンパイラもライブラリバージョンも書かず、513行目と言われても
なんのことやら
0699デフォルトの名無しさんNGNG
>>698
VC++6です。
0700デフォルトの名無しさんNGNG
【使用すると】の部分が問題じゃなくて?
0701デフォルトの名無しさんNGNG
それぞれCreateしてConnectしてCAsyncSocket派生クラス内のOnSendやOnReceiveを
オーバーライドしてるだけなんですけどね・・・
OnSendやOnReceiveの中身をすべてコメントアウトして、
一方のCreate、Connectの両方をコメントアウトすると(つまり一方のインスタンスは
newしてdeleteするだけ)アサートしません。
しかし、Createして実行するとアサートします。
0702701NGNG
テスト用のダイアログベースのプロジェクト作って確認してみました。
CAsyncSocketの派生クラス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);
とします。
後はボタンを交互に連続で何回か押せばアサートが起きます。
0703701NGNG
>>702のソースから、Send呼び出しの1行をコメントアウトするとアサートは起きません。
0704デフォルトの名無しさんNGNG
MFCソースを見ればわかるかとは思うけど、
たぶん、Create直後にAttachHandleしとけばいい
0705デフォルトの名無しさんNGNG
>>704
AttachHandleするとはどういうことでしょうか?
CAsyncSocketメンバ関数にAttachというのはありますが、これではないですよね。
0706デフォルトの名無しさんNGNG
CAsyncSocket::AttachHandle(pSocket->m_hSocket, pSocket, FALSE);
0707デフォルトの名無しさんNGNG
FTPクライアントを作ってみてるんですけど、ファイルをダウンロードする処理で
perlだとwhile(<SOCK>){}で全データダウンロードできますが
Cの場合、どのように全データダウンロードできたということを判定したら
よいでしょうか?
0708デフォルトの名無しさんNGNG
ソケットが切れたら完了
0709デフォルトの名無しさんNGNG
>>708
recvの戻り値が0ってことですか?
0710デフォルトの名無しさんNGNG
recvの戻り値は関係ない
接続が切れたら終了
0711デフォルトの名無しさんNGNG
>>710
接続が切れたことはrecvの戻り値が0かどうかで判断すると思ったのですが。
あっ。とりあえずselectは使ってない場合です。あとでつける予定です。
以前データより先にcloseのパケットが先に到着するような話題があったと思うので
ちょっと心配。
0712BSDソケ斗NGNG
>>707
OSは何なの?
recvなんか使わずに、fread使いなさいよ。fdopenしてさ。
Win9xのWinsockは、socketがfile handleじゃないから駄目だけど。
0713デフォルトの名無しさんNGNG
>>712
OSはWinです。9x系もありです。スマソ
0714デフォルトの名無しさんNGNG
>>710
> recvの戻り値は関係ない
> 接続が切れたら終了

アフォか?

>>711
> 以前データより先にcloseのパケットが先に到着するような話題があったと思うので
> ちょっと心配。

TCP はストリーム型通信だから、そんなことはあり得ない。
実際に順序が逆転してパケットが到着したとしても、
アプリケーションにはちゃんと順番通りに通知されるから、
安心しろ。
0715デフォルトの名無しさんNGNG
>>714
thx
安心しますた。

selectもいれて一通りできるようになりました。
たぶん、closeパケットうんぬんはwinsock2で非同期ソケットの
場合のMS独自のバグみたいなものだったかもしれません。うるおぼえでスマソ
0716デフォルトの名無しさんNGNG
それはちょっと安心しすぎ。closeの後にreadが到着する可能性はあると
MSDNには書かれてる。
> 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
>>716
それは、アプリケーションがソケットをクローズした後で
データが到着する可能性がある、って話だろ?
>>711 が言ってるのは、相手からの FIN が相手からのデータ
を追い越して来ちゃうかもしれない、って話だろ?
ごっちゃにするな。
0718デフォルトの名無しさんNGNG
>>717
カコ(・∀・)イイ!!
0719デフォルトの名無しさんNGNG
>>706
Createの直後にそれやると今度はsockcore.cppの408行目でアサートしますが・・・
0720デフォルトの名無しさんNGNG
すでにclosesocketしたハンドルをもう一度closesocketしてもよいでしょうか?
0721デフォルトの名無しさんNGNG
>>720
良い悪い以前に、そんなこと必要ないだろ?
0722デフォルトの名無しさんNGNG
>>721
エラーが出たら全部クローズしたいんですけど。だめですか?
0723山崎渉NGNG
(^^)
0724デフォルトの名無しさんNGNG
保守age
0725デフォルトの名無しさんNGNG
>>722
エラーが出たらクローズするのはいいけどそれが>>720にどう関わってるん?
0726デフォルトの名無しさんNGNG
716の解釈は、
「WSAAsyncSelect などを使った場合に、コネクションが閉じられたら、FD_CLOSE が飛んでくる。
だが、その時点で、まだソケットバッファにデータが溜まったままになってることがあるから、
データロストしたくなかったら、ソケットバッファをチェック(recvなどで)しといた方がいいよ。」
ってことじゃないかな?

あと、前スレの912も見ておいたほうがいいかも。
0727702NGNG
http://support.microsoft.com/default.aspx?scid=http://www.microsoft.com/japan/support/kb/articles/417/0/91.asp
概要からこれかもしれませんが、まだ解決法は無いみたいです。
0728BSDソケ斗NGNG
>>726
つーか、>>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
>>727
同URLより、
> 解決方法: クライアントからのデータ送信を行う際に Sleep API などにより
> 間隔を空けることで回避可能な場合があります。
ぷ 「解決方法:〜場合があります」だってさ。
0730デフォルトの名無しさんNGNG
>>725
複数ソケットをオープンしてて、ソケットを閉じるタイミングが違うじゃないっすか?
エラーがでたとき、いちいち開いてるのだけクローズするのって面倒じゃないですか。
0731デフォルトの名無しさんNGNG
プログラム組むとき、いちいちエラー処理するのって面倒じゃないですか。
0732デフォルトの名無しさんNGNG
>>730
UNIX のソケットしか知らないんだけど、あるソケットをクローズしたら、
そのソケットディスクリプタを格納する変数に、-1 を放り込んでおいて、
何らかのエラー発生時には、値が -1 以外のものをクローズする、ってのは
どう? よくやる手法だと思うんだけど。

クローズ時。

 close(s);
 s = -1;

エラーで全部をクローズする時。

 if (s >= 0) close(s);
0733デフォルトの名無しさんNGNG
>>731
面倒なので極力しないようにしてまつ。

>>732
(・∀・)イイ!!
なるほどねー
いただきます。
0734BSDソケ斗NGNG
>>732
つーか、UNIXだと、
#define MAX_FD (システムごとに違う)
for (int i=0;i<MAX_FD;i++) { (void)close(i); }
こんな乱暴なのもしばしばだわな。

Winsockだと、 二回目はWSAENOTSOCKつーエラーになるだけのはずだけど、
Winsockは油断ならんから、ジェントルにプログラミングしといた方がいいよ。
SO_LINGERしているなら、MSDN参照な。
0735デフォルトの名無しさんNGNG
FTPならファイルリストからサイズを取得して
そのサイズまで達していなかったらリトライ
転送中に切れることまで考慮するのならそうすべき
0736デフォルトの名無しさんNGNG
エラー処理くらい入れとけよ・・・
最悪assert程度でもいいからさ
0737デフォルトの名無しさんNGNG
>>735
うわー
それは気づかなかった。
0738デフォルトの名無しさんNGNG
ちょっと質問
if( (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デフォルトの名無しさんNGNG
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q176/4/20.ASP&NoWebContent=1
0740デフォルトの名無しさんNGNG
>>739
げっ、ひょっとして意味無いってことですかねこれを見る限りでは
では、これに代わってタイムアウトを設定する方法ってあるのでしょうか?
0741デフォルトの名無しさんNGNG
>>740
unix なら alarm。winsock だと。。。よくわかんない。
てかよく見ると work around が 739 のリンク先に書いてあるじゃん。
0742デフォルトの名無しさんNGNG
assertってabortを呼ぶから嫌い。exit(1)にしてくれればよかったのに。
0743デフォルトの名無しさんNGNG
>>742
自分用のassertを書けばいいじゃん
#define MY_ASSERT(e) ((e)?(void)0:my_assert(__FILE__,__LINE__))
あとはお好きに。
0744デフォルトの名無しさんNGNG
>>742
デバッグ用だし別にいーじゃん。
まさかリリース時に有効にしたまま納品してないよな?
0745デフォルトの名無しさんNGNG
リリース後も継続して品質を向上する気ならリリース版にも(my)assertは必要だな。
0746デフォルトの名無しさんNGNG
assertって何ですか?
0747デフォルトの名無しさんNGNG
Cスレ逝け
0748デフォルトの名無しさんNGNG
>745
assertをソースから消せって話じゃないだろ。
リリース版ではNDEBUGを定義しとけと。
0749デフォルトの名無しさんNGNG
>>742
abort()を呼ばずに何のasert()だ?
コア吐いてくれなきゃ意味ねーじゃん。
以上、UNIXバカより。
0750デフォルトの名無しさんNGNG
>>748
バグが見付かったら積極的にクラッシュさせて、報告して
もらおうって話でしょ?
0751デフォルトの名無しさんNGNG
>>750
エラーメッセージ表示させれ
0752デフォルトの名無しさんNGNG
>>744
そんな阿呆なことするか。
■ このスレッドは過去ログ倉庫に格納されています