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

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

■ このスレッドは過去ログ倉庫に格納されています
0001lmtp2009/07/07(火) 00:46:28
主にソケットに関しての質疑応答スレッドです。

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

前スレ
ネットワークプログラミング相談室 Port23
http://pc12.2ch.net/test/read.cgi/tech/1230466044/
関連スレ
ネットワークプログラミング雑談
http://pc12.2ch.net/test/read.cgi/tech/1235800707/
Java ネットワークプログラミング 【教えて!】
http://pc11.2ch.net/test/read.cgi/tech/1086238859/
0004lmtp2009/07/07(火) 00:50:21
マスタリングTCP/IP RTP編
 http://www.amazon.co.jp/exec/obidos/ASIN/4274065618/
Linuxソケットプログラミング?ネットワークプログラミングにおける実践技法
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714671/
Webプロトコル詳解?HTTP/1.1、Webキャッシング、トラフィック特性分析
 http://www.amazon.co.jp/exec/obidos/ASIN/4894715414/
WinSock2.0プログラミング
 http://www.amazon.co.jp/exec/obidos/ASIN/4797306882/
猫でもわかるネットワークプログラミング
 http://www.amazon.co.jp/exec/obidos/ASIN/4797323604/
IPv6ネットワークプログラミング
 http://www.amazon.co.jp/exec/obidos/ASIN/4756142362/
Visual Basicではじめるネットワークプログラミング超入門
 http://www.amazon.co.jp/exec/obidos/ASIN/4839917523/
0005lmtp2009/07/07(火) 00:52:19
URL抜粋:
★規格
RFC 日本語版リスト
 http://www5d.biglobe.ne.jp/~stssk/rfcjlist.html
JPNIC RFC関連リンク集
 http://rfc-jp.nic.ad.jp/link/
RFC Editor
 http://www.rfc-editor.org/
HTMLなRFC (セクションを直に示すのに便利)
 http://www.freesoft.org/CIE/RFC/
RFC 2616 "Hypertext Transfer Protocol -- HTTP/1.1" 日本語訳
 http://www.studyinghttp.net/cgi-bin/rfc.cgi?2616
IANA Well known port numbers
 http://www.iana.org/assignments/port-numbers
0006lmtp2009/07/07(火) 00:53:30
★プログラミング
C10K ヘヴィーロードサーバ
 http://www.kegel.com/c10k.html
C10K ヘヴィーロードサーバ(日本語訳)
http://www.hyuki.com/yukiwiki/wiki.cgi?TheC10kProblem
MSDN
 http://msdn.microsoft.com/library/en-us/dnsitehelp/html/tochelp.asp
Raw IP Networking FAQ
 http://www.whitefang.com/rin/
Java で packet capture
 http://netresearch.ics.uci.edu/kfujii/jpcap/doc/
Randomness Recommendations for Security
 http://www.faqs.org/rfcs/rfc1750.html
BoostSocket
 http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?BoostSocket
The Code Project - Internet & Network programming
 http://www.codeproject.com/internet/
ネットワークプログラミングの基礎知識 (問題ありのサイト?)
 http://X68000.q-e-d.net/~68user/net/
0007lmtp2009/07/07(火) 00:57:38
★ツール類
ethereal - http://www.ethereal.com/
Wireshark - http://www.wireshark.org/
tcpdump - http://www.tcpdump.org/
Windump - http://netgroup-serv.polito.it/netgroup/tools.html
WinPcap - http://www.winpcap.org/
pathchar - ftp://ftp.ee.lbl.gov/pathchar/
pchar - http://www.employees.org/~bmah/Software/pchar/
Packetyzer - http://www.networkchemistry.com/products/packetyzer/
libevent - http://www.monkey.org/~provos/libevent/

★プロトコル
TTCP
 http://www.sean.de/Solaris/ttcp.html
 http://www.kohala.com/start/ttcp.html
UDP Hole Punching
 http://homepage3.nifty.com/toremoro/p2p/firewall.html

★IP, TCP実装
http://www.iti.fi/documentation/miniip.html
http://www.sics.se/~adam/uip/
http://www.codeguru.com/Cpp/I-N/network/tcpip/article.php/c5447/
http://www.geocities.jp/bruce_teller/security/garakuta.htm
0008デフォルトの名無しさん2009/07/07(火) 01:00:45
前スレの>990
そのおかげで腕がある人間が自己評価よりも高く買ってもらえるんで少しうれしかったりする時代でもあるよ
0009デフォルトの名無しさん2009/07/10(金) 05:56:53
RFC嫁で終わってしまうスレ
0010デフォルトの名無しさん2009/07/10(金) 07:50:50
>>9 ちゃいます。
RFCも読まずに偉そうなことが言えるスレ
0011デフォルトの名無しさん2009/07/10(金) 11:17:11
RFCとLinuxは必須ですな。
0012デフォルトの名無しさん2009/07/10(金) 11:35:46
selectとpollのそれぞれのメリットデメリットを教えて!

個人的には 書き方のスタイル(好み)の違い以上の差が無いと思う。
結局リスト全部調べないとわかんないし。
0013デフォルトの名無しさん2009/07/10(金) 11:50:17
selectはファイルディスクリプタの個数に上限がある
pollはwin32には無いのでselectより移植性が低い
0014デフォルトの名無しさん2009/07/10(金) 11:55:38
あーディスクリプタ数の話があったですね。忘れてました。
0015デフォルトの名無しさん2009/07/10(金) 14:50:13
犬がRFCに準拠している保証は無い。
やっぱ、4.4BSDぐらいじゃないか、まともに実装されてるOSは。

http://pc12.2ch.net/test/read.cgi/unix/1065245050/
4.4BSDの設計と実装
0016デフォルトの名無しさん2009/07/10(金) 23:37:38
ちょっと質問。

winsock2で、クライアントアプリを作成、send、recv等のブロック型を別スレッド(Thread2)で利用しています。
で、ファイルのダウンロード中などにその接続を中止したいときがあります。
その際、closesocket()でソケットを閉じるだけでいいのでしょうか?
それともメインスレッドやサブスレッド(Thread3)などからshutdownなどを使用し、その後closesocket()で終了させたほうがいいのでしょうか?

クライアントとして接続を途中で中止させる場合の正しい作法みたいのってあるんでしょうか?
0017デフォルトの名無しさん2009/07/10(金) 23:53:22
そのままclosesocketでおk。
0018デフォルトの名無しさん2009/07/11(土) 10:10:03
ちゃんと鯖側がセッション切れで終了処理する事前提だけどな。
QUITとか送らないといつまでも待ち続ける糞鯖プロセスも有るかもだwww
0019デフォルトの名無しさん2009/07/11(土) 10:28:42
ヘッポコなNATは手順を踏まないとエントリーがあふれる可能性がある。
0020デフォルトの名無しさん2009/07/11(土) 17:22:11
>>17-19
とりあえず、closesocketのみでもOK、ただし相手によっては手順を踏んだほうが好ましいということですね。
ありがとうございました。
0021デフォルトの名無しさん2009/07/12(日) 15:43:53
今Cで、
子プロセスで受信した情報を親プロセスで読みたいのですが、
調べたところ共有メモリとかいう単語が出てきたのですがいろいろなページを見てもよく理解できませんでした。
shmget(key_t key,int size,int shmflg)の意味もよくわかりません。
keyとshmflgが不明です。どなたか説明お願いします・・
0022デフォルトの名無しさん2009/07/12(日) 15:52:48
>>21
お前、危なっかしいから。勉強するな。
四の五の言わずにファイルに書いとけ。
0023デフォルトの名無しさん2009/07/12(日) 21:55:10
>>21
shm だけあっても同期とる手法覚えないと意味ねぇし
書き込み途中のデータ読んだりするぞ
そもそも、親子に分ける必然性があるのかと....
0024デフォルトの名無しさん2009/07/13(月) 00:23:02
質問。

WSAEventSelectについてなんだけど。
クライアントで使用する場合、

まず WSAEventSelect(sock,hEvent,FD_WRITE|FD_CLOSE); で設定しFD_WRITEイベントで必要なデータを送った後、
WSAEventSelect(sock,hEvent,FD_READ|FD_CLOSE); に設定しなおして受信を待つのが普通なのか?

WSAEventSelect(sock,hEvent,FD_READ|FD_WRITE|FD_CLOSE); にした場合、
まず読み込むデータがないのだからFD_READは来ない。
>アプリケーションは最初の FD_WRITE 通信イベントの設定から、送信で WSAEWOULDBLOCK (英語)が返されるまで送信可能だとみなすことができます。
というのがあるからFD_WRITEはすぐに来るだろ。
で、送信が終わって、相手サーバがレスポンスを返してきたときFD_READが来て受信出来る。
けど、もうこちらから送信するデータがないのにFD_READとFD_READの合間にFD_WRITEが発生した場合はどうすればいいのかな?

こちら側で送信データがない場合は FD_WRITEで処理が終わったときに
WSAEventSelect(sock,hEvent,FD_READ|FD_CLOSE); に再設定しちゃうのが普通なのだろうか?

ちょっと判りにくい文で申し訳ないけど。
0025デフォルトの名無しさん2009/07/13(月) 00:50:46
えーと、EventSelectに限らず、(他のOSでのselect系での場合も含めて)ノンブロッキングにした場合

まず、最初のwriteは普通成功する(ただし、全部送れるとは限らない)。
そして、以後のwriteが失敗した場合(ERROR_IO_PENDINGとか)に
「初めてFD_WRITEを待つ動作」を行う。
ただし、AsyncSelectだと、connect直後にFD_WRITEが来たかな。最初のwrite用に。

要は、「通常時は常に送信可能」と思っておいて
「一旦送信不可と返された時だけ、FD_WRITEを待つ」というやり方にすればよい。
「送るデータが何も無いのにFD_WRITEを待つ」なんてのは、まったく意味が無い。
0026デフォルトの名無しさん2009/07/13(月) 01:10:38
>>25
ありがとう。
つまり送るデータがない場合は、WSAEventSelect(sock,hEvent,FD_READ|FD_CLOSE); に設定するってことなのかな?

・・略・・
WSAEventSelect(sock,hEvent,FD_WRITE|FD_CLOSE);

while(WaitForSingleObject(hEvent,INFINITE)!=WAIT_FAILED)
{
 if(WSAEnumNetworkEvents(sock,hEvent,&events) == SOCKET_ERROR)
 {
  if(events.lNetworkEvents & FD_CLOSE)
  {
   ・・略・・
  }
  if(events.lNetworkEvents & FD_READ)
  {
   ・・略・・(受信)
  }
  if(events.lNetworkEvents & FD_WRITE)
  {
   ・・略・・(送信)
   if(送信するデータがなくなった==true) WSAEventSelect(sock,hEvent,FD_READ|FD_CLOSE);
}
・・略・・
0027デフォルトの名無しさん2009/07/14(火) 15:19:15
httpプロトコルでサーバ側のディレクトリを丸ごと
ダウンロードする方法はありますでしょうか?
GETはファイルのみですよね?
サーバ側にIndexOf /を出力する設定にして自力で
辿るしかないのでしょうか。
0028デフォルトの名無しさん2009/07/14(火) 17:11:11
wget
0029デフォルトの名無しさん2009/07/14(火) 17:45:20
>>27
無い。無いものはない。終了。
0030デフォルトの名無しさん2009/07/14(火) 18:07:23
ディレクトリを知る方法が無いなら無理だわな
0031デフォルトの名無しさん2009/07/14(火) 18:08:37
cgiで作るとか
WebDAVでも入れる
0032272009/07/14(火) 18:44:17
>>28
wgetは検討中です。
wgetでダウンロードを実際に行わずにディレクトリツリー
だけ取得できるようなオプションがあれば良いのですが
そのような事は可能でしょうか?

>>31
webdavはサーバ側のディレクトリの作成には対応してますが
サーバ側のディレクトリのダウンロードもいけるのでしょうか?
0033デフォルトの名無しさん2009/07/14(火) 18:53:27
キーワード分かったんだからオウム返ししてないで自分で調べろよ
0034デフォルトの名無しさん2009/07/14(火) 20:16:31
任意の鯖の/が丸見えに出来たら怖い罠。
0035デフォルトの名無しさん2009/07/14(火) 22:32:55
この際、ftpで。
0036デフォルトの名無しさん2009/07/14(火) 22:38:32
httpプロトコルでサーバ側のディレクトリを丸ごと
ダウンロードする方法はありますでしょうか?
GETはファイルのみですよね?
サーバ側にIndexOf /を出力する設定にして自力で
辿るしかないのでしょうか。


httpプロトコルで
httpプロトコルで
httpプロトコルで
0037デフォルトの名無しさん2009/07/14(火) 23:53:55
>>36
お前恥ずかしい
0038デフォルトの名無しさん2009/07/15(水) 00:34:29
>>36
HTTPプロトコルがいいんだー、ふーんHTTPね

じゃぁ、rfc2616読むといいよ
いろいろ書いてあるから
0039デフォルトの名無しさん2009/07/15(水) 01:01:06
HTTプロトコルプロトコル
0040デフォルトの名無しさん2009/07/15(水) 13:54:24
鯖側で/丸見えにしたら、世界中から丸見えで恥ずかしいと思うよ。
httpプロトコルで丸ごとコピーのプロトコル?を通せば(ry
0041デフォルトの名無しさん2009/07/17(金) 09:07:27
int listen(sockfd,backlog);
backlog=0とするのはご法度ということですが
バックログをゼロにしたいときはどうしたらよいでしょうか。
0042デフォルトの名無しさん2009/07/17(金) 10:16:23
> backlog=0とするのはご法度ということですが
聞いたこと無いなぁ。
0043デフォルトの名無しさん2009/07/17(金) 10:24:28
バックログがゼロということは、接続を一切受け付けられないということでは?
受け付けた接続を保持するキューのサイズのはずだから
0044412009/07/17(金) 10:34:48
>>43
おっしゃるとおりです。
ようするにlisten()して最初の接続を受け付けた段階で
2つ目以降の接続を受け付けたくないんですが
実際にはaccept()する前にいくつもの接続を受け付けてしまう
(クライアント側からはconnect()が完了したように見える)
のを抑止したいんです。
0045デフォルトの名無しさん2009/07/17(金) 11:04:02
>>41
acceptしたあとlistenを再度呼び出して0に再設定すればいい…
と記憶しているが、実際に試した事は無い。
0046デフォルトの名無しさん2009/07/17(金) 11:08:11
acceptしたあと、listenしなければいい。
0047デフォルトの名無しさん2009/07/17(金) 11:33:44
acceptしたあと、ソケットを閉じてしまえばいい
0048デフォルトの名無しさん2009/07/17(金) 12:07:05
僕は耳と目を閉じ口をつぐんだ人間になろうと考えたんだ
0049412009/07/17(金) 14:39:57
>>46-47
それも考えたのですが、接続が2本連続で来たとき
・listen()で待ち受け開始
・1本目接続
・2本目接続
・accept()で1本目
・listenポートをclose()
とすると2本目の人がかわいそうかなーって。

>>45
うまく動作すればcloseよりはスマートっぽいので試してみる
0050デフォルトの名無しさん2009/07/17(金) 15:54:49
Winsock2ではlistenの再呼び出しでバックログ数を変更できないらしい

http://msdn.microsoft.com/en-us/library/ms739168(VS.85).aspx
> If the listen function is called on an already listening socket,
> it will return success without changing the value for the backlog parameter.
> Setting the backlog parameter to 0 in a subsequent call to listen on a listening socket
> is not considered a proper reset, especially if there are connections on the socket.
0051デフォルトの名無しさん2009/07/18(土) 03:43:11
そこでUDPですよ
0052デフォルトの名無しさん2009/07/18(土) 19:41:20
WinsockのソケットIDをの使ってるポート番号が知りたいんだが出来る?
0053デフォルトの名無しさん2009/07/18(土) 19:57:12
>> WinsockのソケットID

Windows じゃ、やろうとか思ったことないけど、相手側の事言ってるんだったら
accept() の返りとか, getpeername() とかで何とか何ないの?

# Winsock 中の getpeername の有無はしらん
0054デフォルトの名無しさん2009/07/18(土) 20:14:27
回答者はコード出せ
0055デフォルトの名無しさん2009/07/18(土) 20:28:11
ちゃんとした質問でもないのに何いってんだか
0056デフォルトの名無しさん2009/07/18(土) 21:10:38
悪戯で煽ってる奴じゃないか?
最近あちこちにいるぞ。
0057デフォルトの名無しさん2009/07/18(土) 22:10:16
nine ライブラリてどうなの?使いやすい?
0058522009/07/18(土) 23:18:06
自己解決した
0059デフォルトの名無しさん2009/07/19(日) 10:10:04
http://pc12.2ch.net/test/read.cgi/tech/1247438792/
C/C++の宿題片付けます 129代目
0060デフォルトの名無しさん2009/07/19(日) 14:51:13
Winsockを用いてプログラムを作成してます。

strData
{
int      Count;
int      Param;
}

上記のような構造体を送信し、受信できるところまで確認したのですが、
文字列も送信したいと思っています。

strData
{
int      Count;
int      Param;
CString   Text;
}

そこで上記のようにCStringデータを追加したのですが、
CString部のデータのみ正しく受信できません。(送信しできているかも怪しいです)

そもそも上記のようなCStringを含んだ構造体は送受信可能なのでしょうか?
0061デフォルトの名無しさん2009/07/19(日) 14:56:19
CStringってVCのやつだっけ?
VCスレで聞いたほがいいんじゃない・・・
0062デフォルトの名無しさん2009/07/19(日) 15:00:46
PODでないもの送るな
0063デフォルトの名無しさん2009/07/19(日) 16:15:00
>>60
構造体ってのはサイズが固定されてるという大前提がある形の定義で
固定されてるからこそ価値がある存在だから可変するような使い方は出来ない
その場合CStringのポインタが割り当てられるだけ
送信側のポインタを相手に渡しても相手には中身は分からない
0064602009/07/19(日) 17:27:37
>>63
CStringの本体を送信しているのではなく、ポインタを送信してる訳ですか。
可変長の文字列を送信する場合は構造体に含めず、別途送信する必要があるんですね。

解りやすいご回答ありがとうございました。
0065デフォルトの名無しさん2009/07/19(日) 17:28:57
質問内容的にキツイ人なら氏ねって返されるレベルだから気をつけてね
まあおれのことだが
0066デフォルトの名無しさん2009/07/20(月) 13:27:26
2〜4人対戦ぐらいのお手軽ネットゲームを作りたいんだけど、
サーバ用EXE, クライアント用EXEとか分けずに、一つのEXEで対応したい。
その場合、クライアントとして起動したEXEはまあいいとして、
サーバとして起動した場合、自分のデータはサーバに送る必要がないから云々と処理するよりも、
すなおにサーバソケットとクライアントソケット両方つくって、
サーバスレッドとクライアントスレッドを両方動かすほうがいいよね?
クライアントは常に127.0.0.1に接続する感じで、
「自分のデータをサーバに送信、サーバから結果をクライアントに送信」をひとつのEXE内ですませるような。
0067デフォルトの名無しさん2009/07/20(月) 14:40:52
いいけど、マルチスレッドならシングルスレッドのときと同じようにlistenしても固まるだけだからな
詳しくはWSAAsyncSelectでggr
0068デフォルトの名無しさん2009/07/20(月) 14:58:58
いま select+recv+send を無限ループでまわして、それを beginthread で包み込んでるんだけど、
結局 WSAAsyncSelect とおなじこと。。だよね?
0069デフォルトの名無しさん2009/07/20(月) 15:00:24
ポーリングをOSに任せるか自分でやるかの違い
0070デフォルトの名無しさん2009/07/20(月) 16:26:43
ポ〜ラ♪
0071デフォルトの名無しさん2009/07/20(月) 17:15:08
TCPのURGフラグを使ってる上位プロトコルって何かありますか?
telnetとか?
0072デフォルトの名無しさん2009/07/21(火) 01:49:00
クライアント用ソケットを 127.0.0.1 につないで数バイトぐらいのデータを send する
(この関数は成功し、すぐに処理が戻ってくる)
サーバ用ソケットは別スレッドで作ってあって、そのスレッドの中で recv でずーっと待ってる
(関数から制御が戻ってこない状態)んだけど、
クライアントから send されたデータがいつまでたっても recv できないんです。
で、懲りずに何回かクライアントから send してると、1, 2秒ぐらいたってから思い出したように
全部まとめて recv するみたいなんですが、

そもそも同一マシン内で送受信しているのになぜここまで時間がかかるのでしょう?
なにか思い当たるフシはありますか?
0073デフォルトの名無しさん2009/07/21(火) 02:24:03
NagleアルゴリズムとかTCP_NODELAYでぐぐってみれば?
0074デフォルトの名無しさん2009/07/21(火) 08:32:53
>>72
送信側で毎回PSHフラグを立てればいいと思う
http://support.microsoft.com/kb/411582/ja
0075デフォルトの名無しさん2009/07/21(火) 14:25:07
TCP_NODELAYなんてフラグがあったんですね 試してみます。

PSHフラグって、実際に転送されるパケットの中身を直接操作する必要がありますよね??
どうやるのでしょう?それともフラグをたてるための関数が...?

0076デフォルトの名無しさん2009/07/21(火) 17:00:13
>>75
>>74のリンク先を途中でやめないで最後まで読むといいよ
0077デフォルトの名無しさん2009/07/21(火) 17:02:35
あ、レジストリ変更しないとダメなんですね.... どうもありがとう!
0078デフォルトの名無しさん2009/07/21(火) 17:37:22
>>77
受信側の処理と送信側の処理は分けて考えないと。

レジストリの変更が必要なのは、PUSHフラグのないパケットを受信側でなんとかする場合。
送信側での遅れを減らすには setsockopt() で TCP_NODELAY をセットすればいいので
レジストリを変更する必要はない。
0079デフォルトの名無しさん2009/07/22(水) 08:26:58
TCPのRFC793読んでるんですが、ESTABLISHED後は、
フラグが何も入ってないデータ入りパケットもやってくる場合がある
って解釈でいいですか?
0080デフォルトの名無しさん2009/07/22(水) 10:05:50
>>79
SEGMENT ARRIVES に書いてあるだろ。
読みにくいなら状態遷移図起こせ。
0081デフォルトの名無しさん2009/07/22(水) 10:59:15
segment text(訳の方もセグメントテキスト)ってのがそうなんでしょうか?
この用語の説明がなくてわけが判らなかった
テキスト=データってことか
0082デフォルトの名無しさん2009/07/22(水) 11:30:41
>>79
ESTABLISHED後はフラグ無しデータパケットの受信を
「期待している」というのが適切な表現だと思う。

フラグ無しデータパケットというのは、
要はユーザデータ(socketとのsend/recvで渡されるデータ)のことね。
で、(closeを発行することで)FINフラグの立ったパケットを受信すると
コネクション解放手続きが始まると。
0083デフォルトの名無しさん2009/07/22(水) 13:45:07
誰か>>82をガンダムでたとえてくれ
0084デフォルトの名無しさん2009/07/22(水) 15:02:47
http://takeshima.2ch.net/test/read.cgi/news4vip/1248238158/l50
0085デフォルトの名無しさん2009/07/23(木) 01:56:26
一応正常系はできた気がする
疲れました
0086デフォルトの名無しさん2009/07/23(木) 03:17:04
FINフラグ付きパケットを大量に送りつける攻撃も有るぉ。
種癌で言うとザフトの要塞にザフトカラーのメビウスが大量に押し寄せてくる感じ。
0087デフォルトの名無しさん2009/07/23(木) 17:29:02
FreeBSD で、UDP で blocking-recv してるソケットを
別スレッドで close してもブロックしたままなんだけ
ど、これって select 介さないと駄目なんだっけ?
0088デフォルトの名無しさん2009/07/23(木) 17:31:09
FPSや格ゲーのネットワークの同期に関する資料って
どんなキーワードでぐぐったらいいのかな
mmo,fps,ネットワーク,ラグ,同期あたりでググってるんだけど
まともに見つかったのは↓くらいで・・

sourceエンジンのネットワークの資料らしい
ttp://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking:jp
0089デフォルトの名無しさん2009/07/23(木) 18:12:23
>>87
そのへんの仕様は知らないけど、自分宛にダミーのパケット送ってやれば
ブロッキング解除されるんじゃないか
0090デフォルトの名無しさん2009/07/23(木) 18:16:36
>>89
ということはモニタ変数みたいなのが必要なわけね…
0091デフォルトの名無しさん2009/07/23(木) 18:25:09
>FreeBSD で、UDP で blocking-recv してるソケットを
>別スレッドで close してもブロックしたままなんだけ
>ど、これって select 介さないと駄目なんだっけ?

volatile fd;
0092デフォルトの名無しさん2009/07/23(木) 18:38:59
>>91
blocking-recv から制御返って来てないのにそれ関係無いでしょ
0093882009/07/23(木) 19:05:34
誰かしらんかなぁ・・・格ゲーとかどうやってんだろ
0094デフォルトの名無しさん2009/07/23(木) 19:14:29
>>91
volatileに何を期待してるんだ
0095デフォルトの名無しさん2009/07/23(木) 19:17:06
>>88
ntp
0096デフォルトの名無しさん2009/07/23(木) 19:58:19
closeするスレッドとreceive-blockingしてるスレッドは
マスタ・スレーブ(親子)の関係にあるのかな?
もしそうならマスタスレッドは(ソケットのcloseではなく)
単純にスレーブスレッドを殺せばいいんではないかと。
0097デフォルトの名無しさん2009/07/23(木) 20:25:34
多分、shutdown(s, SHUT_RD)で所望の動作が得られる。
0098デフォルトの名無しさん2009/07/23(木) 20:46:04
>>95
質問の仕方が悪かった

今考えてるのはCSで
クライアント上の描画がなるべく自然に公平になるような
それでいて同期が取れているような仕組みがないものかなーと

例えば格ゲーで攻撃されたときにのけぞったりするけど
そのパケットが届くころには実際は攻撃された場所にはいなかったりで
とんでもないところでのけぞったりするわけで
こういうのはどういう仕組みで解消されてるのか説明されてるサイトなり
資料なりないものかと・・
0099デフォルトの名無しさん2009/07/23(木) 20:50:29
解消されてない
0100デフォルトの名無しさん2009/07/23(木) 20:58:32
>>99
納得した。ありがとう
なんとかごまかしごまかしやってみる
0101デフォルトの名無しさん2009/07/23(木) 21:02:43
サーバに届いた時間と移動ベクトルとで予測時間で処理すれば
大抵は上手く動いてるように見える
pingが短くて大量に送りつけられるクライアントが有利なのは仕方が無い
0102デフォルトの名無しさん2009/07/23(木) 21:25:16
>>97
うまくいった。shutdown() 試したつもりだったけどバグってたわ(w
0103デフォルトの名無しさん2009/07/23(木) 23:47:22
http://www10.ocn.ne.jp/~mitinoie/RPGProject.zip

以下のようにすると、全てのデータがクイラアントに届かないことがある。送るたびにデバッカーで止めると届くんだが、解決策がわからない。いい方法がないか教えてほしい。

//ほかのユニットがいることを伝える
foreach(KeyValuePair<string,Session> kv in _sessions)
{
if (kv.Value.socket.isconnected() == false || kv.Value.using_char == false) continue;
units.enumUnit(0, 0, _maps[str[1]].m.width, _maps[str[1]].m.height, (uid, u) =>
{
if (uid == kv.Value.player.id) return;
kv.Value.socket.send("SpawnUnit," + uid + "," + u.x + "," + u.y + "," + (int)u.dir + "," + (int)u.type + "," + u.sprite + "," + u.name + ";");
});
}
■ このスレッドは過去ログ倉庫に格納されています