[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 03/27 11:55 / Filesize : 263 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:ftp-data mailto:sage [2007/08/07(火) 01:47:35 ]
主にソケットに関しての質疑応答スレッドです。

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

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

前スレ
ネットワークプログラミング相談室 Port19
pc10.2ch.net/test/read.cgi/tech/1159692799/

関連スレ
Java ネットワークプログラミング 【教えて!】
pc11.2ch.net/test/read.cgi/tech/1086238859/


231 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 17:12:55 ]
>>229
ストリームソケットは区切りのないただのバイト列なので、例えば100バイトを3回送信しても、1バイトずつ300回受信するかもしれないし、300バイトを1回受信するだけかもしれない。
そういう前提で扱う必要がある。
100バイトずつ処理したければ、100バイト溜まるまで繰り返しrecvを呼ぶ。

232 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 20:39:37 ]
>>230 >>231
ありがとうございました。そのように実装したいと思います

233 名前:デフォルトの名無しさん [2007/10/04(木) 23:26:47 ]
すれ違いかもしれませんがネットワークに詳しい皆さんに質問を、、、
TELNETを使用しHTTPの勉強をしております
Yahooファイナンスから企業の情報を集めたいと思っています。

charge.quote.yahoo.co.jp/q?s=1301&d=t の情報を見たいとき
telnet charge.quote.yahoo.co.jp 80
Trying 124.83.147.185...
Connected to charge.quote.yahoo.co.jp.
Escape character is '^]'.
GET /q?s=1301&d=t
The document has moved <A HREF="quote.yahoo.co.jp/q?s=1301&d=t">here</A>.<P>
<P>Additionally, a 302 Found
error was encountered while trying to use an ErrorDocument to handle the request.
となってしまい情報を見ることができないでいます
302なので/q?s=1301&d=t ←ここではないほかのURLに情報がありそうなのですが
charge.quote.yahoo.co.jp/q?s=1301&d=t の中の情報が書かれているのか真のURLがどこなのか判断する方法があったら教えていただけないでしょうか

234 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 23:41:13 ]
>>233
quote.yahoo.co.jp/q?s=1301&d=t

レスポンスに書いてるじゃん。
このドキュメントはquote〜〜にうつってますよ、って。

235 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 00:07:57 ]
>>234
ありがとうございます
恥ずかしい、、、、、申し訳ないです

236 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 01:19:53 ]
てゆーかさ、GETをHTTP/0.9でやってるから
レスポンスヘッダが付かなくて
302なレスポンスであってもLocation等で判断できないんだけど
わかってるのかね。

237 名前:デフォルトの名無しさん mailto:age [2007/10/05(金) 23:31:07 ]
FORMのPOSTをGETでアクセスできない事があるんですが?

238 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 00:15:33 ]
そうですか。

239 名前:デフォルトの名無しさん mailto:age [2007/10/06(土) 02:43:09 ]
www.premiumtv.12gbfree.com/?X3/?RTV+4277/NicoVideo1000



240 名前:デフォルトの名無しさん [2007/10/07(日) 00:22:02 ]
ノンブロックなソケットディスクリプタでサーバにコネクトするときに
そのコネクトがコンプリートしたかのステータスをゲットしたい。
ミーは何をドゥーすればいいの?

241 名前:240 mailto:sage [2007/10/07(日) 00:23:57 ]
ミーがユーズしてるOSはLinuxです

242 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 00:24:10 ]
たしかselectで書き込み可能が帰ってきたらコネクト完了

243 名前:240 mailto:sage [2007/10/07(日) 00:27:21 ]
>>242
ハリーなアンサー サンキューです。

バット、ノンブロックなソケットだとオルレディでキャンライトみたいです。
ワンモアトライしてみます。

244 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 06:18:17 ]
getpeername(2)がENOTCONを返さなくなった時がcomplete

245 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 06:46:13 ]
write(send)でFD_WRITEを指定してselect(WSAEventSelect)待ちするケースって
非同期モードですか?

環境はWindows 2000 XPです。

246 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 06:52:08 ]
というか、FD_WRITEを指定してselectってどういう時に使うのかわかりません。
「ソケットの送信バッファに空きができたことを通知」とのことですが、
一度もwrite(send)せず、いきなりselectしても検出してくれるのでしょうか。

247 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 07:20:42 ]
>>246
接続確立時に一回だけFD_WRITEの通知がきた気がする
その後は、バッファに空きのない状態→空きのできた状態、になったとき、
つまりsendしてWSAEWOULDBLOCKが返ったあとにバッファに空きができたら通知される。

248 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 08:49:42 ]
納得いきました。
ありがとうございます。

249 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 16:39:49 ]
lingerがよくわからないんだけど

今の理解は
・最後に送信する側(closesocketを呼び出す前にsendを呼び出す側)の送信が正常に行われたかを判断するために使用すると思ってます。

そこで質問は
・最後に受信する側(closesocketを呼び出す前にrecvを呼び出す側)はlingerの必要はない?
・closesocketでlingerのタイムアウトエラーが返ってきた時は、最後の送信が正常に完了していないと判断し、エラーとするまたはリトライする

と言うのであってるんですかね?




250 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 17:43:11 ]
タイムアウトが起きると送信放棄。shutdownのabortが起きる。
その他はまあそういうこと。

MSDN
Network Protocols
Windows Sockets 2
About Winsock
Winsock Programming Considerations
Graceful Shutdown, Linger Options, and Socket Closure

251 名前:デフォルトの名無しさん [2007/10/12(金) 16:12:26 ]
日本信号の改札機はなぜ起動しなかったのでしょうか?

252 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 17:48:09 ]
スレ違いだったらすみません。

DirectShowで動画再生するソフトを作ったんですけど
現在は再生する動画はローカルにある動画のみなので
これをストリーミングに対応させたいと思っています。

ストリーミングについてRTPなどのプロトコルも調べたんですが
Winsockを用いての実装手順がいまいち分かりません。

RTPのパケットを自分で実装して、データを入れる領域に
動画のフレーム、音声データを入れる形でしょうか。

動画ファイル自体をバイナリデータとして送り、ファイル出力された
動画ファイルを再生することなら出来るんですけど、ストリーミング
の実装は実際にはどのような手順で行えばよいでしょうか。

253 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 18:15:36 ]
動画ファイルの種類に寄る。
動画を映像と音声に分離して、さらにそれを一定量に分割出来なければ、難しいと思う。
AVIファイルをストリーミングさせるってのはナシな。

254 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 14:05:15 ]
>>252
ファイル出力が完了しなくても再生をはじめれば?

255 名前:デフォルトの名無しさん mailto:sage [2007/10/14(日) 22:58:38 ]
YahooファイナンスってKeep-Alive使えないんですかね

毎回接続し直すの面倒なんですけど…

256 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 06:32:25 ]


257 名前:デフォルトの名無しさん [2007/10/19(金) 09:02:36 ]
TCPで非同期(WSAAsyncSelect)を使ってプログラミングをしています。
非同期において送信する場合どのように設計すればいいのかイマイチわかりません。
やりたいことは、接続要求があったらacceptしてファイルを送信するといった内容です。

ファイルの送信要求メッセージを受信
ファイルをバイナリモードでオープン
4096バイトずつ読み込んでsend()
ファイルをクローズ

ファイルを送信した後も継続して通信は行います。
sendもノンブロッキングになってるため、

while(ファイル読み込みが終わるまで){
  send()
}

だと上手くいかないのかなと思います。調べてみると非ブロッキングにおいて連続してsend()を行おうとすると
WOULDBLOCKという現象が起こって送信できない事があるとの事です。
FD_WRITEのメッセージも別に自分が送信したいタイミングで来るわけでもないのでイマイチ有効な活用方法がわかりません。
どなたかご教授願いますm(_ _)m

258 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 09:23:05 ]
>>257
WOULDBLOCKならあとで続きを送信する

259 名前:デフォルトの名無しさん [2007/10/20(土) 00:07:00 ]
>>257
sendも非同期ですべてやればOK。
自分が、acceptまちなのかsendまちなのか。sendまちであれば、現在
何バイト送ったのか全部管理しる。



260 名前:デフォルトの名無しさん [2007/10/20(土) 00:09:54 ]
Linuxネットワークプログラミングを勉強したいのですけど、このページの下で紹介されている本でいいのでしょうか。
ttp://www.geekpage.jp/programming/linux-network/

もっといい本があったら紹介していただけないでしょうか

261 名前:デフォルトの名無しさん [2007/10/20(土) 04:31:18 ]
>>258-259
えっと、同期ならこんな感じの送信です。

while( read_byte = fread(sendbuf, sizeof(char), MAX_BUFSIZE, fp) ){
  send(sock, sendbuf, read_byte, 0);
  memset(sendbuf, NULL, sizeof(sendbuf));
}

WOULDBLOCKなら後で続きを送信するというのはこういう事でしょうか?

while( read_byte = fread(sendbuf, sizeof(char), MAX_BUFSIZE, fp) ){
  if( send(sock, sendbuf, read_byte, 0)==SOCKET_ERROR ){
    while( WSAGetLastError()==WOULDBLOCK ){
      send(sock, sendbuf, read_byte, 0);
    }
  }
  memset(sendbuf, NULL, sizeof(sendbuf));
}

あまり非同期っぽい書き方じゃないですが・・・。>>259さんのはちょっと理解が出来ないです。
send待ちとはどういう状況の事を言うのでしょうか?

262 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 05:32:52 ]
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
これは間違いなく良書だけど、はじめて学ぶ人にはお勧めできない
Linux以外の他のUnixでの実装や、実装される過程(歴史)まで乗っていて
総じて詳しすぎる。もちろん分厚い。初心者はどこが重要化取捨選択するのが
難しいので2冊目の本として考えておいた方がよいとおもいます

言語がCなら、TCP/IPソケットプログラミング オーム社(ISBN4-274-06519-7)
がオススメ。これ一通り読んでサンプル実行してみれば基礎は十分に理解できる。
内容もわかりやすく、本も薄めなので挫折する心配も少ない。

263 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 08:34:53 ]
>>261
同期非同期に関わらずsendの戻り値はチェックしよう(送信したバイト数)
非同期に関してはWOULDBLOCKが返ってきたら、FD_WRITEが来るまで待つ。

264 名前:デフォルトの名無しさん [2007/10/20(土) 08:47:52 ]
>>263
てことは、送信は別のスレッドで行って、FD_WRITEに関してはフラグで処理するといった感じになるんですか?

// 送信可能フラグをたてる
case FD_WRITE:
  send_flag = TRUE;
  return 0;

// ファイル送信スレッド
while( read_byte = fread(sendbuf, sizeof(char), MAX_BUFSIZE, fp) ){
  send_flag = FALSE;
  if( send(sock, sendbuf, read_byte, 0)==SOCKET_ERROR ){
    while( WSAGetLastError()==WOULDBLOCK ){
      while( send_flag == FALSE ) Sleep(100);
      send(sock, sendbuf, read_byte, 0);
    }
  }
  memset(sendbuf, NULL, sizeof(sendbuf));
}

こんな感じでいいのかな・・・?

265 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 08:59:55 ]
>>264
何か本でもプログラムのソースでも良いから読んで、非同期について整理した方が良い。

WinSock2プログラミング―Windows Sockets APIによるネットワークプログラミングのすべて
www.amazon.co.jp/exec/obidos/ASIN/4797330449/

猫でもわかるネットワークプログラミング 第2版
www.amazon.co.jp/exec/obidos/ASIN/4797334797/

266 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 09:03:16 ]
>>264
それじゃ、下のwhileループ群が同期になってしまうよー

慣れないうちは送信用のキューを用意すると良いかも。
キューに追加するのは自分の好きなタイミングで行い、
実際のsendやFD_WRITEの処理部分と分ける。

>>265も書いてる通り、適当なサンプル眺めれば見えてくるかもね。

267 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 09:47:26 ]
e1000の改造について詳しいドキュメントちょうだい

268 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 09:56:35 ]
>>265
ん〜書籍を買うのに金銭的余裕が・・・。
月曜日に学校の図書館に行ってWinsockの本がないかどうか見てきます。

>>266
色々と調べてはいるのですが、いまいちFD_WRITEの使い方が理解しにくいです。
FD_WRITEメッセージが来たら具体的にどういう処理をすればいいのでしょうか?
FD_WRITEメッセージは自分が送信したいタイミングで来るわけでもないんですよね。
キューを実装するということは、こういう感じで実装するということですかね・・・

while( fread(buf) ){
  push(buf);
}
PostMessage(,,FD_WRITE,);

FD_WRITE:
  if( キューにメッセージがあれば ){
    sendbuf = pup();
    send(sock, sendbuf, sizeof(sendbuf), 0);
  }
  return 0;

269 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 09:57:20 ]
pushとかpopとかこれじゃスタックっぽいですね。
脳内でキューに変換してくださいm(_ _)m



270 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 10:04:25 ]
>>268
FD_WRITEはWOULDBLOCKになってから初めてバッファに空きができたら送られるくるもの。
(自分でPostするものではない)
つまり、キューが空になるか、WOULDBLOCKが返ってくるまでsendを繰り返す。
キューへのpushは好きなようにすればい。

サンプルもネットに転がってるはずだから調べよう。

271 名前:260 mailto:sage [2007/10/20(土) 10:15:22 ]
>>262
情報ありがとうございました。探してみます

272 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 13:36:48 ]
>>262
横からサンクス。図書館で適当に借りてきたらソレだったので頑張ってやってみっかな。

273 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 13:57:44 ]
>>268
>FD_WRITEメッセージが来たら具体的にどういう処理をすればいいのでしょうか?
>FD_WRITEメッセージは自分が送信したいタイミングで来るわけでもないんですよね。

「自分の送信したいタイミングで送信する」 という考えを捨てて、「FD_WRITEが来たときに送信する」 ようにしる。
send で WOULDBLOCK が返ってきたら、残りのデータはその場で送信するのはいったん諦めて、どこか別の場所に覚えておく。
FD_WRITE が来たら、覚えておいたデータを改めて送信する。
そのときも、送りきれないと WOULDBLOCK が返ってくるので、再び FD_WRITE が来るまで残りのデータをどこかに覚えておく。

ファイルを読み込んで送るだけなら、データを丸ごと覚えなくてもファイルの現在位置を覚えるだけで充分かもしれないが。

あと、send は渡したデータをすべて送信できる保証はない。
例えば send(sock, buf, 100, 0) とやっても、1バイトしか送信できない場合もある。
何バイト送信できたか戻り値が返ってくるので、送れなかった残りのデータはもう一度送り直す必要がある。

274 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 14:52:02 ]
なぜそんなに面倒なんですか
バカみたいですね

275 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 15:04:36 ]
なぜって、非同期だからさ
バカみたいだろ?
おとなしく同期ソケット使っとけ

276 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 15:29:06 ]
>>274
イベントドリブン式/非同期プログラミングの方法はどれも似たり寄ったりだぞ。
キーワードは「継続」だ。
まあ、この程度なら別にコルーチンを使うまでもないがな。

277 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 17:12:58 ]
サーバ終了させるのってlistenしてるソケットを閉じればいいんだよね?
それとも終了する関数があるの?

278 名前:デフォルトの名無しさん [2007/10/20(土) 18:08:48 ]
すいません。
初心者のくだらない質問を受けてください。

javascriptをHTMLの中に記述して様々なことができるのは、何となく
わかりましたが、第三者に見られてはいけないプログラムはどうやって行って
いるのでしょうか?

つまり表示画面からソースを選択すれば、ソースが見れてjavascriptが
定義されていて、命令されているのはわかりますが、googleで例えると
肝心要の検索プログラムなんかは、絶対にソースなんか秘密で自社サーバー
の厳重な管理の中で動いているわけですよね?

それが見れないのは当然でわかっているのですが、HTMLのソースに記述
するjavascriptやphpなどから外部プログラムへのリンク命令?みたいな部分は
記述しないのでしょうか?

またgoogleの検索プログラムもやはりjavaやphpなんですか?
それともC言語系とかなんでしょうか?

何が言いたいのか自分でもわからなくなりましたが、どなたか教えて
ください。




279 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 18:13:07 ]
>>278
WebProg板へいってこい



280 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 18:30:30 ]
>>278
PHPのプログラムはサーバ側で動くのでブラウザからは見れない
JavaScriptのプログラムはクライアント側で動くのでブラウザから見れる
もまいの要求はブラウザから見れないプログラムなのだから
WebProg板へいってこい

281 名前:デフォルトの名無しさん [2007/10/20(土) 18:50:18 ]
>>280
ありがとうございました。
そういうことでしたか。



282 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 22:56:16 ]
サーバとクライアント2台のマシンでメモリ上のデータを交換し
ます。また交換したデータはサーバのディスクんき保存すると
いうことをします。

この時、サーバにデータ保存する保証方法なんか
みんなどうしていますか?RAID以外にどんな技術
組み合わせる?

283 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 01:01:25 ]
信頼性を高めるのか?それなら単純にバックアップもするだけでいいと思うぞ
まあ、板違いだけどな

データが改ざんされてないか調べるならハッシュ関数つかうけどな

284 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:49:11 ]
winsockなんだけど
WSASendとかで引数でWSABUFを設定するところなんだけど
int WSASend(SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesSent,DWORD dwFlags,LPWSAOVERLAPPED lpOverlapped LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);

サンプルを見るとdwBufferCountに1を指定しているのを見るんだけど
複数データを送信する時はlpBuffers配列で送信するほうが効率がいいの?

例えば10レコードのデータを送信する時など
ループで10回実行するか、1回だけ実行するかで効率が変わるのかな?

OSが勝手に送信バッファをいい具合に設定してくれる?

言ってる意味がわからんかったら言ってくれ、もうちょっと詳しく書く

285 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 11:34:53 ]
>>284
それはいわゆるVectored I/O, scatter-read/gather-writeでしょう。
Unixでいうwritev()。

そうできるんなら、配列使ったほうが効率はいいはずだ。
writev()なら効率がいい上にatomicだが、WSASendがどうだかは知らない。
MSDNのヘルプをちらっと読んだけど、あんまその辺に触れられてないね。

286 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 20:54:22 ]
0バイトのデータをsendする方法はありますか?

287 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 22:32:07 ]
0バイトのデータをsendすることに何の意味が?

288 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 22:32:57 ]
ping代わり?

289 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 23:16:08 ]
connectをノンブロックで行い官僚をselectで待って
write可能になったときにsendして成功するか確認
したいの・・・



290 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 02:31:33 ]
0byte送って確認するのか。
斬新なアイディアだ。

291 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 03:19:40 ]
いや、select()のない時代のUNIXはそうやったよ。
ノンブロックにして0byte write()。networkに限らず。


292 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 03:51:28 ]
>>289
connectでwrite可能になったというのは3way handshakeがとりあえず
成功した訳だから改めて接続を確認する必要もないんじゃない?

>>290
tcp keepalive


293 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 05:02:20 ]
>>292
write可能であっても成功したとは限らないの・・・

294 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 08:58:35 ]
>>293
connect時の最後のackが届かなかった場合?
最初のsendでエラー処理をするんじゃダメなんだろうか?

295 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 09:48:51 ]
そもそもsendが成功したら受信側にデータが届くって事が保証されてるの?

296 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 09:52:08 ]
そんなことは聞く前にソケットFAQ読め。

297 名前:292 mailto:sage [2007/10/24(水) 10:14:48 ]
>>293
あっそうか、SYN,ACKを受け取ったらwrite可能になるか。


298 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 10:59:21 ]
FAQくらい理解してから、人にアドバイスしよう。
www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja.html
3.3 なぜ、サーバが accept() する前に connect() が成功するのですか?

299 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 11:05:01 ]
>>298
それってpassive openでしかも単にソケットをuser landにacceptで渡す
タイミングの話しでしょ? 289の質問はactive openだから全然話しが違う。




300 名前:デフォルトの名無しさん [2007/10/25(木) 00:56:29 ]
サーバー用のソケットは
socketでソケット作成
bindでポート番号とかに結びつける
listenで聞く???
acceptでクライアント接続を待ちの後
交信用ソケットにクライアント対応を任せ新しいクライアント接続待ち
みたいな感じだと思うのですがlistenの必要性?がいまいちわかりません

listenの引数をみてもソケットと最大コネクション数という感じであまりいい仕事?してるようには見えません
どーしても必要ならsocketかacceptで最大コネクション数とやらを指定するようにすればよかったんじゃないのかなーと思ってしまいます

listenがlistenとして独立していて幸せと感じるのはどのようなときなのでしょうか?

301 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 06:54:40 ]
ソケットを接続待ちの状態にするためにlistenは必要。
第二引数は最大コネクション数ではなくて、キューの数だった気がする・・・
要は一気に接続要求が来たときに待ってもらう数な。

302 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 10:23:58 ]
データを送信した時に全データが送られないってことがあるじゃないですか。

これを明示的に起こさせる、起こしやすくするには、どうしたらいいですか?
どんな設定をしたらいいですかね?

setsockoption関数?で送信バッファを1に変えても変化なかったんですよね・・・

全データ遅れなかった時の動作が確認できないんです・・・

303 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 11:47:12 ]
>>300
listen で実際にサーバのポートを開く。
socket -> bind -> connect っていう手順もありうるので、bind だけではまだポートが開いてない。

304 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 11:50:48 ]
>>302
受信側の受信バッファも小さくしてみたら?
あと、受信側が recv しなければ、そのうちバッファが一杯になって送れなくなる。
1秒に1バイトずつちまちま recv するようにしてみるとか、どうかな。

305 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 11:52:46 ]
>>304
回答ありがとうございます

ちょうど今自己解決しました

送信データを1バイトずつSendしたらなりました

306 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 15:37:11 ]
nagleを切ればいいだろ

307 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 21:17:23 ]
>>306
やっぱり、全然無理でした。
どうやったらできるんだろ?
カーネルの送信バッファとsetsockoptで設定するバッファって同じことを指してるんでしょ?

送信バッファ 30バイト、送信データ100バイトとした時
send関数を使うと、戻り値が30と返ってくるって思ってるんだけど間違ってる?

308 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 21:19:18 ]
ちなみに
サーバをIOCPで実装しています。WSASend, WSARecvを実行しています

309 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 21:19:54 ]
だから正確にはsend関数は使ってません



310 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 23:37:18 ]
TCPのチェックサムって計算

仮想ヘッダ+TCPヘッダ+ペイロードだよね?

仮想ヘッダとTCPヘッダはいいけど
ペイロードってどこまでなの?

HTTPとかTCPの下になんかプロトコル付く場合
だけ計算みする



311 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 23:45:01 ]
>>310
> ペイロードってどこまでなの?

全部(もしデータが奇数だったら1バイトの0x00を付加)


312 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 03:14:59 ]
>>307
TCP/IP の下の NDIS (パケットドライバ)あたりが、パケットの非同期送信を
また別んとこのメモリの許す限りキューイングしてくれるから、そこいらへんは
あんまりあてにならない。

313 名前:デフォルトの名無しさん [2007/11/02(金) 15:00:24 ]
winsockでTCPでプログラミングをしているのですが、
たまに接続が上手くいかない時があります。
connect()を実行しても、タイムアウトになってしまいます。
一度プログラムを終了して、再度connect()したら普通に接続できます。
上手く行く時とそうでない時があるのですが、どのような事が原因として考えられるでしょうか?

314 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 15:07:17 ]
たまたまサーバや回線が混雑してて繋がらなかったとかじゃないか
WSAGetLastErrorでエラーの詳細を確認しる

315 名前:デフォルトの名無しさん [2007/11/02(金) 15:16:06 ]
>>314
connect()のエラーは10060でした。
多分タイムアウトだと思うのですが・・・。

while(SOKET_ERROR){
  connect();
}

のような感じにしていて、常に10060が返って来ます。
ネットは色んなHPを見て回れるので混雑してるとかではないと思います。
↑のループをずっと繰り返している間に、新しくクライアントのプログラムを作ってサーバに接続を試みたところ、
普通に接続が出来たので、サーバが原因ではない事は分かってます。

316 名前:デフォルトの名無しさん [2007/11/02(金) 15:31:53 ]
connectに失敗した場合、closesocketをして、再度ソケットを作成、サーバのアドレスの設定等を行い、
その後またconnect()を実行する事で、サーバに接続する事は出来ました。
しかし最初にconnect()に失敗する前のsocket()関数は正常に終了しており、sockaddr_in構造体の設定も間違ってません。
connect()が失敗した際に行う再設定は、全く同じ内容のものなのですが・・・

一体何が原因なのでしょうか・・・。

317 名前:デフォルトの名無しさん mailto:age [2007/11/02(金) 15:43:53 ]
videointroplayer.web.fc2.com/?qNwShNJEoik147%+mLB7Dx21F8r143%+4xdtm5JqwQi401%+m85hSceZi1I563%+8f5dPn0_ZJL484%+@1@_AutomaticPlay

318 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:28:53 ]
サーバは何?誰がどうやって作ったもの?

319 名前:デフォルトの名無しさん [2007/11/03(土) 18:07:41 ]
サーバは自分で作りました。これもC、Winsockで作ってます。



320 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 19:35:35 ]
>>316
connectのエラーコードは何だよ。それくらい書けばいいのに。

321 名前:デフォルトの名無しさん [2007/11/03(土) 19:50:06 ]
>>320
>>315

322 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 19:59:43 ]
>> 316
九割九分九厘名無氏作蟲

323 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 20:09:08 ]
>>316
タイムアウトだから、>>314が言っているような感じなんじゃね?
起きている事象として把握できているのが、10060だけだと考えるのはキツイかも。

回線の種別(loopback、外部への接続)とか、connectの頻度とか、
connectがエラーになる接続先は常に同一なのかとか、その辺はどうなのだろう?
あと、クライアントとサーバと両方を自分で作っているのなら、connectと
acceptの数や時刻をログ出力して比較してみるとか。
いくつか考えうる要因をピックアップして調べてみては?

324 名前:デフォルトの名無しさん [2007/11/03(土) 20:25:01 ]
>>323
しかし、connect()に失敗したら再度connect()を実行するような設計にしています。
回線の混雑が理由だったら、いつかは接続できそうな気が・・・。実際はこの状態になるといつまでも10060を返し続けます。
また、10060を返してる間に、他のクライアントプログラムを実行しサーバの同じポートにconnect()を実行したら普通に接続できました。
もちろん同じPCからです。また、10060を返した後にソケット破棄⇒再生成してconnect()を実行すると接続できるので、
どうもネットワークの混雑という理由は考えにくいような気がします。とはいえ、ネットワークの問題は原因が特定しにくいので、
完全にそうではないとは言い切れないです。

connectの頻度はそう多くないのですが、まずサーバに接続し、その直後にもう一つ接続を作ります。
この2つ目の接続でconnect()エラーが発生します。2つ目の接続はファイルの送受信用のソケットで、スレッドを立ててそちらで処理しています。
なのでacceptとconnectの数は2回ですね。

325 名前:デフォルトの名無しさん [2007/11/03(土) 20:40:58 ]
もしかして、connect()を短い間隔で2回やってるのが原因なのかなと思って、
2回目のconnect()をする前にSleep(200)を挟んで何度か実行したところ、
connect()でのエラーはなくなったように思えます。(まだ試行回数が多くないので分からないですが)

短い時間で連続してconnect()を実行した場合、何が起こるんですかね・・・?

326 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:14:09 ]
2MSL だろ

327 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:19:35 ]
サーバのOSはWinXP ProとかHomeだったりするのかい

328 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:24:36 ]
>>325
ファイアウォールのログは確認しておいてね。

329 名前:デフォルトの名無しさん [2007/11/03(土) 22:26:00 ]
>>326
winsockの仕様というよりも、TCPの仕様ですか・・・。
でも通信をクローズしてないのに関係あるんですかね?
全然詳しくないので何ともいえないですが・・・

>>327
OSはWinXP HomeEdition ver.2002 SP2です。

>>328
火壁のログの確認・・・ググってきます



330 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:37:40 ]
>>324
まずは、ネットワークトレースを見てからだ。
10060なら、syn、syn-ackがどうなっているか確かめようぜ。

331 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:45:35 ]
Linux使いなのでコード等よくわからんが、
ネットワークプログラミングのデバッグならパケットキャプチャだ。
WindowsならWiresharkがあるはず






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<263KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef