ネットワークプログラミング相談室 Port24
レス数が1000を超えています。これ以上書き込みはできません。
0001lmtp
2009/07/07(火) 00:46:28Programming 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/
0002lmtp
2009/07/07(火) 00:47:11Port22 ttp://pc11.2ch.net/test/read.cgi/tech/1222603744/
Port21 ttp://pc11.2ch.net/test/read.cgi/tech/1204287577/
Port20 ttp://pc11.2ch.net/test/read.cgi/tech/1186418855/
Port19 ttp://pc10.2ch.net/test/read.cgi/tech/1159692799/
Port18 ttp://pc11.2ch.net/test/read.cgi/tech/1171029896/
Port17 ttp://pc8.2ch.net/test/read.cgi/tech/1148944560/
Port16 ttp://pc8.2ch.net/test/read.cgi/tech/1136005644/
Port15 ttp://pc8.2ch.net/test/read.cgi/tech/1128088448/
Port14 ttp://pc8.2ch.net/test/read.cgi/tech/1118469143/
Port13 ttp://pc8.2ch.net/test/read.cgi/tech/1109793931/
Port12 ttp://pc5.2ch.net/test/read.cgi/tech/1102427855/
Port11 ttp://pc5.2ch.net/test/read.cgi/tech/1096187183/
Port10 ttp://pc5.2ch.net/test/read.cgi/tech/1090385857/
Port9 ttp://pc5.2ch.net/test/read.cgi/tech/1080658835/
Port8 ttp://pc5.2ch.net/test/read.cgi/tech/1073560271/
Port7 ttp://pc5.2ch.net/test/read.cgi/tech/1063035045/ ★行方不明
Port6 ttp://pc5.2ch.net/tech/kako/1052/10521/1052106444.html
Port5 ttp://pc2.2ch.net/tech/kako/1040/10402/1040220302.html
Port4 ttp://pc3.2ch.net/tech/kako/1034/10342/1034236536.html
Port3 ttp://pc3.2ch.net/tech/kako/1023/10233/1023359282.html
Port2 ttp://pc.2ch.net/tech/kako/1006/10062/1006258198.html
Port1 ttp://pc.2ch.net/tech/kako/970/970344582.html
0003lmtp
2009/07/07(火) 00:47:57UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
http://www.amazon.co.jp/exec/obidos/ASIN/4894712059/
そのソースコード
http://www.unpbook.com/src.html
詳解TCP/IP〈Vol.1〉プロトコル
http://www.amazon.co.jp/exec/obidos/ASIN/4894713209/
詳解TCP/IP〈Vol.2〉実装
http://www.amazon.co.jp/exec/obidos/ASIN/4894714957/
詳解TCP/IP〈Vol.3〉トランザクションTCP, HTTP, NNTP, UNIXドメインプロトコル
http://www.amazon.co.jp/exec/obidos/ASIN/4894716674/
TCP/IPによるネットワーク構築
〈Vol.1〉原理・プロトコル・アーキテクチャ
http://www.amazon.co.jp/exec/obidos/ASIN/432012054X/
〈Vol.3〉クライアント‐サーバプログラミングとアプリケーション
http://www.amazon.co.jp/exec/obidos/ASIN/4320028007/
Linux/POSIXソケットバージョン
http://www.amazon.co.jp/exec/obidos/ASIN/4320120841/
Windowsソケットバージョン
http://www.amazon.co.jp/exec/obidos/ASIN/4320029992/
0004lmtp
2009/07/07(火) 00:50:21http://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/
0005lmtp
2009/07/07(火) 00:52:19★規格
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
0006lmtp
2009/07/07(火) 00:53:30C10K ヘヴィーロードサーバ
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/
0007lmtp
2009/07/07(火) 00:57:38ethereal - 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そのおかげで腕がある人間が自己評価よりも高く買ってもらえるんで少しうれしかったりする時代でもあるよ
0009デフォルトの名無しさん
2009/07/10(金) 05:56:530010デフォルトの名無しさん
2009/07/10(金) 07:50:50RFCも読まずに偉そうなことが言えるスレ
0011デフォルトの名無しさん
2009/07/10(金) 11:17:110012デフォルトの名無しさん
2009/07/10(金) 11:35:46個人的には 書き方のスタイル(好み)の違い以上の差が無いと思う。
結局リスト全部調べないとわかんないし。
0013デフォルトの名無しさん
2009/07/10(金) 11:50:17pollはwin32には無いのでselectより移植性が低い
0014デフォルトの名無しさん
2009/07/10(金) 11:55:380015デフォルトの名無しさん
2009/07/10(金) 14:50:13やっぱ、4.4BSDぐらいじゃないか、まともに実装されてるOSは。
http://pc12.2ch.net/test/read.cgi/unix/1065245050/
4.4BSDの設計と実装
0016デフォルトの名無しさん
2009/07/10(金) 23:37:38winsock2で、クライアントアプリを作成、send、recv等のブロック型を別スレッド(Thread2)で利用しています。
で、ファイルのダウンロード中などにその接続を中止したいときがあります。
その際、closesocket()でソケットを閉じるだけでいいのでしょうか?
それともメインスレッドやサブスレッド(Thread3)などからshutdownなどを使用し、その後closesocket()で終了させたほうがいいのでしょうか?
クライアントとして接続を途中で中止させる場合の正しい作法みたいのってあるんでしょうか?
0017デフォルトの名無しさん
2009/07/10(金) 23:53:220018デフォルトの名無しさん
2009/07/11(土) 10:10:03QUITとか送らないといつまでも待ち続ける糞鯖プロセスも有るかもだwww
0019デフォルトの名無しさん
2009/07/11(土) 10:28:420020デフォルトの名無しさん
2009/07/11(土) 17:22:11とりあえず、closesocketのみでもOK、ただし相手によっては手順を踏んだほうが好ましいということですね。
ありがとうございました。
0021デフォルトの名無しさん
2009/07/12(日) 15:43:53子プロセスで受信した情報を親プロセスで読みたいのですが、
調べたところ共有メモリとかいう単語が出てきたのですがいろいろなページを見てもよく理解できませんでした。
shmget(key_t key,int size,int shmflg)の意味もよくわかりません。
keyとshmflgが不明です。どなたか説明お願いします・・
0022デフォルトの名無しさん
2009/07/12(日) 15:52:48お前、危なっかしいから。勉強するな。
四の五の言わずにファイルに書いとけ。
0023デフォルトの名無しさん
2009/07/12(日) 21:55:10shm だけあっても同期とる手法覚えないと意味ねぇし
書き込み途中のデータ読んだりするぞ
そもそも、親子に分ける必然性があるのかと....
0024デフォルトの名無しさん
2009/07/13(月) 00:23:02WSAEventSelectについてなんだけど。
クライアントで使用する場合、
まず 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まず、最初のwriteは普通成功する(ただし、全部送れるとは限らない)。
そして、以後のwriteが失敗した場合(ERROR_IO_PENDINGとか)に
「初めてFD_WRITEを待つ動作」を行う。
ただし、AsyncSelectだと、connect直後にFD_WRITEが来たかな。最初のwrite用に。
要は、「通常時は常に送信可能」と思っておいて
「一旦送信不可と返された時だけ、FD_WRITEを待つ」というやり方にすればよい。
「送るデータが何も無いのにFD_WRITEを待つ」なんてのは、まったく意味が無い。
0026デフォルトの名無しさん
2009/07/13(月) 01:10:38ありがとう。
つまり送るデータがない場合は、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ダウンロードする方法はありますでしょうか?
GETはファイルのみですよね?
サーバ側にIndexOf /を出力する設定にして自力で
辿るしかないのでしょうか。
0028デフォルトの名無しさん
2009/07/14(火) 17:11:110029デフォルトの名無しさん
2009/07/14(火) 17:45:20無い。無いものはない。終了。
0030デフォルトの名無しさん
2009/07/14(火) 18:07:230031デフォルトの名無しさん
2009/07/14(火) 18:08:37WebDAVでも入れる
003227
2009/07/14(火) 18:44:17wgetは検討中です。
wgetでダウンロードを実際に行わずにディレクトリツリー
だけ取得できるようなオプションがあれば良いのですが
そのような事は可能でしょうか?
>>31
webdavはサーバ側のディレクトリの作成には対応してますが
サーバ側のディレクトリのダウンロードもいけるのでしょうか?
0033デフォルトの名無しさん
2009/07/14(火) 18:53:270034デフォルトの名無しさん
2009/07/14(火) 20:16:310035デフォルトの名無しさん
2009/07/14(火) 22:32:550036デフォルトの名無しさん
2009/07/14(火) 22:38:32ダウンロードする方法はありますでしょうか?
GETはファイルのみですよね?
サーバ側にIndexOf /を出力する設定にして自力で
辿るしかないのでしょうか。
httpプロトコルで
httpプロトコルで
httpプロトコルで
0037デフォルトの名無しさん
2009/07/14(火) 23:53:55お前恥ずかしい
0038デフォルトの名無しさん
2009/07/15(水) 00:34:29HTTPプロトコルがいいんだー、ふーんHTTPね
じゃぁ、rfc2616読むといいよ
いろいろ書いてあるから
0039デフォルトの名無しさん
2009/07/15(水) 01:01:060040デフォルトの名無しさん
2009/07/15(水) 13:54:24httpプロトコルで丸ごとコピーのプロトコル?を通せば(ry
0041デフォルトの名無しさん
2009/07/17(金) 09:07:27backlog=0とするのはご法度ということですが
バックログをゼロにしたいときはどうしたらよいでしょうか。
0042デフォルトの名無しさん
2009/07/17(金) 10:16:23聞いたこと無いなぁ。
0043デフォルトの名無しさん
2009/07/17(金) 10:24:28受け付けた接続を保持するキューのサイズのはずだから
004441
2009/07/17(金) 10:34:48おっしゃるとおりです。
ようするにlisten()して最初の接続を受け付けた段階で
2つ目以降の接続を受け付けたくないんですが
実際にはaccept()する前にいくつもの接続を受け付けてしまう
(クライアント側からはconnect()が完了したように見える)
のを抑止したいんです。
0045デフォルトの名無しさん
2009/07/17(金) 11:04:02acceptしたあとlistenを再度呼び出して0に再設定すればいい…
と記憶しているが、実際に試した事は無い。
0046デフォルトの名無しさん
2009/07/17(金) 11:08:110047デフォルトの名無しさん
2009/07/17(金) 11:33:440048デフォルトの名無しさん
2009/07/17(金) 12:07:05004941
2009/07/17(金) 14:39:57それも考えたのですが、接続が2本連続で来たとき
・listen()で待ち受け開始
・1本目接続
・2本目接続
・accept()で1本目
・listenポートをclose()
とすると2本目の人がかわいそうかなーって。
>>45
うまく動作すればcloseよりはスマートっぽいので試してみる
0050デフォルトの名無しさん
2009/07/17(金) 15:54:49http://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:110052デフォルトの名無しさん
2009/07/18(土) 19:41:200053デフォルトの名無しさん
2009/07/18(土) 19:57:12Windows じゃ、やろうとか思ったことないけど、相手側の事言ってるんだったら
accept() の返りとか, getpeername() とかで何とか何ないの?
# Winsock 中の getpeername の有無はしらん
0054デフォルトの名無しさん
2009/07/18(土) 20:14:270055デフォルトの名無しさん
2009/07/18(土) 20:28:110056デフォルトの名無しさん
2009/07/18(土) 21:10:38最近あちこちにいるぞ。
0057デフォルトの名無しさん
2009/07/18(土) 22:10:16005852
2009/07/18(土) 23:18:060059デフォルトの名無しさん
2009/07/19(日) 10:10:04C/C++の宿題片付けます 129代目
0060デフォルトの名無しさん
2009/07/19(日) 14:51:13strData
{
int Count;
int Param;
}
上記のような構造体を送信し、受信できるところまで確認したのですが、
文字列も送信したいと思っています。
strData
{
int Count;
int Param;
CString Text;
}
そこで上記のようにCStringデータを追加したのですが、
CString部のデータのみ正しく受信できません。(送信しできているかも怪しいです)
そもそも上記のようなCStringを含んだ構造体は送受信可能なのでしょうか?
0061デフォルトの名無しさん
2009/07/19(日) 14:56:19VCスレで聞いたほがいいんじゃない・・・
0062デフォルトの名無しさん
2009/07/19(日) 15:00:460063デフォルトの名無しさん
2009/07/19(日) 16:15:00構造体ってのはサイズが固定されてるという大前提がある形の定義で
固定されてるからこそ価値がある存在だから可変するような使い方は出来ない
その場合CStringのポインタが割り当てられるだけ
送信側のポインタを相手に渡しても相手には中身は分からない
006460
2009/07/19(日) 17:27:37CStringの本体を送信しているのではなく、ポインタを送信してる訳ですか。
可変長の文字列を送信する場合は構造体に含めず、別途送信する必要があるんですね。
解りやすいご回答ありがとうございました。
0065デフォルトの名無しさん
2009/07/19(日) 17:28:57まあおれのことだが
0066デフォルトの名無しさん
2009/07/20(月) 13:27:26サーバ用EXE, クライアント用EXEとか分けずに、一つのEXEで対応したい。
その場合、クライアントとして起動したEXEはまあいいとして、
サーバとして起動した場合、自分のデータはサーバに送る必要がないから云々と処理するよりも、
すなおにサーバソケットとクライアントソケット両方つくって、
サーバスレッドとクライアントスレッドを両方動かすほうがいいよね?
クライアントは常に127.0.0.1に接続する感じで、
「自分のデータをサーバに送信、サーバから結果をクライアントに送信」をひとつのEXE内ですませるような。
0067デフォルトの名無しさん
2009/07/20(月) 14:40:52詳しくはWSAAsyncSelectでggr
0068デフォルトの名無しさん
2009/07/20(月) 14:58:58結局 WSAAsyncSelect とおなじこと。。だよね?
0069デフォルトの名無しさん
2009/07/20(月) 15:00:240070デフォルトの名無しさん
2009/07/20(月) 16:26:430071デフォルトの名無しさん
2009/07/20(月) 17:15:08telnetとか?
0072デフォルトの名無しさん
2009/07/21(火) 01:49:00(この関数は成功し、すぐに処理が戻ってくる)
サーバ用ソケットは別スレッドで作ってあって、そのスレッドの中で recv でずーっと待ってる
(関数から制御が戻ってこない状態)んだけど、
クライアントから send されたデータがいつまでたっても recv できないんです。
で、懲りずに何回かクライアントから send してると、1, 2秒ぐらいたってから思い出したように
全部まとめて recv するみたいなんですが、
そもそも同一マシン内で送受信しているのになぜここまで時間がかかるのでしょう?
なにか思い当たるフシはありますか?
0073デフォルトの名無しさん
2009/07/21(火) 02:24:030074デフォルトの名無しさん
2009/07/21(火) 08:32:53送信側で毎回PSHフラグを立てればいいと思う
http://support.microsoft.com/kb/411582/ja
0075デフォルトの名無しさん
2009/07/21(火) 14:25:07PSHフラグって、実際に転送されるパケットの中身を直接操作する必要がありますよね??
どうやるのでしょう?それともフラグをたてるための関数が...?
0076デフォルトの名無しさん
2009/07/21(火) 17:00:13>>74のリンク先を途中でやめないで最後まで読むといいよ
0077デフォルトの名無しさん
2009/07/21(火) 17:02:350078デフォルトの名無しさん
2009/07/21(火) 17:37:22受信側の処理と送信側の処理は分けて考えないと。
レジストリの変更が必要なのは、PUSHフラグのないパケットを受信側でなんとかする場合。
送信側での遅れを減らすには setsockopt() で TCP_NODELAY をセットすればいいので
レジストリを変更する必要はない。
0079デフォルトの名無しさん
2009/07/22(水) 08:26:58フラグが何も入ってないデータ入りパケットもやってくる場合がある
って解釈でいいですか?
0080デフォルトの名無しさん
2009/07/22(水) 10:05:50SEGMENT ARRIVES に書いてあるだろ。
読みにくいなら状態遷移図起こせ。
0081デフォルトの名無しさん
2009/07/22(水) 10:59:15この用語の説明がなくてわけが判らなかった
テキスト=データってことか
0082デフォルトの名無しさん
2009/07/22(水) 11:30:41ESTABLISHED後はフラグ無しデータパケットの受信を
「期待している」というのが適切な表現だと思う。
フラグ無しデータパケットというのは、
要はユーザデータ(socketとのsend/recvで渡されるデータ)のことね。
で、(closeを発行することで)FINフラグの立ったパケットを受信すると
コネクション解放手続きが始まると。
0083デフォルトの名無しさん
2009/07/22(水) 13:45:070084デフォルトの名無しさん
2009/07/22(水) 15:02:470085デフォルトの名無しさん
2009/07/23(木) 01:56:26疲れました
0086デフォルトの名無しさん
2009/07/23(木) 03:17:04種癌で言うとザフトの要塞にザフトカラーのメビウスが大量に押し寄せてくる感じ。
0087デフォルトの名無しさん
2009/07/23(木) 17:29:02別スレッドで close してもブロックしたままなんだけ
ど、これって select 介さないと駄目なんだっけ?
0088デフォルトの名無しさん
2009/07/23(木) 17:31:09どんなキーワードでぐぐったらいいのかな
mmo,fps,ネットワーク,ラグ,同期あたりでググってるんだけど
まともに見つかったのは↓くらいで・・
sourceエンジンのネットワークの資料らしい
ttp://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking:jp
0089デフォルトの名無しさん
2009/07/23(木) 18:12:23そのへんの仕様は知らないけど、自分宛にダミーのパケット送ってやれば
ブロッキング解除されるんじゃないか
0090デフォルトの名無しさん
2009/07/23(木) 18:16:36ということはモニタ変数みたいなのが必要なわけね…
0091デフォルトの名無しさん
2009/07/23(木) 18:25:09>別スレッドで close してもブロックしたままなんだけ
>ど、これって select 介さないと駄目なんだっけ?
volatile fd;
0092デフォルトの名無しさん
2009/07/23(木) 18:38:59blocking-recv から制御返って来てないのにそれ関係無いでしょ
009388
2009/07/23(木) 19:05:340094デフォルトの名無しさん
2009/07/23(木) 19:14:29volatileに何を期待してるんだ
0095デフォルトの名無しさん
2009/07/23(木) 19:17:06ntp
0096デフォルトの名無しさん
2009/07/23(木) 19:58:19マスタ・スレーブ(親子)の関係にあるのかな?
もしそうならマスタスレッドは(ソケットのcloseではなく)
単純にスレーブスレッドを殺せばいいんではないかと。
0097デフォルトの名無しさん
2009/07/23(木) 20:25:340098デフォルトの名無しさん
2009/07/23(木) 20:46:04質問の仕方が悪かった
今考えてるのはCSで
クライアント上の描画がなるべく自然に公平になるような
それでいて同期が取れているような仕組みがないものかなーと
例えば格ゲーで攻撃されたときにのけぞったりするけど
そのパケットが届くころには実際は攻撃された場所にはいなかったりで
とんでもないところでのけぞったりするわけで
こういうのはどういう仕組みで解消されてるのか説明されてるサイトなり
資料なりないものかと・・
0099デフォルトの名無しさん
2009/07/23(木) 20:50:290100デフォルトの名無しさん
2009/07/23(木) 20:58:32納得した。ありがとう
なんとかごまかしごまかしやってみる
0101デフォルトの名無しさん
2009/07/23(木) 21:02:43大抵は上手く動いてるように見える
pingが短くて大量に送りつけられるクライアントが有利なのは仕方が無い
0102デフォルトの名無しさん
2009/07/23(木) 21:25:16うまくいった。shutdown() 試したつもりだったけどバグってたわ(w
0103デフォルトの名無しさん
2009/07/23(木) 23:47:22以下のようにすると、全てのデータがクイラアントに届かないことがある。送るたびにデバッカーで止めると届くんだが、解決策がわからない。いい方法がないか教えてほしい。
//ほかのユニットがいることを伝える
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 + ";");
});
}
0104デフォルトの名無しさん
2009/07/24(金) 02:10:07全部の入力を見て、演算して送り返す頃には十分遅延している。
自分だけはリアルタイムで処理。周りは鯖経由で遅延した情報で処理で誤摩化すしか。
0105デフォルトの名無しさん
2009/07/24(金) 09:58:47socketのsendはすべてのデータを送るとは限らない。sendの戻りを確認すべし。
010688
2009/07/24(金) 10:17:00当たり判定自体はsourceエンジンのラグ補償の考え方を適用する
例えばAがBにスタンしたとすると
サーバー側がAとのレイテンシを考慮して
Aの画面でBへのスタンがちゃんと当たってるか計算する
これはレンテンシが一定の場合はBの位置情報を送ってるのがサーバーなので
正常に計算できるはず
で、問題なのはここからでBはどこでスタンすべきか。色々思いつくものを・・
�@Aの画面でスタンしたBの位置(情報はAが送る)
�AAの画面でスタンしたBの位置(サーバー側で送った位置情報から取得)
�BAがスタンしたというパケットをサーバー側が受け取った時点のサーバーが保持するBの位置
�CBがスタンされましたというパケットをBに送り、その時点の位置をBからサーバーに送ってもらう
�DBがスタンされましたというパケットをBに送り、Bに届いたとサーバー側で推測される時点のBの位置
0107デフォルトの名無しさん
2009/07/24(金) 10:28:28また�@〜�BはAの画面で激しくゴムヨーヨー現象やワープが起きるのでこれもあまりやりたくない
となると残りは�D
�Dは分かりにくいのだが当たり判定自体は攻撃者のAの画面を優先し(ラグ補償)
位置情報自体は被攻撃者のBの画面を優先する。
デメリットはAから見てスタン後にすべること
サーバーからAへのレイテンシがta(ms)、Bへのレイテンシがtb(ms)だとする
�Dの方法はAの画面でスタンをぶちかました時点を0とすると
サーバーにその情報がたどり着くのがta(ここで当たり判定確定)
さらにBへ届くのがta+tb(Bの移動はここまで有効)
ta+tbまでのBの移動情報がサーバーに届くのがta+tb*2(この時点までサーバーはBの移動パケットを許容する)
さらにAにBの移動情報が届くのが(ta+tb)*2
このとき初めてBがスタンしたのをAは見ることができるが
BはAの画面でスタンを発動した位置からta+tbの間に動ける距離離れた場所でスタンする
まぁ・・なんてややこしんだろう
要するに当たり判定は攻撃者視点、位置情報は被攻撃者視点を優先した場合ってことで
ゲームによって優先すべきものが違うと思うが
今回のわたしのゲームはこれでやってみます
ping高いプレイヤーがいるとすべりまくるね。ワープしまくりとどっちがいいのか・・
0108デフォルトの名無しさん
2009/07/24(金) 10:50:02見たとこ、受信側も悪い
送ったデータはブツ切りで届くことがあるから、
1行の区切り文字が来るまでバッファに溜めておかないとだめ
0109デフォルトの名無しさん
2009/07/24(金) 12:46:14確認してみたのですが、全て送られてました。
0110デフォルトの名無しさん
2009/07/24(金) 12:53:11TCPなら 1回の send で送れた量 != 1回の recv で得られる量 なので
受信側はバッファリングして 終端記号や ヘッダ+サイズ で切り出さないといけない
0111105
2009/07/24(金) 13:05:540112103
2009/07/24(金) 14:04:26ログをとってみたら、見事にまとめられていました。なので、受信する部分をこのようにしてみました。ですが、NPCの出現を10以上にするとでなくなります。
private void recive(string remoteip,byte[] bytes, int len)
{
string str = Encoding.Unicode.GetString(bytes,0,len);
//区切り文字まで届いてるか確認する
if (str.IndexOf(';') == -1)
return;
string[] line = str.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < line.Length; i++)
{
string[] splitted = line[i].Split(new string[] { "," }, StringSplitOptions.None);
_scm.broadcastNotify(new object[] { ScreenRequst.RECEIVE_PACKET, splitted });
}
}
追記
アップしているほうも更新しておきました。URLは103と同じです。
0113デフォルトの名無しさん
2009/07/24(金) 14:10:52ソース見てないけど
1回の受信で
[まとまり][まとまり][半端
もあるわけで、recve 後 "[半端" を次の recv 時に付け足す
FIFOバッファを想定しないとまずいんじゃないかな?
0114デフォルトの名無しさん
2009/07/24(金) 14:17:50区切り文字まで届いてないからって、そのデータを捨ててはいけない
どこかに取っておいて、次に来たデータと合わせて処理する (次は、前の続きからのデータしか来ない)
届いてた場合も、最後に残った半端な行は次に来るデータと合わせるために同じように取っておく
例えば "ABC", "DEF", "GHI" という3つのデータをsendしたとすると、
recv側は "ABC", "DEF", "GHI" と受け取るかもしれないが、
"AB", "CDEFG", "HI" と受け取るかもしれないし、
"ABCDE", "FGHI" と受け取るかもしれないし、
"A", "B", "C", "D", "E", "F", "G", "H", "I" と受け取るかもしれない
どこで分断・結合されても対処できるようにしないといけない
0115デフォルトの名無しさん
2009/07/24(金) 15:56:16ソース見てないけど、自分でrecv関数を操作するよりも、
C標準ライブラリのfdopenでソケットをFILE *にした後、
fgetsやfscanfで読み込んだ方が簡単にプログラミングできるよ。
改行コードが届くまで受信プロセスをブロックしてくれるから。
0116デフォルトの名無しさん
2009/07/24(金) 15:57:091536byteくらい?
0117デフォルトの名無しさん
2009/07/24(金) 16:45:21今のところはチマチマ考えず、ドッカーンと確保すればいい。
たとえば想定される「最大メッセージ長 * 2」を数kbyte単位で切り捨て。
4kbyte(4096byte)くらい用意しておけばいいんじゃね。
今回のは実験、演習、あるいはホビーのプログラミングなんでそ?
0118デフォルトの名無しさん
2009/07/24(金) 17:55:14おそらくネトゲを作ってるんだろうからブロッキングでは済まないんだと思われるよ。
0119デフォルトの名無しさん
2009/07/24(金) 19:23:59んー、確かにLAN内なら無問題だけど、Internet環境だと
パケット遅延があるから、>>115の方法だと、
1行を組立てる間に数百msのブロックが発生する可能性があるね。
格ゲーだったら大問題になる。
ただ、今はまずプログラムを「論理的に正しく動かす」ことが先じゃないかと。
想定される問題は忘れないように検討課題としてメモしてブロッキングの話は
(今は)置いておき、どんどん前進すべきじゃないかと思う。
後から(C標準ライブラリに代わる)非ブロッキング入力対応の論理に変更するのは、
状態「初期/組み立て中/完了」を持つステートマシンを設計すれば(設計できれば)
比較的容易に実装できるだろうし。(>>113の言うFIFOバッファの実装の事ね)
たぶん、ネトゲなら1プロセス内で各プレーヤを疑似マルチタスク
(今時の言葉ではファイバー(?))として実装させることになると思うから、
その時一緒に。
もちろんマルチスレッド構成で実装するのなら、各スレッドはブロックされても
かまわないわけだし。
0120デフォルトの名無しさん
2009/07/24(金) 21:32:19失念してました。
.NET Frameworkの非同期ソケットを使ってます。
0121115
2009/07/24(金) 23:10:29勝手にC言語だと思い込んでいました。あぁ恥ずかしや....。
こちらこそ失礼しました。
.NETは知識がありませんが、ソケットからデータを読み込み、
もし改行コードがあれば(1行分の組み立てが完了したなら)、
それを解読してメッセージ受信というイベントを
(プレーヤの?)タスクへ通知するという基本的な考え方は共通だと思います。
後は他の人にまかせて、漏れは落ちます。デハ、サラバ
0122デフォルトの名無しさん
2009/07/24(金) 23:42:56>>82
少なくともACKが入ってないと破棄対象になる。
0123デフォルトの名無しさん
2009/07/25(土) 00:52:01FINとかACKのパケット大量に送りつけるだけで沈黙しそうだが。
0124デフォルトの名無しさん
2009/07/28(火) 17:58:30UDPで大きなデータグラムが送られてくるとき、
recvfrom側では分割受信することはできないのでしょうか?
たとえば、3000バイトのデータグラムを受信するのに、
100バイトのバッファで全データを受信したいのですが
GetLastError()では234(0xea データがさらにあります。 )となってしまい、
続けてrecvfromを行うとブロックしてしまいます。
0125デフォルトの名無しさん
2009/07/28(火) 18:03:27全体を格納できるバッファを用意するしかない。
はみでた分は捨てられる。
続けて行うとブロックするのは次のデータグラムを待ってるだけ。
0126デフォルトの名無しさん
2009/07/28(火) 19:18:22最大の大きさが分かってるんだから、分割する必要は無い。
普通のetherのパケットだと1500バイトくらいまでしか送れないよ。
0127デフォルトの名無しさん
2009/07/28(火) 19:26:030128デフォルトの名無しさん
2009/07/28(火) 19:35:13ありがとうございます。
UDPは送られてくるパケットが到達しないことがあるという前提に乗っかって、
GetLastError()で234がきたら、そのパケットは無視してバッファを倍増する
みたいな実装はスマートじゃないですよね?
どんな実装をするのが良いのでしょうか。やっぱりTCPですか?
0129デフォルトの名無しさん
2009/07/28(火) 19:45:39UDPということだから一切受けないという方法もある
0130デフォルトの名無しさん
2009/07/28(火) 19:53:37いえ、実際にはsendが50kbくらいで、recvが10kb程度を想定してました。
バッファをスタックにとっていたのでサイズを気にしていたのですが、他ではあまりスタックを使わないので大して意味のないこだわりだと思います。
0131デフォルトの名無しさん
2009/07/28(火) 20:20:14受信バッファサイズとパケットの(必ず相手に届くという)送達保証とは
別々に検討しなさい。
ユーザデータ長がEthenetフレーム(>>126が言うように1KBちょっと)を
越えるようであれば、(UDPではなく)TCPを使うのが定石。
もし(組み込み機器などで)リソースに制限があり、TCPドライバが
実装できないためにUDPを使用せざるをえない場合には、
(UDPの上位にある)アプリケーション層で送達確認機能を実装する。
具体的にはTFTPが参考になる。(もちろん受信バッファサイズは固定。)
でもWindowsなんでしょ?であれば素直にTCPで設計しなさい。
0132デフォルトの名無しさん
2009/07/28(火) 21:15:39>普通のetherのパケットだと1500バイトくらいまでしか送れないよ。
んな訳あるかい。df立てない限りフラグメントされる。
0133デフォルトの名無しさん
2009/07/28(火) 23:39:110134デフォルトの名無しさん
2009/07/28(火) 23:42:580135デフォルトの名無しさん
2009/07/29(水) 03:42:52ADSLとか非力NASとか。
0136デフォルトの名無しさん
2009/07/29(水) 03:54:36んな訳あるかい
0137デフォルトの名無しさん
2009/07/29(水) 09:12:15フラグメントがどのレイヤで発生するのか、勉強し直せ。
0138デフォルトの名無しさん
2009/07/29(水) 10:14:200139デフォルトの名無しさん
2009/07/29(水) 19:41:39サーバ側マシン命令を送って(例えば move とか)
サーバ側マシン上においてOpenGLで描画されている3DCGを動かす
プログラムを作りたいと思っています。
この場合,サーバ側は,マルチスレッドにするしか方法はないのでしょうか?
クライアントから命令がくる→OpenGLに反映
はマルチスレッドじゃないとむりぽ!?
えろいひと、よろしくおねがいします。
0140デフォルトの名無しさん
2009/07/29(水) 19:49:25OpenGLをマルチスレッドで動かすほうが面倒じゃね?
0141デフォルトの名無しさん
2009/07/29(水) 20:00:35シングルプロセス/シングルスレッド構成でも実現できると思うが、
想定している言語(C/C++/Java/Ruby/ObjC)や
プラットフォーム(Win/Linux/MacOSX)を明記してくれないと
アドバイスのしようがない。
0142デフォルトの名無しさん
2009/07/29(水) 20:04:58早速のご回答ありがとうございます。
iPhone上のOpenGL ESで描いたCGを母艦マシン(MacOSX)から
操りたいと考えています。
そのため,仕様言語はObjective-Cになります。
スレッド・プロセスまわりの話しに詳しくないので
何が最適なのか戸惑っています。
もうしわけありませんが、ご教示いただければ幸いです。
0143デフォルトの名無しさん
2009/07/29(水) 20:05:25結局は何もつくれないに一票
0144デフォルトの名無しさん
2009/07/29(水) 20:18:56Rubyがお勧め。標準でdRuby(分散オブジェクト)があるし、
OpenGLはRuby-GNOME2で実装されている。
プロジェクトが構想段階なら検討してみては?
0145デフォルトの名無しさん
2009/07/29(水) 20:28:470147デフォルトの名無しさん
2009/07/29(水) 20:55:450148デフォルトの名無しさん
2009/07/29(水) 22:03:03iPhone向けの開発経験は無いけどReference Libraryを漁ってみた。
まずNSProx/NSConnectionで分散オブジェクトが簡単だろうと思ったが、
iPhoneOSのFoundation FrameworkにはNSConnectionクラスが見当たらない。
次にCFNetwork(Core Foundation)にはHTTP/FTP/Web Service向けのクラスは
存在するけど、どれもクライアント側のプロトコルしか実装されていない。
結論として、直にTCPソケット(CFStream)を操作して独自のプロトコルを
実装するしかないと判断する。(TCPコネクション確立はiPhone側から開始)
送受信メッセージのエンコーディングには、PropertyListを利用するのが
良いと思われる。(想定転送データ量によってバイナリ/XML形式の選択を決断)
で、最終的に質問のマルチスレッディングの要否についてだけど、
run loopにコールバック関数を登録する事で非同期I/Oが実現できるから、
結論として「マルチスレッディング無しで実装可能」と判断する。
iPhone Reference Libraryにある文書"CFNetwork Programming Guide"の
章"Preventing Blocking When Working with Streams"を参照してみてください。
実際に試した訳ではないので(すべて推測なので)、間違ってたらゴメソ
0150148
2009/07/29(水) 23:23:04MacをクライアントそしてiPhoneをOpenGL表示サーバと位置づけ、
メッセージの対話形態としては「要求/応答/通知」方式にするのが良いと思う。
具体的には、Mac上のアプリケーションが表示メソッドを呼び出すと、
要求メッセージが送信され、iPhone上の表示サーバで要求された描画処理が
完了すると応答メッセージを返信する。またiPhone側からアプリケーションへ
イベントを発行したい場合(たとえば処理中断ボタンがタップされた)には、
通知メッセージを送信する。
おそらくX-Window Systemのコアプロトコルが参考になる。
意外にもWikipediaの文書が充実しているので、一読を勧めます。
ttp://ja.wikipedia.org/wiki/X_Window_System_コアプロトコル
RPCと分散オブジェクトを(Foundation Framework無しに)自力で実装する
わけですから、もしも汎用的な「リモートOpenGL表示システム」の設計を
目指すとしたら、かなり大変な作業になると思います。
でも、がんばって挑戦してみてください!!
0151デフォルトの名無しさん
2009/07/30(木) 11:51:422chに書き込めない原因がわかりません。誰か手伝ってくれますか?
http://www1.axfc.net/uploader/Sc/so/22688.zip
0152デフォルトの名無しさん
2009/07/30(木) 12:36:020153デフォルトの名無しさん
2009/07/30(木) 12:45:04V~~''-山┴''''""~ ヾニニ彡| 手伝う・・・・・・!
/ 二ー―''二 ヾニニ┤ 手伝うが・・・
<'-.,  ̄ ̄ _,,,..-‐、 〉ニニ| 今回 まだ その時と場所の
/"''-ニ,‐l l`__ニ-‐'''""` /ニ二| 指定まではしていない
| ===、! `=====、 l =lべ=|
. | `ー゚‐'/ `ー‐゚―' l.=lへ|~| そのことを
|`ー‐/ `ー―― H<,〉|=| どうか諸君らも
| / 、 l|__ノー| 思い出していただきたい
. | /`ー ~ ′ \ .|ヾ.ニ|ヽ
|l 下王l王l王l王lヲ| | ヾ_,| \ つまり・・・・
. | ≡ | `l \__ 我々がその気になれば
!、 _,,..-'′ /l | ~''' そのzipを開くのが
‐''" ̄| `iー-..,,,_,,,,,....-‐'''" / | | 10年後 2chが無くなってからということも
-―| |\ / | | 可能だろう・・・・・・・・・・ということ・・・・!
0154デフォルトの名無しさん
2009/07/30(木) 12:52:010155デフォルトの名無しさん
2009/07/30(木) 12:55:12無かったね。218行目と357行目付近にWriteSz("\r\n");を追加。
0156デフォルトの名無しさん
2009/07/30(木) 13:30:43{
wsprintf(buf, "; %s=%s", it->first.c_str(),
url_escape(it->second).c_str());
WriteSz(buf);
}
これって cookie.end() にもデータはあるんだろ?
do
{
・・・処理・・・
}while(it != cookie.end()); じゃね?
0157デフォルトの名無しさん
2009/07/30(木) 13:37:09http://www.cplusplus.com/reference/stl/map/end/
0158デフォルトの名無しさん
2009/07/30(木) 13:40:090159デフォルトの名無しさん
2009/07/30(木) 14:32:190160デフォルトの名無しさん
2009/07/30(木) 14:34:070161デフォルトの名無しさん
2009/07/30(木) 14:35:190162デフォルトの名無しさん
2009/07/30(木) 16:06:02天邪鬼どもが
0163デフォルトの名無しさん
2009/07/30(木) 16:16:41アップしてくれ
0164デフォルトの名無しさん
2009/07/30(木) 16:23:550165デフォルトの名無しさん
2009/07/30(木) 16:25:02何でやねん、数行しか変わってないがな。
うまくいかんのならそう書けば。
そうそう、pc11.2ch.net を pc12.2ch.netに変えたりもしたけど。
0166デフォルトの名無しさん
2009/07/30(木) 16:43:230167デフォルトの名無しさん
2009/07/30(木) 23:04:220168デフォルトの名無しさん
2009/07/30(木) 23:15:36非同期系ではそういう幻想を持たないほうがいい。
0169デフォルトの名無しさん
2009/07/30(木) 23:20:34そうなんですか。あるんですか。。
デバッグ中にブロックされていないはずの recv() が WSAEWOULDBLOCK を
返すところを見ちゃった気がするのですが気のせいだと思ってました。 orz
0170デフォルトの名無しさん
2009/07/30(木) 23:45:35通常ありえないよ。
デバッガで止めてたからとか。
0171デフォルトの名無しさん
2009/07/31(金) 00:45:32戻りを確認するifを入れて実際に起きるかどうか確認すればいい。
0172デフォルトの名無しさん
2009/07/31(金) 11:25:21「ERROR:ブラウザを立ち上げなおしてみてください。」
て出てきてできなかった。
http://www1.axfc.net/uploader/Sc/so/23023.zip
0173デフォルトの名無しさん
2009/07/31(金) 22:26:18確かにデバッガで止めてはいたのですが。。
色々調べてみるとWin9x系では起きるがNT系では起きないとか
select()はブロックされない事を完全には保証しないとか。
サンプルプログラム等をみるとselect()は非ブロックキングソケットを
使うのが前提となっているみたいですな。
ブロッキングされないのが保証されるのならブロッキングソケットでも
問題ないはずですが。
0174デフォルトの名無しさん
2009/07/31(金) 22:32:30ブロックされないのが保証できないなら、インターネット動いてねーわ。
0175デフォルトの名無しさん
2009/08/01(土) 00:04:37ブロッキングの意味を間違えて理解してる気がする。
あと、
>select()はブロックされない事を完全には保証しないとか。
という一文についても、日本語の解釈が誤っているのでは?
これは、ソケットにデータが到着していないにもかかわらず、
selectが戻ることがある(=ブロッキングを保証できない)、
という意味だと思う。言い換えると、selectが戻っても
いざreceiveしてみると受信データ長=0になることも時にはあるから、
その場合はもう一度selectをかけておくれ、を期待しているのではないかな。
最後におせっかいを言うと、何かトラブルが発生したとき、
「....だから、問題ないはず」という思い込みは解決のさまたげになる。
「....だけど、どこかに問題があるはず」という発想でいこうよ。
0176デフォルトの名無しさん
2009/08/01(土) 00:20:24受信データ長=0はfinがきたってこと。
それでもう一度selectって処理は普通しない。
そうでなければTCP的に言えば受信データ長0ってのは
確認応答しかありえない。これは上位レイヤーに届くことはない。
と言ってみる。
0177デフォルトの名無しさん
2009/08/01(土) 00:28:02長さ1以上はデータ、0は通信の終了を意味する。
TCPがデータストリームの実装だという事を忘れている。
0178デフォルトの名無しさん
2009/08/01(土) 00:40:25では、
>いざreceiveしてみると受信データ長=0になることも時にはあるから、
の部分は、
>いざreceiveしてみるとエラー(EAGAIN or EWOULDBLOCK)になることも時にはあるから、
に訂正する。
0179デフォルトの名無しさん
2009/08/01(土) 12:10:552chへの書き込みができない。誰か助けて!
http://www1.axfc.net/uploader/Sc/so/23023.zip
0180デフォルトの名無しさん
2009/08/01(土) 13:02:00C/C++の宿題片付けます 129代目
http://pc12.2ch.net/test/read.cgi/tech/1242876647/
いろんな言語で宿題スレ
http://pc12.2ch.net/test/read.cgi/tech/1197620454/
C#,C#の宿題片付けます。
0181デフォルトの名無しさん
2009/08/01(土) 13:10:28ブロックすることあるよ」って書いてあるな。
0182デフォルトの名無しさん
2009/08/01(土) 13:25:00宿題スレに書けと? 宿題じゃないんだけど。
0183デフォルトの名無しさん
2009/08/01(土) 16:22:15これか・・・
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
>データが到着したが、検査でチェックサム異常が見つかり廃棄された
>時などに起こりえる。
一体どこで検査してんだ
破棄したなら上に投げるなよw
明らかに違反してるだろ
時など、って他にもあるなら書けよ
省略すんなよ
0184デフォルトの名無しさん
2009/08/01(土) 18:40:57自分でネットの勉強ぐらいしろよ。
0185デフォルトの名無しさん
2009/08/01(土) 18:51:30http://pc12.2ch.net/test/read.cgi/tech/1224449899/
0187デフォルトの名無しさん
2009/08/02(日) 05:48:55Linux TCP/IPドライバの中の人を擁護してみると、
一般論としてselectを前提にしたAPI(ソケット/デバイス/ライブラリなど)の場合、
selectでREAD可能を返したのにread操作でデータ無しとなってしまう事態は、
どうしても避けることができないケースが存在しえることを理解してほしい。
今回のLinux TCP/IPドライバの場合、受信割り込みの延長でのチェックサム計算は
(システム全体の応答性能を劣化させるから)避けたかったのだろうと推測する。
だから最近のAPIでは(特にGUI向けAPIでは)、APIの内部でevent loop & selectを実行し
本当にデータが到着した場合にだけ(事前にアプリケーションが登録した)
call back関数を呼ぶという方式が増えているのだと思う。
この方式であれば今回のselectの問題だけでなく、このスレでたびたび話題となっている
受信メッセージの組み立て処理もAPI側で吸収できる(アプリケーションから隠蔽できる)
利点がある。
0188デフォルトの名無しさん
2009/08/02(日) 08:35:44> 今回のLinux TCP/IPドライバの場合、受信割り込みの延長でのチェックサム計算は
> (システム全体の応答性能を劣化させるから)避けたかったのだろうと推測する。
割り込み処理は, 読み込んだ物理層のフレームをソケットバッファにつないで
ソケットバッファ持ってるプロセス(スレッド)を起こすだけ.
IPヘッダやさらに上位の層のチェックサムはプロセスコンテキストで計算して
る
到着したセグメントを捨てた後, 再度新規セグメントの入力待ちに移行する方
法を選択しなかっただけ.
おそらく, 初期の腐りきったスタックの挙動と互換性を取る為だとおもわれる.
0189デフォルトの名無しさん
2009/08/02(日) 09:02:37TCP/IPのタイムアウトの設定なんかかなり古いもんを引きずっている気がする。
connect()なんてタイムアウトまで待ちきれなくて自分で切ってるし
TIME_WAITなんかも長く居座り過ぎだし。
今のギガビットのネットワークにはそぐわないな。
0190デフォルトの名無しさん
2009/08/02(日) 09:20:05> TIME_WAITなんかも長く居座り過ぎだし。
RFC で 2MSL と決まってる
0191187
2009/08/02(日) 09:28:17詳しい解説ありがとう。TCP/IPドライバの実装に詳しそうだから教えてほしいのだけど、
>割り込み処理は, 読み込んだ物理層のフレームをソケットバッファにつないで
>ソケットバッファ持ってるプロセス(スレッド)を起こすだけ.
とありますが、起こすのはシステムプロセス(システムスレッド)でいいのでしょうか?
もしアプリケーションプロセスだと、そのプロセスが監視(select or recv)していない時は
フレーム受信キューに溜まりっぱなしになってしまう訳だから。
ただ、そうだとすれば、チェックサム計算はシステムプロセスで実行して
エラーであれば破棄し、正常であれば(上位の)ソケット受信キューへつないで
アプリケーションプロセスを起こすように実装していれば、
(チェックサム計算エラーに限定すると)今回のselect問題は発生しなかったように思えます。
その辺が自分にはよく分からないのですよ。
0192デフォルトの名無しさん
2009/08/02(日) 10:07:53> とありますが、起こすのはシステムプロセス(システムスレッド)でいいのでしょうか?
そだよ.
> フレーム受信キューに溜まりっぱなしになってしまう訳だから。
どっちにしても, 受け取る奴がいないとたまりっぱなし
window size = 0 で ack 返して送信側がそれ以上送らないように制御する
UDP だと黙って捨てる
> エラーであれば破棄し、正常であれば(上位の)ソケット受信キューへつないで
> アプリケーションプロセスを起こすように実装していれば、
BSD 系の実装だとそうなってるし, Linux も 2.0 から 2.2 へ移行するときの
大幅にスタック書き換えたタイミングで, そうゆう実装をする選択枝も可能
だったはず.
ソース眺めても, そんなに大変な変更じゃないし………
結局は, 過去との互換性を取ったって事ではあるまいか?
0193デフォルトの名無しさん
2009/08/02(日) 10:14:350194187,191
2009/08/02(日) 10:21:39過去との互換性ですか。
もしTCP/IPスタックの実装を参考にしようと思ったら、
(Linuxではなく)BSD系のコードを追ったほうが良さげですね。
どちらにしてもスレから脱線した質問ですので、これで終わりにします。
レスありがとうございました。
0195デフォルトの名無しさん
2009/08/02(日) 11:54:18もっと続けて欲しい
0196デフォルトの名無しさん
2009/08/02(日) 12:26:02ネットで拾えるサンプルプログラムがDQNな実装(特に.Net系)だったりするので
挙動が分かってないと苦労しまするよ。
0197デフォルトの名無しさん
2009/08/02(日) 12:27:58> 受信割り込みの延長でのチェックサム計算は(システ
> ム全体の応答性能を劣化させるから)避けたかったの
> だろう
昔組み込み向けネットワークドライバを Linux でクロ
ス開発してて、テストとして Linux のパケットをルー
プバックデバイス経由で RAW ソケットで読んでもチェッ
クサムが合わなくてさぁ…。
FreeBSD でやったら一発で通って「なんじゃそら」って
なもんでしたよ。
0198デフォルトの名無しさん
2009/08/02(日) 12:32:200199デフォルトの名無しさん
2009/08/02(日) 12:35:21そうなん?
Linux鯖って結構稼動している気がするが。
0200デフォルトの名無しさん
2009/08/02(日) 15:15:26パケット生成時にチェックサム作るなんてことしない。
その辺考慮してないと197みたいなことになる。
0201デフォルトの名無しさん
2009/08/02(日) 15:57:39自分のルータのグローバルIPアドレスを外部鯖にHTTP接続して取得したいのだけど、
【IPのみ】をページ表示してくれる有名な鯖とかってある?
本当はホスト名を一発表示してくれるとこがいいけど、
まーAPIでなんとかなるんでとりあずIPで!
0202201
2009/08/02(日) 15:59:44IPのみというのは、IPアドレス以外の無駄な情報が無いってこと。
正規表現とかHTMLパーサーとか使うのが面倒なので・・・。
0203デフォルトの名無しさん
2009/08/02(日) 16:02:160204201
2009/08/02(日) 16:03:50汎用的な方法がしりたいんでつ
いろいろな場所で使いたいので、ルータ固有となるとちょっと・・
SNMPも一般向けのルータにはあまりないらしいので。
0205デフォルトの名無しさん
2009/08/02(日) 16:25:49汎用的な方法は、自分のルータのグローバルIPアドレスを
Dynamic DNSに登録して、その名前でIPアドレスを検索すること。
登録するドメインは自分で取得してもいいし、借りてもいい。
おそらく自宅鯖を外部からアクセスしたいんだとエスパーするけど、
汎用的な方法はこれしかない。
DNSへの登録が嫌で、なおかつ汎用的でなくても良ければ、
自分で安いレンタル鯖を借り、要求元のIPだけを返すCGIを置けばいい。
いずれにしても板違いの質問だよ。
自宅サーバ板/通信技術板/ネットサービス板へドーゾ。
0206デフォルトの名無しさん
2009/08/02(日) 16:27:38へぇ〜、そんなハードもあるんだ。。
一般のパソコンにも実装されてるの?
0207デフォルトの名無しさん
2009/08/02(日) 16:35:00そういうサーバを立てればいいだけじゃね?
0208デフォルトの名無しさん
2009/08/02(日) 16:38:38> いまどき、IPはもちろん、TCPチェックサムまでは、送信受信ともハードウェアの仕事でしょ。
> パケット生成時にチェックサム作るなんてことしない。
NAT とかどうすんのさ。仮想レイヤは? 一々ハードウェ
アレイヤまで落すのか? そもそも NIC 持ってないマシ
ンでの SLIP とかどうすんの?
0209デフォルトの名無しさん
2009/08/02(日) 16:42:49基本reject_hostに入れてる。
犬のTCP/IPスタック周りの挙動は怪しいよな。学習用のminix由来じゃしょうがないが。
0210デフォルトの名無しさん
2009/08/02(日) 16:48:04> 学習用のminix由来
Minix なめんな(w
http://www.minix3.org/
0211デフォルトの名無しさん
2009/08/02(日) 16:50:580212201
2009/08/02(日) 16:52:57板違いなのに答えてくれてサンクス
自分がだけが使うわけではないから、DynamicDNS登録もcgiもパスかな。
素直に診断君とか、適当な鯖にUDP送って取得することにする
どもでしたー
0213デフォルトの名無しさん
2009/08/02(日) 16:53:14おそらく以下の記事にある「TCPチェックサムオフロード」の事を
>>200は言っているのだと思う。
FreeBSD 10ギガビットネットワーク高速通信の秘密(2008/10/29)
[3] ハードウェアオフロードによる処理の高速化
http://journal.mycom.co.jp/articles/2008/10/29/bsdcon5/002.html
ただしサポートしているのは一部のサーバ向けハイエンドNICだけだったはず(?)だし、
ましてや>>197は「組み込み向けネットワークドライバ」と明記しているから、
>>200の言う「いまどき」が何を(or いつの時代)を指しているのかよくワカランwww
0214デフォルトの名無しさん
2009/08/02(日) 16:54:48shutdown(soc, SHUT_RDWR);
close(soc);
0215デフォルトの名無しさん
2009/08/02(日) 17:37:52何年前から来たんだよ。FEの時代は高級品だけだったけど、GbEならオンボだつて蟹だってついてる。>TOE
Windowsのハードウェアのプロパティにチェックサムオフロードの設定あるだろ。
オフロードが効いてるとWiresharkでチェックサムエラーになるから判る。
Linuxは、ドライバ設計が古くてTOE使えない時期が長かったけど、流石に今は対応してたはず。
0216デフォルトの名無しさん
2009/08/02(日) 17:44:54通信シーケンスに自信がないなら入れておくという程度。
sdの状態的にSHUT_RDWRを指定した時FINハンドシェークが起こるが、
closeをいきなり呼んでも暗黙的にこの処理は行なわれる。
半二重通信でもしない限り明示的なshutdownは必要ない。
ただし、能動通信側が送りっぱなしで突然閉じるようなことをすると、
shutdown無しの場合受動通信側のパケットを無駄に待ってしまったりと
sdが完全に無効になるまで時間が掛かる場合がある。
0217デフォルトの名無しさん
2009/08/02(日) 18:03:18shutdown(SHUT_WR)
recv() でゼロかエラーが帰ってくるまで待つ。
(どちらも帰って来ない場合もあるのでタイムアウト処理を入れる)
close()
こんな面倒くさい(お行儀の良い)処理をしなくて一方的に切断しても特に
問題ないって事ですか?
0218デフォルトの名無しさん
2009/08/02(日) 18:26:47>Linuxは、ドライバ設計が古くてTOE使えない時期が長かったけど、流石に今は対応してたはず。
いやデスクトップはいいんだけど、>>197の言う「組み込み向けLinuxボード」でも対応してますか?
>>206の質問にある、(チェックサムオフロードをサポートした)ハード(ボード)にも答えて下さいませ。
あなたは>>200のレスで、>>197に対して「いまどき」と発言しているんですが........。
一般的な事実(独り言)としては正しいのかもしれないけど、質問に対する返答になってない気がします。
0219デフォルトの名無しさん
2009/08/02(日) 18:52:09TOEってちゃんと動くか? 動かない条件のほうが多いと思うよ。
0220デフォルトの名無しさん
2009/08/02(日) 19:29:20>TOEってちゃんと動くか? 動かない条件のほうが多いと思うよ。
いや、>>215の住む世界だと、Linux/WindowsともGbEでさえあれば、
TOEが動くのが今時は当然な事らしい....。
0221デフォルトの名無しさん
2009/08/02(日) 20:00:40話をややこしくして済まないんだが、「クロス開発」で
あって別に Linux 向けの組み込みじゃなかったのよ。
ターゲットは OS から俺一人で書いた奴(RISC CPU で
メモリがバンク切り替えな環境)。
でもって開発環境だった Linux をネットワークドライ
バテストの対向ルーチンにしようとしてて、たとえば
UDP パケットを Linux 側で作ってループバックデバイ
ス通して RAW ソケットで読んで自前のドライバのテス
トケースに突っ込んで…ってなことをやってたわけ。
別にハードウェアで計算するならするでいいけどさ、そ
れなら仮想的なループバックデバイスを使う場合はそこ
で計算すべきじゃないかと思うんだ(計算しない理由は
パフォーマンスを稼ぎたいというのが正解で、コンパイ
ルオプションで計算が有効になるようになってたところ
までは調べた)。
因みにちょっと前にあった「NAT 通した時にチェックサ
ムおかしいんだけど…」なんていうバグはこの辺に起因
してる気がする。くわばらくわばら(w
0222デフォルトの名無しさん
2009/08/02(日) 20:20:07だからぁ、「一般的には問題ない。でも、ある特別なケースでは
問題となるかもしれない」と>>216はレスしている。
その可能性のあるケース(の一部)も>>216でレスされている。
それが>>217に当てはまるかどうかは、>>217が想定してる状況を
明記してくれないと、エスパーでもない限り誰にも返答できないよ。
横レス失礼
0223デフォルトの名無しさん
2009/08/02(日) 20:59:17>>216 は、
shutdown(SHUT_RDWR)
close()
と
close() #暗黙的にshutdown処理されるので
は同じだと言っている。
であればshutdown()は意味のないことに成る。
だったら、>>217 の処理はしなくて close() でいきなり
ソケットを閉じても問題ないってこと?
TIME_WAITで処理されるのでどんな切り方をしょようと
結局は皆同じってことでよいのかな??
0224デフォルトの名無しさん
2009/08/02(日) 21:23:380225デフォルトの名無しさん
2009/08/02(日) 21:33:51IPBANされるぞw
0226デフォルトの名無しさん
2009/08/02(日) 21:42:11(゚◇゚)ゞラジャ -
でも、shutdownしたら鯖の電源が落ちました〜
0227デフォルトの名無しさん
2009/08/02(日) 21:53:59実際はプロトコルによって変わるとしか言えない。
APIの呼び出し手順みたいな単純な話には置き換えられない。
0228デフォルトの名無しさん
2009/08/02(日) 22:01:16ハードウェアに用意してある場合が多い。
もっともエラータで使えなかったりするが。>microchipのやつ
0229222
2009/08/02(日) 22:17:58だから、「一般的」には
>だったら、>>217 の処理はしなくて close() でいきなり
>ソケットを閉じても問題ないってこと?
で問題ないと(>>216の先頭に)書いてあります。
>TIME_WAITで処理されるのでどんな切り方をしょようと
>結局は皆同じってことでよいのかな??
これも、「一般的」には同じと考えてかまいません。
でもね、数百、数千台のクライアントの相手をしなければならない
サーバ環境を想定してみてください。大量に残ってしまった
(カーネル空間内の)TIME_WAIT待ち状態が、システム性能に
深刻な悪影響を与えかねないという事は分かってもらえますか?
もしもそのようなシビアな状況を想定しているのであれば、
(>>216にある「送りっぱなしで突然閉じる」ようなことをせずに)
きちんと手順をふんでTCPコネクションを解法するよう実装すべきです。
でも、>>217,223の想定している状況がどれほどシビアなのかは
本人にしか知り得ないから、誰にも返答できないと>>222でレスしました。
0230デフォルトの名無しさん
2009/08/02(日) 22:33:24>サーバ環境を想定してみてください。大量に残ってしまった
>(カーネル空間内の)TIME_WAIT待ち状態が、システム性能に
>深刻な悪影響を与えかねないという事は分かってもらえますか?
どんな切り方をしようが先にshutdown()した方にTIME_WAIT状態の
セッションが2MSLは残るんじゃないの?
0231222
2009/08/02(日) 22:51:27失礼、>>229内にあるTIME_WAITは誤りで、FIN_WAITに訂正します。
(>>216にも、きちんと「FINハンドシェークが...」と書いてありました)
0232デフォルトの名無しさん
2009/08/02(日) 23:16:01FIN_WAITって鯖側のソケットをclose()しても残ったままになるの?
0234デフォルトの名無しさん
2009/08/02(日) 23:35:32世の中には一方通行通信で良い場合もあるし、一方通行
で構わないタイミング(たとえば、片方は言いたいこと
を全部言い終わったとか)もある。shutdown() で片方
閉じるってのは元々そういう用途だよ。
0235デフォルトの名無しさん
2009/08/02(日) 23:39:05RFC見ましたがソケット関数とtcp状態遷移の関係がわからない。。
首吊って人生やりなおしてきます。orz
0236デフォルトの名無しさん
2009/08/03(月) 00:15:250237デフォルトの名無しさん
2009/08/03(月) 00:25:55よく見掛ける状態遷移図は参考程度にしといた方がいいっ
てスティーブンスも言ってたんだけど。
http://pfsense.org/~cmb/diagrams/tcpStateDiagram1.gif
たとえば↑で斜体になってるのがアプリが呼び出すメソッ
ドと思えばいい。んでもって矢印が状態遷移だけど、
A/B というのは「A が発生したら B を実施して遷移す
る」の意味。「Close/FIN」はアプリが close() したら
FIN を送出して状態遷移。
そして TCP/IP は双方が established 状態になったら
サーバ/クライアントなんていう区別は無くなるんだよ
(そもそも、双方同時に Active open してもコネクショ
ンが張れるように設計されてる)。
ESTABLISHED から下に遷移している左側がアプリによる
close() の遷移で、右側がその応答である FIN を受け
取ったときの遷移。
双方同時に close() したらどうなるかとか考えてみる
といいよ。
0238デフォルトの名無しさん
2009/08/03(月) 00:30:39CLOSE_WAIT ってのは「FIN は来たからアプリの
close() 待ちだな」っていう状態で、この時まだ送信で
きる状態。
FIN_WAIT ってのは「アプリは close() したから FIN
待ちだな」っていう状態で、この時まだ受信出来る状態。
0239222
2009/08/03(月) 00:43:00文書 "RFC 739" 内の図 "Figure 6. TCP Connection State Diagram" は
参照されていると思います。(もし見ていなければ開いてください)
この図の中央に状態 [ESTAB(コネクション確立中)] があります。
この状態でソケットから事象 "CLOSE" を受け付けると、
(TCPスタックは)IPスタック(=クライアント)へ事象 "snd FIN(FINパケットの送信)" を要求し、
(図の左下側にある)状態 [FIN WAIT-1(コネクション解放待ち(1)] へ遷移します。
ここでソケットからの事象 "CLOSE" は、実際にはshutdownかもしれませんし、
(>>216で「closeをいきなり呼んでも暗黙的にこの処理は行なわれる」とあるように)
いきなりのcloseかもしれないし、あるいは(プロセスのexitに伴う)カーネル内部の
close操作かもしれません。そこは実装に依存するのでRFCでは抽象的に記述されています。
で、状態 [FIN WAIT-1(コネクション解放待ち(1)] においては、IPスタック(=クライアント)から
事象 "rcv ACK of FIN(FINに対するACKパケットを受信)"、
あるいは事象 "rcv FIN(FINパケット受信)" を受け付けない限り、
(永遠に)次の状態へは進めない(遷移できない)ことが確認できるのではないかと思います。
これが「(質問>>232にある)鯖側のソケットをclose()しても残ったまま」になる状況(の一例)です。
眠いんで、今晩はこれで落ちます。
0240デフォルトの名無しさん
2009/08/03(月) 00:43:16アリガトン
でも、その図の何処にもshutdown()が出ていない (´;ω;`)
あの世へ逝ってスティーブンス先生に教えてもらいます。 orz
0241デフォルトの名無しさん
2009/08/03(月) 00:51:21>(永遠に)次の状態へは進めない(遷移できない)ことが確認できるのではないかと思います
タイムアウトは実装しているだろうから永遠にって事はないでしょ。
10分くらい放置プレイされるらしいけど。
0242デフォルトの名無しさん
2009/08/03(月) 01:02:45その図でもshutdownの各パラメータとの対応とrecv()がゼロを返す
タイミングとかはわからんな。ある程度は想像付くけどね。
でも、そんな遷移図わからなくてもTCP/IPプログラムの作れて
しまうソッケットって素敵。
0243デフォルトの名無しさん
2009/08/03(月) 01:23:59ちの二つのデータの流れがあって、そのどちらも
「SYN, データ列、FIN」
の順序になってる。SYN の前や FIN の後にデータは存
在しない。
SHUT_WR は「もう書くことありません」だから、FIN の
送出だよ(で、FIN_WAIT)。
SHUT_RD は「もう読みたくありません」だけど、あっち
には関係無い話でせいぜいこっち側が受信バッファを解
放する位の事しか出来ない(もちろん、アプリ側にもデー
タは来なくなる)。
TCP だとこんな感じだけど、別プロトコルだとまた違っ
た動作が割り振られてる場合もあるよ。
0244デフォルトの名無しさん
2009/08/03(月) 01:35:26> タイムアウトは実装しているだろうから永遠にって事はないでしょ。
> 10分くらい放置プレイされるらしいけど。
現実的な問題からそういう実装はあるかもしれないけど、
TCP/IP の規格にそんな話は出てこないよ。
TCP/IP はあくまで信頼性のあるコネクションを提供す
るのが目的だから、たとえば ESTABLISHED 状態でたま
たま双方が最後に送出したデータの ACK を受け取った
まま三日間無通信だったとしても「突然切っていい」な
んて話はないよ(突然切った瞬間にあっちが何か喋るか
もしれない)。
0245デフォルトの名無しさん
2009/08/03(月) 01:57:550246デフォルトの名無しさん
2009/08/03(月) 07:05:39>>208
0247デフォルトの名無しさん
2009/08/03(月) 07:07:17ESTABLISHED で勝手にタイムアウト切断するのは鬼畜だけど
FIN_WAITでのタイムアウトは良いんじゃね?
どうせ一時的な状態だし。
0248デフォルトの名無しさん
2009/08/03(月) 08:16:04まず、SHUT_WR の状態では切断出来ないよね。向うから
のデータはまだ到着する可能性があるし、アプリだって
read() するかもしれない。
次に SHUT_RDWR の場合だけど、これも切断できない。
たとえば FIN_WAIT の変わりに TIME_WAIT 状態に入っ
たとすると、向うからのデータは破棄されるから向うは
ずっと再送処理を行う事になる。
FIN_WAIT の変わりに CLOSED 状態に入ったとすると、
向うからのデータに対して RST が送出されるからコネ
クションが切断されてしまう(正常系と動きが異なって
しまう)。それに本来入るべき TIME_WAIT に入らない
というのは、TIME_WAIT によって慎重に取り除かれてい
た「シーケンス番号重複問題」が顔を出すことにもなる
よ。
ひょっとしたらもう少し新しい RFC では話が違うのか
もしれないけど、俺が実装した頃の話の理解ではこんな
感じ。
0249デフォルトの名無しさん
2009/08/03(月) 08:38:50送ったんだから、その FIN に対する ACK が来るまで
FIN を再送するんだよ。でないと向うに「全部受け取っ
たよ」っていう通知が届いた事が確認出来ないから。
そして(またもや FIN が到着せずに)FIN_WAIT_2 に入っ
たって事は向うがこっちからの ACK を待ってる可能性
があるから、やっぱり向うからの最終データに対する
ACK を再送することになるよね。
0250デフォルトの名無しさん
2009/08/03(月) 08:56:14> でないと向うに「全部受け取ったよ」っていう通知が
> 届いた事が確認出来ない
あー、これ逆だ。「全部送り終わったよ」の通知を向う
が受けた事の確認だね。
0251デフォルトの名無しさん
2009/08/03(月) 10:27:36まあhost_denyされても文句は言えないな。
0252デフォルトの名無しさん
2009/08/03(月) 10:31:54れば無問題。
0253デフォルトの名無しさん
2009/08/03(月) 10:33:36送信端 close() 状態だね。
0254デフォルトの名無しさん
2009/08/03(月) 17:14:31シーケンス番号で区別?
0255デフォルトの名無しさん
2009/08/03(月) 18:24:04むう・・
0256デフォルトの名無しさん
2009/08/03(月) 19:12:48接続ごとにずらすから、しても問題ないのかな
0257デフォルトの名無しさん
2009/08/03(月) 19:14:58頭いいな
0258デフォルトの名無しさん
2009/08/03(月) 22:43:36SHUT_WRしたらrecv()でのゼロを待つんじゃないのか?
そのrecv()のデータは闇に葬られるが。
0259デフォルトの名無しさん
2009/08/03(月) 23:01:59IAC+2バイトと0(nop)は応答する気がなかったら
無視しちゃっても問題ないですよね?
一応teratermから使えてるみたいなのでいいや。
RFCのtelnetオプション追うの疲れた。
0260デフォルトの名無しさん
2009/08/03(月) 23:14:36>>255
巷ではよくセッションの区別は
「ローカルアドレス+ローカルポート+リモートアドレス+リモートポート」
だと言われてますが、スティーブンス本をよ〜く読むと
これに加えて「ローカル NIC」っていうのが付きます。
たとえば NIC が二枚挿さってるモバイル PC で、PPP
で割り当ててもらったローカルアドレスが(運悪く)両
方とも同じだった、といった状態が考えられるからです。
0261デフォルトの名無しさん
2009/08/03(月) 23:20:39手前側で SHUT_WR すると向こう側に FIN が送られます
が、向うからこちらへのデータ送信に影響は無いですよ。
TCP より上のレイヤで「FIN が来たらコネクションクロー
ズ」という約束ごとでも無い限りは。
0262デフォルトの名無しさん
2009/08/04(火) 08:05:170263デフォルトの名無しさん
2009/08/04(火) 17:16:31これ要らない子じゃね?
0264デフォルトの名無しさん
2009/08/04(火) 21:26:390265デフォルトの名無しさん
2009/08/05(水) 21:36:260266デフォルトの名無しさん
2009/08/06(木) 12:14:240267デフォルトの名無しさん
2009/08/06(木) 12:31:17ttp://www.iana.org/assignments/ipv4-address-space/
0268デフォルトの名無しさん
2009/08/06(木) 12:39:000269デフォルトの名無しさん
2009/08/06(木) 12:59:500270デフォルトの名無しさん
2009/08/06(木) 15:02:36発生条件が想像できないんだけど
0271デフォルトの名無しさん
2009/08/06(木) 15:54:31実装にもよるんだろうけど, 書き込み方向が shutdown された
socket に書けば SIGPIPE になるよ.
0272デフォルトの名無しさん
2009/08/06(木) 19:14:01UDPでそれって難しくね?
実装読んだわけじゃないから想像だけど。
0273デフォルトの名無しさん
2009/08/06(木) 19:45:43Unix 系の実装だと SIGPIPE はソケットが扱ってるプロトコルの処理に
ディスパッチする前に判定されるので, shutdown すれば起きるよ
shutdown(s, SHUT_WR);
sendto(s, ....);
まぁ, ふつうやらんわな………
0274デフォルトの名無しさん
2009/08/06(木) 20:38:46あ、なーる
0275デフォルトの名無しさん
2009/08/09(日) 16:04:050276デフォルトの名無しさん
2009/08/09(日) 19:14:27Linuxでソケットを使って簡単なプログラムを書いて
ファイル(6KB)転送をしてみたんですが、
サーバーとクライアントのローカルネットワーク内で直接やり取りすると、
途切れることなく到着するのですが、
インターネット経由だと、30%程度の確率で4242バイトで区切られてしまいます。
これって、何が原因なんでしょうか?どうか教えてください。
0277デフォルトの名無しさん
2009/08/09(日) 19:34:39たぶんインターネット経路の途中にあるルータで
IPパケットが分割されたのが原因だと思います。
もしそうであれば、いたって普通の現象です。
対策については、まずは、このスレの>>72の質問から始まった
一連のレスをじっくり読んでみてください。
0278デフォルトの名無しさん
2009/08/09(日) 20:22:110279276
2009/08/09(日) 23:46:12やっぱり途中のルーターなんですね・・・。
しかもレスを読むと、
全パターンの区切り方を想定してバッファやスタックを作るのが対策・・・。
最低どこまでのサイズで区切られるか、試さないといけませんね・・・。
多分1400バイトが安全圏かなぁ・・・。
まぁ、4242バイトに近いパケットを調べたところ、一個だけ該当するものがありまして
どうやら、FDDIのパケット(4500バイト前後)の大きさで区切られているようです。
0280デフォルトの名無しさん
2009/08/09(日) 23:59:58メッセージサイズ決まってる(固定長)のなら、そのサイズ読み込めばいいし、
決まってないのならメッセージヘッダの中に自分のサイズを含めればいい。
0281デフォルトの名無しさん
2009/08/10(月) 00:28:16どうして他の人の言うこと聞かないんだろ。
まともなコードなら、1byte以上全ての可能性に対処すべきなのに。
0282デフォルトの名無しさん
2009/08/10(月) 00:57:42>多分1400バイトが安全圏かなぁ・・・。
>>278がレスしているように、TCPではメッセージ境界は保証されません。
いわゆるUNIXのパイプと同じ概念で、データの最小単位は1byteでしかないんです。
(だからTCPは「バイトストリーム指向」であると呼ばれることがあります。反意語は「レコード指向」)
言い換えると、理論的には最悪の場合1byte単位でソケットにデータが届くことがあり、
そのケースも想定して実装する必要があります。1400byteなんて安全圏はどこにも存在しません。
もし通信プロセスの実装が同期I/O方式であるなら、>>115の方法を使うのが最も楽です。
そうでないなら(非同期I/O方式であるなら)、推測されたように複雑なFIFO制御が求められます。
そんな設計が苦痛に感じられ、なおかつ(>>279が)アプリケーション層のプロトコル定義を
決定できる立場にあるのだとしたら、専用の通信ライブラリの利用を提案します。
(そのような通信ライブラリのことを「ミドルウェア」と呼ぶことがあります。)
(長いので続く)
0283282
2009/08/10(月) 01:10:06たとえば、Linux上でC/C++を使われるのなら、ONC/RPC(旧名でSunRPCとも呼ばれる)をお勧めします。
いわゆるRPC(Remote Procedure Call)と呼ばれるミドルウェアであり、OSI参照モデルであれば
セッション層からプレゼンテーション層までの範囲に相当するサービスを提供しています。
最も単純な実装の場合、XDR(External Data Representation)と呼ばれる言語でユーザ関数を定義した後、
クライアント側アプリケーションではサーバIPアドレスの指定とユーザ定義関数のコールを実装するだけ、
サーバ側アプリケーションではコールされる(C言語の)ユーザ関数定義を実装するだけで、
あとはONC/RPCシステムにおまかせすることができます。(ONC/RPCシステムのセットアップは必要です)
メッセージ境界処理はもちろんのこと、UNIXソケット実装の差異(Linux/xxxBSD/Solaris/MacOSX等)や
CPUアーキテクチャの差異(Intel/PowerPC/ARM/SPARC等)までも吸収してくれます。
また、非同期コールにも当然対応しています。([例] サーバ:selectで実装、クライアント;GTKで実装)
ただし、ONC/RPCの発想に慣れるまでは、最初の壁がきついかもしれません。
詳細については書籍「RPCプログラミング 株式会社アスキー」を参考にしてください。
また、英語ばかりですが、事前にmanでrpcgenコマンド(XDR言語-->C言語自動生成ツール)を
調べてみたり、RPCプロトコルの仕様書(RFC 1831)を読んでおくのもいいかもしれません。
大半のUNIXでは、C言語開発メタパッケージがインストールさえしてあれば、ONC/RPCは即利用可能です。
ONC/RPCは以前に何度か利用しているので、何か質問あればどーぞ。
0284デフォルトの名無しさん
2009/08/10(月) 01:15:36俺が技術責任者なら却下する。
0285282
2009/08/10(月) 01:58:58ONC/RPCなんてUNIXで標準に付属してる「単なる道具」にすぎないよ。何を怖がってるの?
ただで使えるものは使ったほうがイイと思う。モッタイナイ!!
最初の壁を突破できれば、後は楽々で生産性は向上するわバグも減るわ移植性も確保できる。
本人にとっても習得した技術は他のプロジェクトへ移っても活用できるし。(UNIX限定だけどね)
あとONC/RPCをOMG/CORBAやMicrosoft DCOMみたいな分散オブジェクト技術と
ごちゃまぜにして理解していないかい?
それらと比較すると、ONC/RPCなんて非常にシンプルなシステムだよ。
Web Serviceであれば、SOAPとXML-RPCの差であると言い切ってもいいと思う。(分かるかな?)
まあ、(メッセージの送受信じゃなくて)単なるファイル転送くらいならRPCは大げさかも。
ただし、それを判断するのは>>279のプロジェクトの内容しだいだよ。却下は即断すぎる。
0286デフォルトの名無しさん
2009/08/10(月) 02:17:14いや、それを言うなら単にソケット開いて、メッセージ送受信するだけですむのに。
(さらに、ほぼそのままWindowsに持っていっても動くし、他の言語からも使用しやすい)
Web-Serviceで言えばRest風サービスですむのに(なんなら、PHPで動的テキスト返す
くらいのものでもいい)、何でSOAPとかXML-RPCとか持ち出すの?っていうこと。
0287デフォルトの名無しさん
2009/08/10(月) 02:23:50ftp使えば?
生産性とか移植性とかそんなもんすら関係ないし
0288デフォルトの名無しさん
2009/08/10(月) 02:26:040289282
2009/08/10(月) 03:18:52>いや、それを言うなら単にソケット開いて、メッセージ送受信するだけですむのに。
それが通用するのは同期式I/Oの場合だけで、そのケースについては
>>282で「>>115の方法を使うのが最も楽」と書いてあるよ。よく読んでね。
>(さらに、ほぼそのままWindowsに持っていっても動くし、他の言語からも使用しやすい)
まさかCygwinとかPOSIXサービスが前提とか言い出すんじゃないだろうね?
WinSockが名前はソケットでもUNIXソケットとはまるで実装が違うのは知っているはずだし。
何を指して「ほぼそのままWindowsに持っていっても動く」と言っているの?教えてくださいませ。
>Web-Serviceで言えばRest風サービスですむのに(なんなら、PHPで動的テキスト返す
>くらいのものでもいい)、何でSOAPとかXML-RPCとか持ち出すの?っていうこと。
RESTとXML-RPCはXML前提か否かが違うくらいで、複雑さは同レベルだよ。
しかも、もしXMLの技術を持っていて、なおかつメッセージ定義が複雑になっていった場合、
(サービスとREST APIの対応付けを実現しなければいけないという強い制約があるRESTよりも)
メッセージ型が柔軟に(XMLで定義できる)XML-RPCのほうが設計は容易であるというのが常識だし。
SOAPはXML+HTTPベースの分散オブジェクト技術だから言わずもがな。
結論として複雑さの比較は、XML-RPC = REST << SOAP になる。反論あるかい?
信じられないレスなんだけど、本当にREST/XML-RPC/SOAPを使ったことがあるの?
0290282
2009/08/10(月) 03:25:13>ファイル転送したいだけでしょ?
だからファイル転送のレベルかどうかは>>279しだいだと(>>285で)書いたんだが。
レス読んでいるかい?>>279からレスが来ないかぎり、誰にも判断できないはずだよ。
>ftp使えば?
C言語に(バグの枯れた)デファクトなFTPライブラリってあったっけ?自分は知らない。あれば教えて。
あるいは自分でFTPプロトコルをC言語で実装するということ?本末転倒じゃないか。
それともC言語からftpコマンドを起動するっていうことかな?OK、それなら納得する。
でもそれはネットワークプログラミングから外れる(スレ違いな)提案じゃないのかな?
0291282
2009/08/10(月) 03:40:31>C言語に(バグの枯れた)デファクトなFTPライブラリってあったっけ?自分は知らない。あれば教えて。
>あるいは自分でFTPプロトコルをC言語で実装するということ?本末転倒じゃないか。
>それともC言語からftpコマンドを起動するっていうことかな?OK、それなら納得する。
>でもそれはネットワークプログラミングから外れる(スレ違いな)提案じゃないのかな?
Debianくらいのディストリになれば、C言語で書かれたFTPライブラリパッケージはあっても
おかしくない気がする。あと、GNOME前提でよければ、確かGNOME APIの中に
FTP/HTTP(WebDAV)を扱うライブラリ関数はあったはず。だから、この段落は取り消します。
0292デフォルトの名無しさん
2009/08/10(月) 05:49:15>
> それが通用するのは同期式I/Oの場合だけで
非同期でも問題ないけど。
0293デフォルトの名無しさん
2009/08/10(月) 05:53:09linuxでONC/RPCを使う方法教えてくれ。
サンプルコード的なの。
0294デフォルトの名無しさん
2009/08/10(月) 08:50:11インターフェース書くも実運用もの面倒くさい。 >>280でFAだろ。
0295276=279
2009/08/10(月) 11:59:53UNIX・LinuxでC言語チャットサーバーを作ることを想定してます。
ログメッセージ以外のデータの長さは固定長で決まっているので、
ほぼ固定長のデータをやり取りする事になりますね。
ちなみに、クライアントはFlash(AS3.0)です。
Flashの扱いは慣れているのでこちらについては大丈夫です。
今、ONC/RPCについて調べてみてます。
0296デフォルトの名無しさん
2009/08/10(月) 21:47:340297デフォルトの名無しさん
2009/08/11(火) 03:18:130298デフォルトの名無しさん
2009/08/11(火) 04:17:590299デフォルトの名無しさん
2009/08/11(火) 05:38:29一度にやってくるパケット量を制限したいので。
何かのRFCに載ってませんか?
0300デフォルトの名無しさん
2009/08/11(火) 09:22:12mss だけ小さくしても意味ないと思うぞ
受信バッファサイズとか, その他のパラメータも関わってるんだから…
0301デフォルトの名無しさん
2009/08/11(火) 18:54:03これ付け忘れて困るシチュエーションが思いつかない
0302デフォルトの名無しさん
2009/08/11(火) 19:06:21v6使ってないんだったら意味ねぇと思う
つか, document 読め
0303282
2009/08/11(火) 22:24:58>ちなみに、クライアントはFlash(AS3.0)です。
クライアントはFlashですか....。でしたらONC/RPCの提案は取り下げます。
C言語とActionScriptとの(SwingやJNIのような)バインディング方法や
完成したライブラリをプラグインとして配布する方法を考えないといけないですから。
>>293
>linuxでONC/RPCを使う方法教えてくれ。
オンラインであれば筑波大の講義資料(?)の中に簡潔な解説がありました。
http://www.coins.tsukuba.ac.jp/~yas/coins/dsys-1998/1999-01-19/index.html
あと以下の書籍にも第16章で(ONC/RPCの旧名である)SunRPCが解説されています。
この書籍は(>>3でVol.1が紹介されているように)所蔵されている図書館/書店が多いでしょう。
UNIXネットワークプログラミング〈Vol.2〉IPC:プロセス間通信
http://www.amazon.co.jp/exec/obidos/ASIN/4894712571
>>297
>ONC/RPCなんて今時使ってるのか?w
正直な話、使っている人はほとんどいないでしょう。ただ、(>>285で書いたように)
用途や環境がハマれば、今でも有効な「道具」ですから、このスレで紹介してみました。
最後に、GoogleによるONC/RPCの「車輪の再発明」であるProtocol Bufferを紹介します。
http://journal.mycom.co.jp/articles/2008/07/18/protocolbuffer/menu.html
ONC/RPCと比較すると、C++/Java/Pythonバインディングがある点を除けば、特徴は同一です。
新しいモノ好きな方にはお勧めかもしれません。
0304デフォルトの名無しさん
2009/08/11(火) 22:32:220305デフォルトの名無しさん
2009/08/11(火) 22:51:560306デフォルトの名無しさん
2009/08/11(火) 22:58:470307デフォルトの名無しさん
2009/08/11(火) 23:15:39100回くらい読んだよ。読んでもわからん。
実験もしたけど、あってもなくてもIPv6のIPアドレスがあればIPv6の方引けるし
なければIPv4のが引けるし。
とりあえず保険でつけとけ って感じでいいのか?
0308デフォルトの名無しさん
2009/08/11(火) 23:17:53よくわからんのだけど、実装がコンパクトでオーバーヘッドがほとんどないなら
RPC使ってみたい
0309282
2009/08/12(水) 00:54:25>>276の質問に対する結論も(>>303)で出たので、ONC/RPCに関する話題は
これで終わりにします。長々としたスレ汚し、失礼しました>>all
0310デフォルトの名無しさん
2009/08/12(水) 02:02:330311デフォルトの名無しさん
2009/08/12(水) 13:52:01あとは同じIPアドレスとポートの組のパケットを一定期間受け流すだけだから、
実際の実装ではTCBから切り離してTIME-WAITリストみたいなもので管理すれば、
最大同時接続数に影響しないと考えていいでしょうか?
0312デフォルトの名無しさん
2009/08/12(水) 14:02:00それは管理されてるから対象
同時接続数は同時管理数と読みかえれ
0313デフォルトの名無しさん
2009/08/12(水) 14:08:31言い方を変えればTIME-WAIT用の限定的なTCBに切り替えるという感じです。
フル機能のTCB領域に限りがあるので、
TIME-WAITで使ってしまうと厳しいのです。
0314デフォルトの名無しさん
2009/08/12(水) 14:51:04MSL_timeout 1byte
相手IPaddr 4byte
相手Port 2byte
合計7バイト
MSL_timeout==0なら空きとみなす
相手MACはパケット受け取った時に入れ替える
SND.NXTも同様
RCV.NXTはFINがきたら+1して入れ替える
0315デフォルトの名無しさん
2009/08/12(水) 16:57:03>>260 で示したセッションを区別できないといけない。
あちら側のアドレスとポートが同一でも、こちら側のポー
トが違えばコネクションは生成される。
0316デフォルトの名無しさん
2009/08/12(水) 17:00:52RFC1122も読んでおくといいです。
http://www2s.biglobe.ne.jp/~hig/tcpip/HostReq_Comm02.html#HREQCOM_4_2_2_13
> コネクションが能動的にクローズされた場合、TCP は
> 2×MSL (最大セグメント生存時間) の時間だけ
> TIME-WAIT 状態に留まらなければならない (MUST)。
> しかし TCPは、以下の条件下で TIME-WAIT 状態から
> 直接コネクションを再オープンして、リモート TCP
> からの新しい SYN を受け入れてもよい (MAY)。
>
> 1. 前のコネクションの化身で使用された最も大きい
> シーケンス番号よりも大きい初期シーケンス番号を、
> 新しいコネクションに対して割り当てる。
>
> 2. もし SYN が古い重複であることが判明したら
> TIME-WAIT 状態に戻る。
0317デフォルトの名無しさん
2009/08/12(水) 17:15:58RFC1122もさらっとですが読みました
もしTIME-WAITでSYNがきたら放置する方向でやろうと思ってます
(アクティブオープンを、切断した同一ポートで開こうとする状況は
ほとんどありえない感じなので)
0318デフォルトの名無しさん
2009/08/12(水) 17:18:44あー、そうか
ローカルポートの情報も持ってないとだめですね
0319デフォルトの名無しさん
2009/08/12(水) 18:38:40> アクティブオープンを、切断した同一ポートで開こう
> とする状況は ほとんどありえない感じ
確かスティーブンス本(Unix Network Programming の
一番古い奴)に half association 指定のオープンの話
があったと思うんだけど、あれってパッシブだけだった?
0320デフォルトの名無しさん
2009/08/12(水) 19:00:53ウェブ連中はライトウェイトTCPとか呼びそうだがwww
0321デフォルトの名無しさん
2009/08/12(水) 19:07:120322デフォルトの名無しさん
2009/08/13(木) 13:15:21中身を見てみると内容が無いようのはてなですね
消したけど
0323デフォルトの名無しさん
2009/08/13(木) 13:40:10いつのまにかその掲示板に入り浸るようになってしまった・・・
0324デフォルトの名無しさん
2009/08/14(金) 09:28:330325デフォルトの名無しさん
2009/08/14(金) 10:13:44中身を見てみると内容が無いようのahoochiebukuroですね
消したけど
0326デフォルトの名無しさん
2009/08/14(金) 16:04:570327デフォルトの名無しさん
2009/08/14(金) 16:53:190328デフォルトの名無しさん
2009/08/15(土) 11:05:400329デフォルトの名無しさん
2009/08/15(土) 11:46:580330デフォルトの名無しさん
2009/08/15(土) 12:05:43上の方にもいたが、TCPでブロードキャストやマルチキャストが無理なんてのは
バカでもわかりそうな事だが。
0331デフォルトの名無しさん
2009/08/15(土) 12:47:530332デフォルトの名無しさん
2009/08/15(土) 13:05:29TCPの中の人がどんな仕事をしているかを知ってさえいれば、
IPv4/IPv6無関係に 駄 目 だというのは分かるようになるよ。
0333デフォルトの名無しさん
2009/08/15(土) 13:11:06http://www.geocities.jp/katayama_hirofumi_mz/win32/write2ch.htm
0334デフォルトの名無しさん
2009/08/15(土) 13:40:23また、UDPで複数同時に受信するにはどうすれば良いっですか?
0335デフォルトの名無しさん
2009/08/15(土) 13:49:30出来ます。
> また、UDPで複数同時に受信するにはどうすれば良いっですか?
普通に受信すれば良いです。
0336デフォルトの名無しさん
2009/08/15(土) 13:58:39IPv6ってアドレスが多いだけで今まで出来なかった
凄いことができるわけでは無いんだな。
NATあるしv6イラネ
0337デフォルトの名無しさん
2009/08/15(土) 14:05:21普通に受信とは用意したバッファに全ての接続先からのデータが無造作に収められるということですか?
0338デフォルトの名無しさん
2009/08/15(土) 14:43:18あるUDPパケットが到着した後、アプリケーションがrecvfromで
受信パケットを取り出さないうちに、次のUPDパケットが到着した場合、
いずれかのパケットが破棄されます。どちら(先着 or 後着)が破棄されるかは
UDP仕様として規定されていません。実装に依存します。
すべてのパケットを確実に受信したければ、TCPを使用しませう。
0339デフォルトの名無しさん
2009/08/15(土) 14:56:120340デフォルトの名無しさん
2009/08/15(土) 16:18:04でも送信側からみればどのポートが埋まっていないのかわからないと思うのですが、どういう風に知り得ることができますか?
0341デフォルトの名無しさん
2009/08/15(土) 16:22:530342デフォルトの名無しさん
2009/08/15(土) 16:27:01複数受信とは複数のクライアントの接続のことかな?
0343デフォルトの名無しさん
2009/08/15(土) 16:47:20多分それだと思います。
winsock2の情報が少なくてこのスレが一番の情報源だったりします。ネット接続は必要な機能なわりにちょっとしか使わないし本を買ったりして専門的にやるには持て余してしまう。
0344デフォルトの名無しさん
2009/08/15(土) 16:58:01>>1 のWinsock FAQくらいは目を通しておこう。
0345デフォルトの名無しさん
2009/08/15(土) 17:05:05winsock2の情報が少ない事を言い訳にするな。
0346デフォルトの名無しさん
2009/08/15(土) 17:14:04外注に出した方が安く付くと思うよ。
0347デフォルトの名無しさん
2009/08/15(土) 17:56:58いや、ぼられるので高くつく
0348デフォルトの名無しさん
2009/08/15(土) 17:58:260349デフォルトの名無しさん
2009/08/15(土) 18:25:46二アリーイコール君達を調教しているおいらは心が折れそうです
0350デフォルトの名無しさん
2009/08/15(土) 18:35:51> 送信側からみればどのポートが埋まっていないのかわからない
>>260 にあるセッションが区別できれば通信できるように
なってる。
現実世界のハブのポートみたいなのを想像してると勘違
いするかもね。何か良いアナロジーないだろうか。
0351デフォルトの名無しさん
2009/08/15(土) 19:38:46電話機がなって, 誰かがどれかの受話器を取り上げるのがacceptってな
イメージなんだが, UDPの場合はなぁ………
特定のチャンネルを使ってるトランシーバってイメージでもないしなぁ…
0352デフォルトの名無しさん
2009/08/15(土) 19:42:12銀行がIPアドレス、支店がNIC、開設口座番号がポート
0353デフォルトの名無しさん
2009/08/15(土) 19:48:04住所がアドレス, 部屋がポート, 差出人の住所その他がrecvfromで受け取るアドレス
0354デフォルトの名無しさん
2009/08/15(土) 19:48:550355デフォルトの名無しさん
2009/08/15(土) 20:12:250356デフォルトの名無しさん
2009/08/15(土) 20:26:12決してその美人とやれる分けでもなく。
下ネタでスマヌ
0357デフォルトの名無しさん
2009/08/16(日) 05:58:230358デフォルトの名無しさん
2009/08/16(日) 10:20:280359デフォルトの名無しさん
2009/08/16(日) 12:35:310360デフォルトの名無しさん
2009/08/16(日) 12:48:250361デフォルトの名無しさん
2009/08/17(月) 10:00:09UDPは有能な秘書が全部一人で手紙を受け取ります。
電話ではありません。
0362デフォルトの名無しさん
2009/08/17(月) 12:06:28つまり80番で客引きしてるアパッチのバックには怖い人が居たりするのねえ。
まあ
1024以下のポートで客引きするには権力者の許可が必要だけど。
0363デフォルトの名無しさん
2009/08/17(月) 13:01:01IfAdminStatus と IfOperStatus
ですが、両者の違いがいまいち
判りません。上記RFCにはこれらの
定義が書いてないようなんですが
両者の違いを教えてください。
0364デフォルトの名無しさん
2009/08/17(月) 13:35:060365デフォルトの名無しさん
2009/08/17(月) 14:09:37これはどういう意味でしょうか?
大抵のルータはポートマッピング機能とかがあるし、
超えるのに特に支障はないと思うのですが。
0366デフォルトの名無しさん
2009/08/17(月) 14:19:07ユーザはマニュアルなんか読まないんだから
UPnPなりUDPホールなんとかでアプリが自力で通すんなら構わないと思う
0368デフォルトの名無しさん
2009/08/17(月) 17:24:100369デフォルトの名無しさん
2009/08/17(月) 17:45:22ネットワークの初心者ってだけならどうぞ
0370デフォルトの名無しさん
2009/08/17(月) 23:26:230371デフォルトの名無しさん
2009/08/18(火) 00:16:25つまりルータではじかれる設定ということですよね?
だったらUDPに限らずTCPでも同じだと思うのですが。
0372デフォルトの名無しさん
2009/08/18(火) 00:27:07TCPは状態を持っているので、中から外に出た奴への戻りが明確にわかかる
UDPの場合、状態を持っていないので、中から外へ出た奴の戻りがどれに
対応するか判定できない
実質的には、タイマー管理するかUPnP的にルータ/スイッチをコントロール
するしかない
安全側に倒そう思ったら「UDP を通すな」ってなことになる
0373デフォルトの名無しさん
2009/08/18(火) 00:32:45言ってるんじゃないの?
あと、UDPだと間にNATが入ってるとちょっと面倒。
0374デフォルトの名無しさん
2009/08/18(火) 00:35:40>TCPは状態を持っているので
これはルータがTCPの状態を持っているという意味ですか?
リピータならありえない話ではないですが、解釈がおかしくないですか?
そうでないとしたら意味が判らないし。(UDPでも状態を持てばいい)
0375デフォルトの名無しさん
2009/08/18(火) 00:38:17もうちょっと勉強してからくるか素直に質問したら?
0376デフォルトの名無しさん
2009/08/18(火) 00:43:27そう言ってお茶を濁そうとするのは勉強が足りてないってことですよね?
素直に>365で質問してるつもりですが。何か問題でも?
0377デフォルトの名無しさん
2009/08/18(火) 00:44:52> UDPの場合、ブロードキャスト使うプロトコルも多いから
ちゃんと設定できるルータならディレクティッドブロードキャストは
通すように設定可能
>>373
> これはルータがTCPの状態を持っている
あ、言い方が悪かった
ルータ/レイヤ3スイッチのフィルター機能がTCPの状態を監視してる
> (UDPでも状態を持てばいい)
わざと状態を持たないように設計されているのが UDP
0378デフォルトの名無しさん
2009/08/18(火) 00:47:08つまりTCPの場合はコネクションを監視することで通すかどうか決めてるわけですね。
UDPだとポートしか情報がないから何が起きてるか判らない、監視しようがないと。
0379デフォルトの名無しさん
2009/08/18(火) 00:50:14そだよ。
> UDPだとポートしか情報がないから何が起きてるか判らない、監視しようがないと。
監視しようとすると、適当に短いタイマーでここまでは通すか否かを判定するか
こっちから、これを出したからこのポート外から通してねってフィルター機能に
御願いするしかないわけだ
0380デフォルトの名無しさん
2009/08/18(火) 00:52:59だいぶすっきりしました。
ありがとうございました。
0381デフォルトの名無しさん
2009/08/18(火) 01:01:11わざわざユーザに設定させるわけにはいかんっていう話じゃなかったっけ?
0382デフォルトの名無しさん
2009/08/18(火) 01:08:38いや、元々ブロードキャストの話じゃないし…
AHつかえればディレクティッドブロードキャスト通すこともあるだろ?
運用的には………
ってな、意味で >>373 へのレス書いたつもり
誤解を受けたんだったら誤る
0383デフォルトの名無しさん
2009/08/18(火) 01:12:410384デフォルトの名無しさん
2009/08/18(火) 01:18:49UDPもTCPも基本タイマーでセッション管理してるよ。TCPはステートがある分監視、制御に有用な情報が多いだけ。
TCPだって外からSYN(接続)が来ることに関しては、いわゆる「port空け」なきゃ通信できないし、
UDPもDNSの問合せみたいに内→外がトリガとなる1対1の通信ならば何の問題もなく使えるだろ。
問題となるのはUDPの1対多の通信で、これができるかどうかはルータのNATの実装に依存する。
Cone NAT、Restrict NAT、Symmetric NATでググれ。
0385デフォルトの名無しさん
2009/08/18(火) 01:28:300386デフォルトの名無しさん
2009/08/18(火) 02:18:36家庭で使う様なカスルータじゃTCP通すだけで十分で終わりって実装も多いだけ。
組み込みsoc程度じゃそんな程度。
0387デフォルトの名無しさん
2009/08/18(火) 03:21:31>UDPはルータ超えできない
という話がそもそも違う(言った奴か>>365が誤解してる)だけだろ。
UDPだろうとTCPだろうと、
(最初に)外からデータを送る分には、いわゆるポート空けをしないと出来ない。
けれど、最初に内から外に向かってリクエストを送り、(外のサーバーが)レスポンスを返す場合に
TCPならばルータがセッション管理しているから、問題なくレスポンスを(最初の)送信元に送れるけど
UDPでは、レスポンスがルータで止められて、クライアントに戻すことが出来ない。
という話が「UDPではルータ(NAT)を超えられない」という言い方にすり変えられてるんじゃないかね。
(多くのルータでは、時間管理等でUDP hole punchingが可能であるというのは置いといて)
0388デフォルトの名無しさん
2009/08/18(火) 03:52:41(確かにFWとかNATとかを兼ねてることも多いけど)
0389デフォルトの名無しさん
2009/08/18(火) 04:02:240390デフォルトの名無しさん
2009/08/18(火) 07:07:14家庭用のいわゆるブロードバンド・ルータを思い浮べる人と、
レイヤ3スイッチを思い浮べる人では話が合わなくて当然。
本来の意味のルータがUDPを通さなかったら、それは大問題です。
0391デフォルトの名無しさん
2009/08/18(火) 07:11:200392デフォルトの名無しさん
2009/08/18(火) 07:26:45そりは(UDPうんぬんじゃなくて)ブロードキャストを利用してるからだろ
0393デフォルトの名無しさん
2009/08/18(火) 08:08:02IPじゃないものをIPネットワークに流すわけにはいかんだろ
0394デフォルトの名無しさん
2009/08/18(火) 08:10:010395デフォルトの名無しさん
2009/08/18(火) 09:09:41いいわけだから、ルータで UDP のフォワード先をブロードキャストアドレスにして
おけば問題ないと聞いたことがある
0396デフォルトの名無しさん
2009/08/18(火) 09:32:31>UDPでは、レスポンスがルータで止められて、クライアントに戻すことが出来ない。
>という話が
そんな話は無い。TCPだろうが、UDPだろうが、ポート番号無視しない限りレスポンスが返らないなんてことはない。
ntpとかdnsとかどうすんだよ。
0397デフォルトの名無しさん
2009/08/18(火) 09:42:33ICMP
0398デフォルトの名無しさん
2009/08/18(火) 11:12:07IPと同じ層だけど違うネットワークじゃん?
0399デフォルトの名無しさん
2009/08/18(火) 11:16:330400デフォルトの名無しさん
2009/08/18(火) 11:20:19TCPヘッダについてなんですが
Optionがつくかどうかというのはどこを見ればいいでしょうか?
どこからがデータなのかの判断が付かず困っております。
0401デフォルトの名無しさん
2009/08/18(火) 11:31:47Data Offset を見ろ。
0402デフォルトの名無しさん
2009/08/18(火) 11:34:26おっと。こんなところに。さんくす!
0403デフォルトの名無しさん
2009/08/18(火) 11:36:42最近TCPスタックを実装したばかりの俺が答えてやると、
ずばりData Offsetだ。
Optionがなければ5(5*4オクテット = 20)だ。
SYNなら大抵MSSとかが付いてきて+4で6以上になる。
5未満だったらアウツ。
0404デフォルトの名無しさん
2009/08/18(火) 11:37:36がんばれ。
0405デフォルトの名無しさん
2009/08/18(火) 11:45:250406デフォルトの名無しさん
2009/08/18(火) 19:49:36すでに使われているポートに対してbindしても関数は成功してしまいます。
(その後の通信には失敗する)
すでに別のアプリケーションがポートを使っている場合にエラー表示させたいのですがどうすればいいのでしょうか?
SvrSock = socket(AF_INET, SOCK_STREAM, 0);
if (SvrSock == INVALID_SOCKET) return false;
addr.sin_family = AF_INET;
addr.sin_port = htons(FSvrPort);
addr.sin_addr.S_un.S_addr = INADDR_ANY;
setsockopt(SvrSock, SOL_SOCKET, SO_REUSEADDR, (const char *)&yes, sizeof(yes));
if (bind( SvrSock, (struct sockaddr *)&addr, sizeof(addr)) != 0) return false;
if (listen(SvrSock, 5) != 0) return false;
0407デフォルトの名無しさん
2009/08/18(火) 21:39:520408デフォルトの名無しさん
2009/08/18(火) 21:49:25うまくいきました!
ありがとうございました!
0409デフォルトの名無しさん
2009/08/18(火) 22:00:54LinuxでSO_REUSEADDRしたのと同じ結果になるって書いてあるブログがあるけど。
WinsockでSO_EXCLUSIVEADDRUSEを設定すると、
FIN_WAIT_2 や CLOSE_WAIT の間もEADDRINUSEになるらしい。
ttp://sakanaya.kir.jp/ymnet/diary/fsdiary.cgi?data=20070903
本当かどうかは知りません。
0410初心者
2009/08/18(火) 22:06:34どこが間違っていて文字を送れない(-1が戻ってくる)のか教えてください
0411初心者
2009/08/18(火) 22:07:190412デフォルトの名無しさん
2009/08/18(火) 22:26:520413デフォルトの名無しさん
2009/08/18(火) 22:40:29今もう一度F11連打でやってみたらちゃんと送られました。でもアプリケーションとして実行すると失敗します。
0414デフォルトの名無しさん
2009/08/18(火) 22:46:03n = recv(...);
if (n == -1) {
printf("error : %d\n", WSAGetLastError());
return 1;
}
0415デフォルトの名無しさん
2009/08/18(火) 22:52:46どうも送信側のconnect()とsend()の間に間をおくと成功するようです。
send()の前にSleep()で行けました。
0416デフォルトの名無しさん
2009/08/18(火) 23:00:17client側でclosesocket()していないのが原因。
send()した後、すぐにWSACleanup()しちゃうから、コネクションがリセットされてしまう。
closesocket()すれば、データが届くまで待つから大丈夫。
0417デフォルトの名無しさん
2009/08/18(火) 23:05:39ありがとうございます!それだったようです。
WSAGetLastError()というのがあるってことが勉強になりました。
0418デフォルトの名無しさん
2009/08/18(火) 23:23:36相手がとあるポートでudpもしくはtcpでrecvしていても、受信されるのでしょうか?
0419デフォルトの名無しさん
2009/08/18(火) 23:35:150420デフォルトの名無しさん
2009/08/19(水) 00:12:390421デフォルトの名無しさん
2009/08/21(金) 05:08:050422デフォルトの名無しさん
2009/08/21(金) 07:01:520423デフォルトの名無しさん
2009/08/21(金) 12:36:040424デフォルトの名無しさん
2009/08/21(金) 18:30:37余った時間でかまいません。お願いします
0425デフォルトの名無しさん
2009/08/21(金) 18:40:15適当な入門書でも読みながら、わからないところだけ訊きに来てください
0426デフォルトの名無しさん
2009/08/21(金) 18:51:210427デフォルトの名無しさん
2009/08/21(金) 18:54:49そんなお願いするならよぉ、
とりあえず何が必要なのか分かってるよな?
0428424
2009/08/21(金) 19:06:100429デフォルトの名無しさん
2009/08/21(金) 19:12:51とりあえず今日はこれで
http://www.dotup.org/uploda/www.dotup.org55444.lzh.html
>>428?
0430デフォルトの名無しさん
2009/08/21(金) 20:24:03winsockってUNIXでのノウハウは通用しますか?
0431デフォルトの名無しさん
2009/08/21(金) 21:04:080432デフォルトの名無しさん
2009/08/21(金) 21:43:08通用する。
関数とかライブラリの使い方なんてのはどうでもいいからな、実際。
TCP/IPのことをわかっていることが重要。
0433デフォルトの名無しさん
2009/08/21(金) 21:43:490434デフォルトの名無しさん
2009/08/21(金) 21:56:47*NIXで「効率的に」とかを考えると互換性が失われるのと同様かそれ以上に
細部での差はある。
0435430
2009/08/22(土) 00:33:18基本的な部分は通用するってことですね。
ありがとうございました。
0436デフォルトの名無しさん
2009/08/22(土) 16:14:19クライアント側なら、いくらか移植の手間はかかっても、
UNIXのノウハウは通用すると言えるけど、
サーバー側で、しかもマルチスレッディングが必要なレベルになってくると、
UNIXソケットの経験は、ほぼ通用しなくなるよ。
とりあえず動けばいい、なんちゃってサーバならいいけど。
0437デフォルトの名無しさん
2009/08/22(土) 16:34:030438デフォルトの名無しさん
2009/08/22(土) 21:59:32たかが知れてるやろ
0439デフォルトの名無しさん
2009/08/23(日) 00:41:23winsockがbsd由来とは逝ってもbsdとは違うのと同じ。
マク辺りもunix名乗ってるけど全然違うんじゃないかなあ。
0440デフォルトの名無しさん
2009/08/23(日) 04:00:53WinsockとUNIX(BSD)との間の差異は大きいだろ。
少なくともCygwinやService for UNIXみたいなPOSIXエミュレータを
利用しない限り、ほぼコード無修正で移植なんて不可能だし。
それに対して、さすがにソケット仕様におけるUNIX同士の差異は
BSDがベースになっているから、ほとんど無いに等しいと言える。
(差異があってもコンパイルスイッチ等で対応可能なレベル)
Macの場合は、純粋なUNIX(Darwin)としてソケットを使用するなら、
高いBSD互換性がある。実際、Apache/Samba/Netatalk等のサーバも
最小限の変更で動いている。大きく異なるのは、NeXT由来のObjective-Cで
書かれたライブラリを使用して、(主に)GUIアプリを開発するケース。
0441デフォルトの名無しさん
2009/08/23(日) 04:08:45InterfaceBuilder
0442デフォルトの名無しさん
2009/08/23(日) 06:12:33データの送受信に関してはほぼコード無修正でLinuxとWinで同じコード使ってるよ。
その他のタスク(ルーティング弄ったり、NICの情報読み書きしたり)はさすがに別コード
になってるけど。
0443440
2009/08/23(日) 20:03:38遅くなってしまったけど、レスありがトン。
正直な話、オイラの場合はNT4.0の時代でWinsockの情報は止まっているんだ。
今時のWinsock(2.0?)なら、ほぼ同じコードでまともな性能が実現できるのかな?
もちろんルーティングテーブルやらNIC情報の取得なんかは、UNIX間でも
互換性が乏しい部分だから、コネクション管理とデータ送受信に限定する。
そのNT4.0という大昔な話だけど、UNIX上で動くサーバ製品をNT4.0へ移植する
プロジェクトに参加してたことがあったんだ。当初は、別部署が開発した
UNIX/Win互換通信ライブラリみたいのを利用すれば、容易に移植できるみたいな
雰囲気で進んでいたんだけど、途中で性能問題にぶちあたってプロジェクト全体の
日程がひっくり返ったという苦い経験をした。
直接的な原因はマスタ・スレーブなマルチプロセス構成のUNIX実装をNTプロセスへ
直に(1対1で)割り当てたという、今から考えると大変おそまつな理由。
最終的に、マルチスレッディング構成への変更はもちろん、オーバーラップI/O使用とか、
サーバのロジック部分を除けば、通信コンポーネント部は全面的な新規開発になった。
今はそんな苦労をせずにUNIXからWindowsへ移植できるのかな?
0444440
2009/08/23(日) 20:07:07>実際、Apache/Samba/Netatalk等のサーバも
とあるけど、NetatalkはAFP(Apple File Protocol)のオプソ版実装だから、
MacOS X上で動いている事は絶対にありえない。削除するよ。
0445デフォルトの名無しさん
2009/08/23(日) 20:40:460446デフォルトの名無しさん
2009/08/24(月) 00:32:130447デフォルトの名無しさん
2009/08/24(月) 01:04:36エラー対策もほぼ異なる(羽目になる)んだが
UNIXで一括りしてる時点でたいしたことないな
0448デフォルトの名無しさん
2009/08/24(月) 04:42:47たまたまNT4に移植したunixの実装依存だろ。
マクは何でもアポーのライブラリ呼ばされそうだけどな。unixとして実装しても、マクとして使う分にはいろいろ問題有るでしょ。
0449デフォルトの名無しさん
2009/08/24(月) 05:09:050450デフォルトの名無しさん
2009/08/24(月) 09:53:36何か知っているなら語ってくれ
0451デフォルトの名無しさん
2009/08/24(月) 12:48:50知ったか乙
0452デフォルトの名無しさん
2009/08/24(月) 14:19:150453デフォルトの名無しさん
2009/08/24(月) 14:36:450454デフォルトの名無しさん
2009/08/24(月) 14:38:20新しくコンテストを来年開きたいと思っています
プログラマー(ゲーム・ツール・)の方は
http://pc12.2ch.net/test/read.cgi/tech/1221701297/l50
のスレに来てもらえるとうれしいです。
運営も募集しています。
↓のような感じでコンテストを開始する予定です。
http://219.113.110.143/
0455デフォルトの名無しさん
2009/08/24(月) 19:21:23HSPって・・・だいぶ古くないか?それに、これ、荒らし・・・・
0456440
2009/08/24(月) 21:51:18>>445
.NETはMicrosoft製の共通言語基盤で、momoはそのオプソ版だと理解してます。
そうであればJavaで書けばプラットフォーム非依存になる事と同じ理屈ですから、
申し訳ないけど、今のところはC言語(C++含む)でソケットプログラミングした場合における
プラットフォーム間(特にUNIX<->Windows)の移植性という主題に限定させてください。
>>446
それがですね、DeleGateというプロキシソフトがありまして、キャッシュサーバとして
利用した場合、Linuxならトラフィックが過大になっても「なんとか使える」レベルなんですが
(もちろんSquidより劣化度は悪いけど)、Windowsだと最新マシンでも「使い物にならない」ほど
性能が劣化するという事例(クレーム)を経験しています。詳しく調べていなかったのですが、
CPUやメモリの動作状況には十分な余裕はあり、どこかで引っかかっているという印象でした。
もともとDeleGateのコードは古い設計で、しかもWin移植版はオマケ程度というのが常識なので
しかたがないんですが、マシン性能だけで全ての問題が解決するわけではないこともご理解ください。
>>448
まず、UNIX間で性能チューニングに関してプログラミングで大きな差異は無いと理解しています。
また、主題からは外れますが、運用面でUNIX毎にバッファサイズやセマフォ数などの
チューニング手法、あるいはトラブルシューティング法が異なることは事実とはいえ、
どれか一つを理解していれば他のUNIXへ移っても経験は生かすことができます。
(オイラはSunOS/Solaris/HP-UX/Linuxを経験してます。)
でもそれがWindowsに移るともなれば、チューンもエラー対策も一から勉強し直しに
なるんじゃないかと思うのです。それは(運用面における)大きな差異ではないでしょうか?
(長いので続きます)
0457デフォルトの名無しさん
2009/08/24(月) 23:04:260458440
2009/08/24(月) 23:46:48>>448
>たまたまNT4に移植したunixの実装依存だろ。
たしかに今時は性能が重要視されるサーバソフトの開発ではマスタ・スレーブ方式な
マルチプロセス構成はしないでしょうね。UNIXでもマルチスレッドが当たり前な時代ですから。
ただ、NT4.0時代からWindowsを離れて浦島太郎状態なので、マルチスレッド構成で最近の
Windows 200x Serverであれば本当に通信制御に関してUNIXからの移植性に問題無しなのか、
今時の設計技術動向を知っている人がいれば教えてもらいたく、質問カキコしました。
あるいは書籍やWebを紹介してもらえるだけでも(英文可)、とても嬉しいです。
>マクは何でもアポーのライブラリ呼ばされそうだけどな。unixとして実装しても、マクとして使う分にはいろいろ問題有るでしょ。
MacOSXではapache/samba/proftpd/postfix/named/cups...etcが普通に(裏で)動いていますよ。
プロセスの起動/停止はMac固有(launchd)だし、設定ファイル編集のGUIはObjective-Cライブラリで
新規開発が必要ですけど、それはネットワークプログラミングの話題からは外れますよね。
MacOSXの底辺はDawinというBSD系UNIXですし、カーネルはMach(マイクロカーネル)ですが、
そのPOSIX互換サービスは歴史が古いだけあって、互換性(移植性と性能)の問題はほぼ皆無です。
そのあたり、出来の悪いWindowsのService for UNIXとの間には絶対的な壁があります。
あるいは「いろいろ有る」という問題点を具体的に指摘してくださいませ。
0459デフォルトの名無しさん
2009/08/24(月) 23:59:060460デフォルトの名無しさん
2009/08/25(火) 07:49:140461デフォルトの名無しさん
2009/08/25(火) 08:22:410462デフォルトの名無しさん
2009/08/25(火) 10:29:530463デフォルトの名無しさん
2009/08/25(火) 15:00:54AF_INET の AF って何の省略? アナルファック?
0464デフォルトの名無しさん
2009/08/25(火) 15:19:46ttp://www.google.co.jp/search?hl=ja&q=AF_INET
0465デフォルトの名無しさん
2009/08/25(火) 15:19:540467デフォルトの名無しさん
2009/08/25(火) 23:17:14なかなかうまくいかないので誰かご教授お願いします。
0468デフォルトの名無しさん
2009/08/25(火) 23:23:34簡単に作れると思うけど1台からじゃ効果ないな。
0469デフォルトの名無しさん
2009/08/25(火) 23:27:260470デフォルトの名無しさん
2009/08/26(水) 00:01:480472デフォルトの名無しさん
2009/08/26(水) 01:58:14http://tsushima.2ch.net/test/read.cgi/newsplus/1251155274/
0473デフォルトの名無しさん
2009/08/26(水) 19:45:280474デフォルトの名無しさん
2009/08/26(水) 21:31:030475デフォルトの名無しさん
2009/08/26(水) 22:50:48accept()しなけりゃ良いだけだけど何で1接続だけ受け入れたいの?
マルチスレッド嫌ならselect()使う方法とかあるけど。
0476デフォルトの名無しさん
2009/08/26(水) 23:19:34while{
send
recvform
受信したbufferの処理
}
この場合、recvformで受信したUDPデータをバッファにためます。
そして、バッファのデータをそのあとに処理します。
そのあとに、送信処理を行い、再びデータを受信する。
といった流れでいいのでしょうか?
たとえば、UDPのデータが二つ同時に来た場合、
先着のデータ受信中(recvform中)に、後着のデータが来た場合、
後着のデータは先着が受信中なのでrecv出来ずに破棄されるのでしょうか?
それとも上書き?されてしまうのでしょうか?
同時に来た時点で、受信サイズがたとえば同一のデータを送っていたとしても
めちゃくちゃになるのでしょうか?
0477デフォルトの名無しさん
2009/08/26(水) 23:36:060478デフォルトの名無しさん
2009/08/26(水) 23:39:340479デフォルトの名無しさん
2009/08/26(水) 23:42:02動画のようにリアルタイムで必要なデータなら古いデータが来たところで意味がない。
それに1コマがなくても前後のコマで保管したりできるから必要ない。
そういう場合にUDP。
0480476
2009/08/26(水) 23:58:10先着のデータは無事に受信できるとして?
というか、recvform1回でもそれぞれ別のUDPデータを2つ同時に受信できるのかー
常に受信ごとにrecvformで待ち受けしなければいけないものかとおもってた
0481デフォルトの名無しさん
2009/08/27(木) 00:02:190482476
2009/08/27(木) 00:25:02受信しなくても受信する??
0483デフォルトの名無しさん
2009/08/27(木) 00:40:52その後recvformの呼び出しでプログラムがOSから受け取る
0484デフォルトの名無しさん
2009/08/27(木) 00:50:29つまり、先着と後着のデータ分バッファがないとだめってことですか
バッファがない場合、後着はバッファに上書きされることなく、OS側ですら受信されないということでしょうか?
でも、recvform呼ばずにOS側が受信するってそういうものなのでしょうか?
socketなんて生成しなくてもイーサネットでデータ送られるとOSが受信はするということですよね
0485デフォルトの名無しさん
2009/08/27(木) 00:55:49ソケット作らなきゃUDPの中の人はバッファリングしてくれません。
イーサネットの中の人は常にデータ受信してると思うけど。
0486デフォルトの名無しさん
2009/08/27(木) 01:03:47OSが保存するバッファは違うということですよね
OSがない場合だと、そのOSから受け取るという概念はないわけですよね
つまり同時に着た場合は、どうなるんだろう
0487デフォルトの名無しさん
2009/08/27(木) 01:07:420488デフォルトの名無しさん
2009/08/27(木) 01:09:15同時に着くって言うのはないよ。
タイミングが近いってだけで、処理自体は常に1つしか行われないんだから
通信だって1つのデータを送受信中に別のデータを送受信はできない
0489デフォルトの名無しさん
2009/08/27(木) 01:13:22では、
while{
recvform
受信したバッファを別のバッファにうつす
}
という処理をしておけば、受信バッファに上書きされることはありえないということでしょうか?
たとえ、近いタイミングでこようが
0490デフォルトの名無しさん
2009/08/27(木) 01:18:15そうなる
0491デフォルトの名無しさん
2009/08/27(木) 01:28:23別のバッファをうつしている最中に、データが来たら先ほどどなたかおっしゃってたように
OSのバッファへと一時的にいれられるわけであってますか?
それをrecvformでとりだす。
ただし、socketせいせいしている場合に限る
結局はrecvform自体、OSのバッファから取り出しているってことなのでしょうか?
オプションでタイムアウト時間指定してやるのも、このOSのバッファの中が指定した時間空なら
受信エラーをかえすってイメージでしょうか
0492デフォルトの名無しさん
2009/08/27(木) 01:45:02そんな認識であっていると思うよ
Socketが必要なのは
たとえばデータが送られてきたとき、どのプログラムにそのデータを渡せばいいと思う?
Socket生成しbindさせることによって、特定ポートに送られてきたデータを特定のプログラムに渡すことができる。
もしそのポートにbindされたプログラムがなければOSはそのデータを破棄することになる。
0493デフォルトの名無しさん
2009/08/27(木) 02:51:12Linuxの使用を推奨する。
0494デフォルトの名無しさん
2009/08/27(木) 03:47:26環境は?
0495デフォルトの名無しさん
2009/08/27(木) 06:27:18http://www.ip-checker.net/
こういうサイトで調べて出てくるアドレスと違っています。これはどういうことでしょうか?
0496デフォルトの名無しさん
2009/08/27(木) 06:37:370497デフォルトの名無しさん
2009/08/27(木) 07:01:540498デフォルトの名無しさん
2009/08/27(木) 07:33:38ルータがアドレス変換してるから。
NATとかでぐぐれば分かる。
0499デフォルトの名無しさん
2009/08/27(木) 08:22:35linuxではbind前に遡ってデータを受信できるのか? こりゃ、吃驚だ。w
0500デフォルトの名無しさん
2009/08/27(木) 08:45:46ルータを介さない自分のグローバルIPを取得する関数もしくは鉄板な方法ありますか?
0501デフォルトの名無しさん
2009/08/27(木) 09:13:060502デフォルトの名無しさん
2009/08/27(木) 09:13:400503デフォルトの名無しさん
2009/08/27(木) 10:26:30自分はグローバルIPアドレスをもってない可能性が高い。
0504デフォルトの名無しさん
2009/08/27(木) 10:28:26なんでIPって言っちゃいけないの?
0505デフォルトの名無しさん
2009/08/27(木) 10:49:260506デフォルトの名無しさん
2009/08/27(木) 10:57:270507デフォルトの名無しさん
2009/08/27(木) 11:10:14だから何でIPと言っちゃいけないの?
0508デフォルトの名無しさん
2009/08/27(木) 11:15:59分ったら消えろ。
0509デフォルトの名無しさん
2009/08/27(木) 11:23:21アホですか?
0510デフォルトの名無しさん
2009/08/27(木) 11:40:14意味はわからなくないが、厳密に言えば間違い
0511デフォルトの名無しさん
2009/08/27(木) 11:57:360512デフォルトの名無しさん
2009/08/27(木) 12:02:39理解できないの?
アホ確定ですね。
0513デフォルトの名無しさん
2009/08/27(木) 13:12:08スルーしる
0514デフォルトの名無しさん
2009/08/27(木) 13:17:17お前も二度と「レス」とか「携帯」とか使うなよ
0515デフォルトの名無しさん
2009/08/27(木) 13:24:180516デフォルトの名無しさん
2009/08/27(木) 13:25:15あぁ、見かけたら「使うな。クズ」と言っていいぞ。ww
0517デフォルトの名無しさん
2009/08/27(木) 13:52:06ipv6とかで、IPが長いと省略されてしまうんだけど
IPを省略しないで表示させるにはどうしたらいいのかな。
0518デフォルトの名無しさん
2009/08/27(木) 14:27:150519デフォルトの名無しさん
2009/08/27(木) 14:37:52いちいち反応するやつの方がうぜえ
日本語の省略文化が判ってない馬鹿
0520デフォルトの名無しさん
2009/08/27(木) 15:15:290521デフォルトの名無しさん
2009/08/27(木) 15:32:020522デフォルトの名無しさん
2009/08/27(木) 15:39:22わざととしか思えないからスルー白
0523デフォルトの名無しさん
2009/08/27(木) 17:00:12どっちも同じ。
0524デフォルトの名無しさん
2009/08/27(木) 17:19:320526デフォルトの名無しさん
2009/08/27(木) 18:31:28自分のアドレスがプライベートだったら内部だけで解決するのは無理だな
ダイナミックdnsの自動更新の仕組みとか調べたら参考になるかも
0527デフォルトの名無しさん
2009/08/27(木) 18:35:470528デフォルトの名無しさん
2009/08/27(木) 18:39:28SOAPとかで取得するやつ
0529デフォルトの名無しさん
2009/08/27(木) 18:44:12それでもPC内だけでって要望には応えられないんだよな
0530デフォルトの名無しさん
2009/08/27(木) 18:48:070531デフォルトの名無しさん
2009/08/27(木) 19:04:50一般的な方法は存在しない。
一般的でない方法ならたくさんあるのでそれを何通りも使って保険かける。
0532デフォルトの名無しさん
2009/08/27(木) 20:31:28おまえの電話教えてよ
↓
おまえの番号教えてよ
↓
おまえ何番だっけ
0533517
2009/08/27(木) 22:14:110534デフォルトの名無しさん
2009/08/27(木) 22:15:31ttp://www.ip-checker.net/ のようなサイトをHTTPで叩いて
出てきたHTMLをパースすればOK
0535デフォルトの名無しさん
2009/08/28(金) 00:19:54ポートとIPの両方を指定してbindするのでは、
負荷って変わりますか?
bindしないIPとbindしないポート宛のデータが、bindするデータと混ざって送られてくるとして
とあるIP以外からは、とあるポートに送られてこないデータ送信があるとします。
そんな中で、IPとポートの二つをbindする必要があるかってことです。
ポートだけでも受信しないんだから、IPのbindしなくてもいいのでは?
負荷が変わらないもしくは、負荷が下がるならそっちのがいいような
0536デフォルトの名無しさん
2009/08/28(金) 00:22:09ブロードキャストで送信した場合って、ポートをbindしていたら受信できませんよね?
ブロードキャストはポート指定して送信できますか?
0537デフォルトの名無しさん
2009/08/28(金) 00:47:090538デフォルトの名無しさん
2009/08/28(金) 00:49:070539デフォルトの名無しさん
2009/08/28(金) 01:00:49http://chimp-sanctuary.org/oursanctuary/hitori.htm
引退(ヒトが勝手に引退と決めるだけなのですが)となったチンパンジーは、
人目につかない非公開の場所で単独飼育されるのが一般的です。それは、
40〜50年と言われるチンパンジーの寿命を考えると、ほとんどの人生をその
狭い檻の中で送ることになります。
0540デフォルトの名無しさん
2009/08/28(金) 01:04:46何が聞きたいのかさっぱりわからん
0541デフォルトの名無しさん
2009/08/28(金) 01:08:55たとえば111.111.111.111がルーターを介したアドレスだとしたら、111.111.111.111に何か送ればその人に確実に届いて他のPCに行くことは無いのかということです。
0542デフォルトの名無しさん
2009/08/28(金) 01:13:03bindでポートとIP両方指定した場合と、ポートだけ指定した場合では
負荷は違うのでしょうか?弾く層が違う?
ちなみにそのポート宛に届くのは、bindするIPアドレスだけからだとして
0543デフォルトの名無しさん
2009/08/28(金) 01:44:22linuxなら /proc/net/tcpとか、/proc/net/udpとかに生データが書いてあるんで、
それ解析すればいい。フォーマットは見たら大体分かる。
その他のOSなら知らね。
0544デフォルトの名無しさん
2009/08/28(金) 01:49:070545デフォルトの名無しさん
2009/08/28(金) 02:01:26ルータの設定による。
0546デフォルトの名無しさん
2009/08/28(金) 02:04:59たとえばどんな影響が出ますか?
0547デフォルトの名無しさん
2009/08/28(金) 02:08:040548デフォルトの名無しさん
2009/08/28(金) 03:02:57一般的にbindでIPアドレス指定が必要になるのは、
ネットワークインターフェイスが複数(2コ以上)ある場合で、
受け付けるインターフェイスを限定したい場合だけ。
ルータみたいに。普通のアプリでは指定する必要なし。
0549デフォルトの名無しさん
2009/08/28(金) 05:30:57普通のアドレスと同じように使えるということですか?
0550デフォルトの名無しさん
2009/08/28(金) 07:21:020551デフォルトの名無しさん
2009/08/28(金) 07:53:02普通のアドレスってなんだよ
異常なアドレスってのもあるのか?
0552デフォルトの名無しさん
2009/08/28(金) 07:58:242個以上有る場合は絶対していしないといけないってことでしょうか?
0553デフォルトの名無しさん
2009/08/28(金) 08:03:59IPってゆうな。クズ。
0554デフォルトの名無しさん
2009/08/28(金) 08:30:10受信したいインタフェースを限定したいなら。
0556デフォルトの名無しさん
2009/08/28(金) 11:14:08IPをふたつ持ってても、どっちからも受信したいなら指定する必要はない
(というかどっちのIPでも着信するようにデフォルトで設定している)
どれかひとつのIPでだけ受信したいなら設定する必要がある。
0557デフォルトの名無しさん
2009/08/28(金) 11:20:250558デフォルトの名無しさん
2009/08/28(金) 11:23:08IP
- | ←不機嫌な顔
IP
0559デフォルトの名無しさん
2009/08/28(金) 20:15:030560デフォルトの名無しさん
2009/08/29(土) 00:27:58IP
- ) ←愉快な顔
IP
0561デフォルトの名無しさん
2009/08/29(土) 00:41:200562デフォルトの名無しさん
2009/08/29(土) 07:04:410563名無しさん@そうだ選挙に行こう
2009/08/30(日) 14:11:34そういえば、HPをいちいちwebページと訂正する要領の悪いしったかいたなw
(初心者相手にそこまで説明する必要ないんだよw)
0564名無しさん@そうだ選挙に行こう
2009/08/30(日) 14:26:040565名無しさん@そうだ選挙に行こう
2009/08/30(日) 14:34:55省略するなよ Internet Protocol Address だ。
0566名無しさん@そうだ選挙に行こう
2009/08/30(日) 15:14:29省略するなお
0567名無しさん@そうだ選挙に行こう
2009/08/30(日) 15:17:290568名無しさん@そうだ選挙に行こう
2009/08/30(日) 16:39:230569デフォルトの名無しさん
2009/08/30(日) 21:00:36するどいw
0570デフォルトの名無しさん
2009/08/30(日) 22:00:240571デフォルトの名無しさん
2009/08/30(日) 22:45:540572デフォルトの名無しさん
2009/08/30(日) 23:18:41アドレスって略されると、IPアドレスなのかMACアドレスなのか、メモリアドレスなのかとかいろいろ可能性があって逆に迷惑だぞ
IPと略されたほうがまだいい
0573デフォルトの名無しさん
2009/08/30(日) 23:25:34IPと言った場合、プロトコルのことだぞ。
0574デフォルトの名無しさん
2009/08/30(日) 23:40:210575デフォルトの名無しさん
2009/08/31(月) 00:03:41携帯電話のことを携帯っていわないの?
0576デフォルトの名無しさん
2009/08/31(月) 00:09:06携帯電話のことを話って言うのか?
0577デフォルトの名無しさん
2009/08/31(月) 00:12:07IPは、UDPとか答えてたら頭おかしい
0578デフォルトの名無しさん
2009/08/31(月) 00:14:58IPは、アドレスとか答えてたら頭おかしい
0579デフォルトの名無しさん
2009/08/31(月) 01:01:180580デフォルトの名無しさん
2009/08/31(月) 01:02:59意味不明。素人は黙ってなさい。
0581デフォルトの名無しさん
2009/08/31(月) 01:04:050582デフォルトの名無しさん
2009/08/31(月) 09:20:19言ってろ低脳
0583デフォルトの名無しさん
2009/08/31(月) 09:27:030584デフォルトの名無しさん
2009/08/31(月) 09:33:23残念ながら、キミタチが無知なだけ。
0585デフォルトの名無しさん
2009/08/31(月) 10:04:46携帯電話をケータイと略しても意味が通じるが
IPはそれだけで意味を持つからダメ
0586デフォルトの名無しさん
2009/08/31(月) 12:17:270587デフォルトの名無しさん
2009/08/31(月) 14:45:32自称プロなんて見てればすぐばれるんだからw
0588デフォルトの名無しさん
2009/08/31(月) 15:18:110589デフォルトの名無しさん
2009/08/31(月) 17:39:28きっと漏れが成長したんだろう
0590デフォルトの名無しさん
2009/09/01(火) 06:06:18携帯傘のことを携帯とは呼ばずに傘と呼ぶのと同様。
0591デフォルトの名無しさん
2009/09/01(火) 07:00:110592デフォルトの名無しさん
2009/09/01(火) 07:26:11>携帯 【けいたい】
>
>(1)身につけたり,手に持ったりして持ち運ぶこと。「―品」「雨具を―する」
>(2)「携帯電話」の略。 →携帯電話
>提供元:「大辞林 第二版」
というわけで、携帯は既に携帯電話の略称として定着しているとみてよいでしょうが
0593デフォルトの名無しさん
2009/09/01(火) 08:08:060594デフォルトの名無しさん
2009/09/01(火) 16:24:34最新版の>>592のようなものが妥当だろう
0595デフォルトの名無しさん
2009/09/01(火) 19:09:210596デフォルトの名無しさん
2009/09/01(火) 21:10:030597デフォルトの名無しさん
2009/09/02(水) 21:11:38「電話」はシステムの名前だから「携帯電話機」「携帯電話端末」だな。
電話機を電話と略すのは、IPアドレスをIPと略すのに等しい。
0598デフォルトの名無しさん
2009/09/02(水) 21:19:080599デフォルトの名無しさん
2009/09/02(水) 21:42:56それって略じゃなくて別名とか俗称・別称という感じだが
0600デフォルトの名無しさん
2009/09/03(木) 00:31:25もしそれが絶対ダメだというのなら
日本語は今頃酷く話し辛いものになっていたと思うよ
0601デフォルトの名無しさん
2009/09/03(木) 00:47:220602デフォルトの名無しさん
2009/09/03(木) 01:05:420603デフォルトの名無しさん
2009/09/03(木) 10:02:16誤用はあくまでも誤用。
0604デフォルトの名無しさん
2009/09/03(木) 10:09:420605デフォルトの名無しさん
2009/09/03(木) 20:25:250606デフォルトの名無しさん
2009/09/03(木) 22:41:010607デフォルトの名無しさん
2009/09/03(木) 23:49:44データを送信し終わった段階から、相手が受信し始める 段階までの速度でしょうか?
それとも、データを送信して、相手が受信し、相手がそれに対しデータを送信し、最初に送った相手が受信しはじめる時間でしょうか?
厳密には、プログラムでいうと、sendが終わった段階から、相手がrecvで受信しはじめるまでの時間でしょうか?
0608デフォルトの名無しさん
2009/09/04(金) 00:07:32100Mbpsとか56kbpsとかはスループットと言って、
データを途切れなく連続で送り続けたときに毎秒どれだけ送れるかというもの
100Mbpsなら1秒あたり100メガビット≒12メガバイト
例えば10ギガバイトのデータを送信あるいはダウンロードするには13分ちょいかかる計算になる
0609デフォルトの名無しさん
2009/09/04(金) 00:10:34100Mbpsなら、地球の裏側だろうが、東京から大阪だろうがダウンロードにかかる
時間にはかわりないのでしょうか?
あと、100Mのデータを途切れなくおくるとありますが、
途切れなく送るプログラムってどんな感じなのでしょうか?
CPUにも依存するのでしょうか100Mbpsは
0610デフォルトの名無しさん
2009/09/04(金) 00:23:50答えを聞いても別の疑問が沸いてくるだけだろう
時間の無駄だ
0611デフォルトの名無しさん
2009/09/04(金) 00:31:04プログラミングと関係ない気がするが
単位時間当たりの伝送ビットだよ。
>データを送信し終わった段階から、相手が受信し始める
とか
>データを送信して、相手が受信し、相手がそれに対しデータを送信し、最初に送った相手が受信しはじめる時間
とかは関係ない
プログラムのことは関係なく、回線のあるポイントを監視して、1秒間に何ビット通過したかってだけのこと。
たとえば、交通量調査員が、ある道で交通量を計測している。
その交通量調査員は自分の前を通った車の数だけチェックしているわけだ。
その道路の信号機の位置や交差点の有無は考慮しない。
ある時間から、ある時間までをただ数えているだけ。
0612デフォルトの名無しさん
2009/09/04(金) 00:32:58電気信号や光の速度も無限ではないし、途中でルータ等の機器を経由するごとにちょっとずつ時間を食うが・・
そうだな・・・たとえば川を想像してみろ
流れる水がデータだと思え
最初、川にまったく水が無い場合、上流から放水を始めると、それが下流に届くまでいくらか時間がかかる
この時間がレイテンシ、これは川の距離による
しかしいったん最初の水が来れば、あとは川の容量が許す限り次々に水が来る
この流量がスループット、これは川の広さによる
ほんのちょびっとだけ水が欲しい、というときは川がいくら広くてもあんまり意味がなく、川の距離の影響が大きい
ものすごい大量の水が必要だ、というときは、最初の水が来るまでの時間なんかささいなことで、
最終的にどれだけ大量の水を送れるか、つまり川の広さが重要になる
100Mbpsとか56kbpsとかは、川の広さの方を表す値だ
0613デフォルトの名無しさん
2009/09/04(金) 00:43:58>100Mbpsとか56Kbps
回線の速度のことかな
どこからどこまではググってね…
>データを送信し終わった段階から、
>相手が受信し始める段階までの速度
自分から相手つまり上りの回線速度
(相手からは下りになるのかな?)
>それとも、データを送信して、相手が
>受信し、相手がそれに対しデータを送信し、
>最初に送った相手が受信し始める時間でしょうか?
相手から最初に送った相手(自分?)
つまり下りの回線速度
おっと…いつの間にか進んでる
何を書きたいんだ自分はorz
>>609
>100Mbpsなら、地球の裏側だろうが、
>東京から大阪だろうがダウンロードに
>かかる時間に変わりないのでしょうか?
回線のトラフィックや他の回線速度によって
わずかに違うかもしれない
極端な例だが、自分のノートは無線LANルーター(54Mbps)で
ネットに接続しているが
PCから無線LANルーター間は高速でも
ルーター以降がPHS(64Kbps)なので
とてつもなく遅いorz
0614デフォルトの名無しさん
2009/09/04(金) 00:51:39初心者のただの自問自答か
0615デフォルトの名無しさん
2009/09/04(金) 01:07:080616デフォルトの名無しさん
2009/09/04(金) 01:21:01今後その手の質問が来たらどこかに誘導するか・・・
0617デフォルトの名無しさん
2009/09/04(金) 11:12:510618デフォルトの名無しさん
2009/09/04(金) 15:22:12送信した単位で取得するにはどうすればいいの?
自前でデータサイズヘッダーを付加して送信するとかしないとダメですか
0619デフォルトの名無しさん
2009/09/04(金) 15:26:35そういうこと。 >>114 参照ね。
分断や結合の考慮が必要なので
ユニークな終端記号 や ヘッダにサイズを乗せて 大きさでまとまる といった作業が必須になる
0620デフォルトの名無しさん
2009/09/04(金) 15:36:500621デフォルトの名無しさん
2009/09/04(金) 22:43:290622デフォルトの名無しさん
2009/09/04(金) 23:26:16http://say-move.org/comeplay.php?comeid=22411
0623デフォルトの名無しさん
2009/09/05(土) 00:46:28相手がソケットを破棄したかどうか調べる方法教えて
調べてもHTTPのサンプルばっか
0624デフォルトの名無しさん
2009/09/05(土) 00:55:410625デフォルトの名無しさん
2009/09/05(土) 09:39:07HTTPはTCP/IPなので問題なかろう
0626デフォルトの名無しさん
2009/09/05(土) 10:26:410627デフォルトの名無しさん
2009/09/05(土) 12:51:52おれはそうしてる
0628デフォルトの名無しさん
2009/09/05(土) 13:13:390629デフォルトの名無しさん
2009/09/05(土) 18:52:591回recvfromしたとき、バッファには100kbはいるんでしょうか?
0630デフォルトの名無しさん
2009/09/05(土) 18:58:23試してみればわかることだ
0631デフォルトの名無しさん
2009/09/06(日) 00:33:40Amazonでググってもでてこないし。
これはなんだろう?「購入できません」だし。
http://www.bk1.jp/review/386665
0632629
2009/09/06(日) 08:41:230633デフォルトの名無しさん
2009/09/06(日) 10:38:22とりあえず何が必要なのか分かってるよな?
0634デフォルトの名無しさん
2009/09/06(日) 10:54:20100KBくらい送れなきゃストリーミングなんて出来ないわけだが。
もしかしたら一回で100KB送りたいわけ? 何のために?
0635デフォルトの名無しさん
2009/09/06(日) 11:00:17送れてかつ受信できたらな100kb入る。
0636629
2009/09/06(日) 22:21:17recvfrom のオプションで100kbにすればいいのでしょうか?
recvfrom自体はきっと何回もするんですよね
0637デフォルトの名無しさん
2009/09/06(日) 23:30:21100Kまで取れるかどうか知らないけど、
アプリケーションで処理したほうが良いと思うよ
約1.5Kのパケット一つでもロスしたら100K全部ダメになっちゃうからね
0638デフォルトの名無しさん
2009/09/06(日) 23:33:18IPとUDPのRFC読め
0639637
2009/09/06(日) 23:33:53recvfromは一回だけ
setsockoptionでバッファサイズを100kB以上にしないと
ってゆいか、出来るかどうかわからないし止めた方がいい
0640デフォルトの名無しさん
2009/09/06(日) 23:50:17何で一回で100KBを受信したいんだ?
しかもUDPで。
0641デフォルトの名無しさん
2009/09/06(日) 23:56:51>>3にある「UNIXネットワークプログラミング」を読みな。
TFTPの実装がソース付きで詳しく解説されてる。
TFTPというのは、UDPを使ったファイル転送プロトコル。
だから、原理的には100Kbyteでも100MByteでもUDPで転送できる。
0642デフォルトの名無しさん
2009/09/07(月) 00:11:10拒否するルータがいない事、UDPを送る前にARPエントリが存在する事が確認さ
れている事。などの条件を満たさなければならない。
これらの条件がそろった時に100kのデータを一回で送る事が出来る。
さらに、出来ない場合を検出するために、必要な(フラグメントを許さないルー
ターからの)ICMPを破棄しない事(素人が設定したファイアウォールは破棄する)も必要。
0643デフォルトの名無しさん
2009/09/07(月) 21:34:060644デフォルトの名無しさん
2009/09/07(月) 21:36:240645デフォルトの名無しさん
2009/09/07(月) 21:42:49パスというかファイルシステムがそもそも存在しないかもしれんぞ
組み込みっても携帯くらいリッチだと余裕であるけどさ・・
0646デフォルトの名無しさん
2009/09/07(月) 21:50:35クライアントプログラムに問い合わせればいいんじゃね?
0647デフォルトの名無しさん
2009/09/07(月) 21:57:42理由も無く取得すると、スパイプログラムと言われるぞ。
0648デフォルトの名無しさん
2009/09/07(月) 22:03:33なんかクライアントブラウザのパスでも取得してるのかと思って。
0649デフォルトの名無しさん
2009/09/07(月) 22:06:400650デフォルトの名無しさん
2009/09/07(月) 22:14:32アドオンインストールでもしたんじゃないの?
0651デフォルトの名無しさん
2009/09/07(月) 22:16:00そりゃブラウザが自分の判断で(何かの必要を感じて)再起動してるだけだ
0652デフォルトの名無しさん
2009/09/07(月) 23:41:48クライアントのプログラムが、自身の責任でアクセス可能なものを使う
のはなんら問題ない。問題はサーバーに送って何をするかだ。
不特定のクッキー情報を送るだけでもスパイプログラム認定されてるぞ。
0653デフォルトの名無しさん
2009/09/07(月) 23:52:041kb×100回で送るとなると、まったく別のデータ扱いになるのでしょうか?
そういうのってアプリでどう処理すればよいのでしょうか?
また、TCPだと毎回、それでコネクション張るわけですか
0654デフォルトの名無しさん
2009/09/08(火) 00:04:320655デフォルトの名無しさん
2009/09/08(火) 00:13:01UDPなら分割してファイルに書き込んだり、ファイルから分割して読み込んだり
ってのとおなじ。
たまに壊れてるけど。
0656デフォルトの名無しさん
2009/09/08(火) 00:15:30ありがとうございます。
分割サイズってどれくらいがいいのでしょうか?
TCPとUDPじゃ分割サイズ違う方がいいのでしょうか?
0657デフォルトの名無しさん
2009/09/08(火) 00:23:04UDPは・・・500バイトくらい?もしくは1500バイトくらい
0658デフォルトの名無しさん
2009/09/08(火) 00:45:05よきに計らってくれる 笑
その500や1500の根拠ってあるのでしょうか?
普通に考えたら大きいほうが早く処理がすむようなきがするのですが、
TCPについてもそんなイメージが
0659デフォルトの名無しさん
2009/09/08(火) 00:52:43MTUでぐぐってみるよろし
0660デフォルトの名無しさん
2009/09/08(火) 00:53:56大きいとロスする可能性があがるでしょ。
あと、相手がその大きさを受け入れられるとは限らない。
0661デフォルトの名無しさん
2009/09/08(火) 00:55:020662デフォルトの名無しさん
2009/09/08(火) 01:01:140663デフォルトの名無しさん
2009/09/08(火) 01:04:35TCPの場合はいいのでしょうか?
というか、10Kのデータとかを1K分割で送ってもTCPと違って続きのデータとしは
みてれくないのですよね
0664デフォルトの名無しさん
2009/09/08(火) 01:08:49ソケットは届いたデータをアプリケーションに渡すだけ。
どうか意釈するかは、アプリケーション次第。
0665デフォルトの名無しさん
2009/09/08(火) 01:14:26たとえば、recvで毎回決まったデータをアプリケーションに渡そうとしても
毎回同じデータレングスが渡せるとは限りませんよね
1回目が1000で2回目が500で3回目が1500とか
そういうのって、相手がまだデータを途中までしかおくってきてないとか関係あるのでしょうか?
recvする際に、1パケットのサイズを指定してやれば
recvの受信サイズがまばらになることはないのでしょうか
3000とかをオプションで指定してやっても3000受信できることもあれば、1000しか
受信できないこともあったりと、あるとは思うのですが
0666デフォルトの名無しさん
2009/09/08(火) 01:22:010667デフォルトの名無しさん
2009/09/08(火) 01:28:56そのあたりの面倒を全部引き受けてくれるのがTCP
パケットの順序がバラバラになっても一部が失われても再送したりして復元してくれるし
相手が忙しそうなら送信スピードを自動的に調節したりもする
UDPはパケットが失われたり順序が入れ替わったり同じパケットが2度届いたり
等の現象にすべて自分で対処しなければならない
>>665
TCPは複数のsendを1つのパケットにまとめて転送効率を上げたり
送信スピードを調節してゆっくり送ったりする機能があるので
sendした分が実際に送られるパケットサイズと一致するとはまったく限らないし
sendしたバイト数とrecvできるバイト数が一致するなどとはまったく期待できない
recvは1バイトでも今すぐ返せるデータがあればさっさと返すような仕様になってるから、そういう動作をする
例えばGIFのインタレース表示をしたいブラウザなんかは、一部でもデータが到着したら
その部分はもう描画し始めたいわけだから、そういう仕様でないと困る
固定サイズずつ処理したいアプリケーションは、そのサイズが来るまで繰り返しrecvを呼べばよい
0668デフォルトの名無しさん
2009/09/08(火) 01:50:54たとえばだな、イーサネットのフレームサイズは 1500 バイト程度だ
IPが連続したデータとして、ある程度はめんどう見てくれるけど
UDP には到達保証を行う機能がないので 10k 送った中で 1 フレーム
でもエラーを起こすと 10K 全部が全滅
0669デフォルトの名無しさん
2009/09/08(火) 07:14:16ネットワークプログラミングってこの話題しかないし
この話題には回答者がいっぱい出てくるねw
0670デフォルトの名無しさん
2009/09/08(火) 08:04:58どんな感じになるのでしょうか?
TCPならコネクション切断されるまでが一つのデータ?
UDPならその境目がないような
0671デフォルトの名無しさん
2009/09/08(火) 08:12:45だったら簡単だろ。
0672デフォルトの名無しさん
2009/09/08(火) 08:13:160673デフォルトの名無しさん
2009/09/08(火) 08:33:50このデータが来たら一つのデータ終わりとか
0674デフォルトの名無しさん
2009/09/08(火) 08:50:45通信先分ソケットを作るのではどっちが効率いいんだろう
必要分のバッファをソケットに確保しておけば変わらない?
0675デフォルトの名無しさん
2009/09/08(火) 12:27:18一つのスレッドが一つのソケットで通信するようにして、
ソフトウェアスレッドをハードウェアスレッド数作成するのが一番いい。
0676デフォルトの名無しさん
2009/09/08(火) 13:02:490677デフォルトの名無しさん
2009/09/08(火) 13:03:380678デフォルトの名無しさん
2009/09/08(火) 19:30:32・ひとつのソケット
・通信先の数のソケット
どっちがいい?ってことだから間違ってはないんじゃないの?>>675-676
0679デフォルトの名無しさん
2009/09/08(火) 19:33:470680デフォルトの名無しさん
2009/09/08(火) 19:54:570681デフォルトの名無しさん
2009/09/08(火) 20:45:25こいつは頭がいかれているのか、それとも何か方法があるのか
0682デフォルトの名無しさん
2009/09/08(火) 20:50:260683デフォルトの名無しさん
2009/09/08(火) 20:50:470684デフォルトの名無しさん
2009/09/08(火) 20:55:44上司か?w
さらに上に相談して解雇してもらえw
0685デフォルトの名無しさん
2009/09/08(火) 20:57:030686デフォルトの名無しさん
2009/09/08(火) 21:00:07ローカルにキャッシュ置いといたりするのはよくやるけど。
あと、接続に失敗したらsleepして、ネットワークが回復したら再トライとか。
0687デフォルトの名無しさん
2009/09/08(火) 21:00:370688デフォルトの名無しさん
2009/09/08(火) 21:01:310689デフォルトの名無しさん
2009/09/08(火) 21:05:51あらかじめクライアント側に自動的にあらゆるデータを改ざんするプログラムを仕込んでおけばおk
0690デフォルトの名無しさん
2009/09/08(火) 23:00:56プログラムが固まってしまうとかはNG
0691デフォルトの名無しさん
2009/09/09(水) 00:47:06それらを一つのデータとしてバッファに入れる方法ってあるのでしょうか?
recvで一度に受信できるサイズを1パケット以下にすればいいのでしょうか?
0692デフォルトの名無しさん
2009/09/09(水) 00:50:13recv1→recv2 もしくは、recv2→recv1 の順番に処理されますよね
それを、recv1→ と同時に処理させることは可能なのでしょうか?
recv2→
前者だと見かけ上は、同時にやろうとしてるけど、順番で処理していくのですが
後者だと処理速度は半分程に落ちるけど同タイミングにきても同じスピードで処理していくみたいに
これって、プログラムだけで組めますか?
0693デフォルトの名無しさん
2009/09/09(水) 01:44:02> TCPで受信するときって、毎回受信サイズ違いますよね
> それらを一つのデータとしてバッファに入れる方法ってあるのでしょうか?
recvで受けたデータを順番にバッファに詰めていけばいいだけだろ。
ネットワークプログラミング以前のスキル不足じゃね?
0694デフォルトの名無しさん
2009/09/09(水) 01:49:13たぶん何をやりたいのか自分でもわかってないのが問題だとおもうけど。
TCPなら、それぞれのソケットから交互に1byteずつreadしていけばいいんじゃね?
0695デフォルトの名無しさん
2009/09/09(水) 01:54:46CPUが2個あるようなイメージの処理で
そういうのってやはり無理なのかなぁ。
そうでないと、送信と受信を同タイミングでする際、どちらかが終わってからじゃないと
処理できませんよね。送信→受信もしくは、受信→送信の流れに
0696デフォルトの名無しさん
2009/09/09(水) 03:51:51あとはソケットからの読み込みとかを組み込めば楽勝。
0697デフォルトの名無しさん
2009/09/09(水) 10:10:04最近javaでネットワークプログラミングを始めようと思っています。(TCP)
cのときは、ここの話題にも時々出てくるように長さプレフィックスつけたり、区切り文字使ったりとても苦労しましたが、
javaだと、Serializable、ObjectInputStreamといったものでオブジェクト渡せば悲しいぐらい簡単で、うまくいっているように見えます。
これは正解ですか?
0698デフォルトの名無しさん
2009/09/09(水) 10:18:57パフォーマンスとか効率とかを求めないなら、便利で楽で良いと思うよ
0699デフォルトの名無しさん
2009/09/09(水) 10:40:09fdopenしてstdioにバッファリングさせる。
0700デフォルトの名無しさん
2009/09/09(水) 10:57:11CPUが2つあってもネットワークインタフェースがひとつじゃあねぇ。
0701デフォルトの名無しさん
2009/09/09(水) 10:58:490702デフォルトの名無しさん
2009/09/09(水) 11:06:08>>691には関しての質問はないので、解決済みなんだろ。
0703デフォルトの名無しさん
2009/09/09(水) 11:12:08> 悲しいぐらい簡単
ワロタ
しかし C でも TLV とかにしてればさして苦労はしなかっ
たはずだぞ。マクロでなんとかなってた気がする。
0704デフォルトの名無しさん
2009/09/09(水) 11:37:44あと、Java以外のシステムと通信しないなら。
0705デフォルトの名無しさん
2009/09/09(水) 11:46:30話がかみ合ってないぞ
0706デフォルトの名無しさん
2009/09/09(水) 22:00:17ActiveX無しでできる?
0707デフォルトの名無しさん
2009/09/09(水) 22:27:18例えばtelnetとかでアクセスすることも可能なわけで
telnetはサーバから何を受け取ってもIEを起動したりしないし
0708デフォルトの名無しさん
2009/09/09(水) 22:33:24\ __ /
_ (m) _ピコーン
|ミ|
/ `´ \
('A`) IEを強制起動するtelnetを
ノヽノヽ あらかじめ配布しておけば!
くく
0709デフォルトの名無しさん
2009/09/09(水) 22:34:09ノヽノヽ=3 ブー
くく
0710デフォルトの名無しさん
2009/09/09(水) 22:44:50ありがと、サーバーもjavaで書くんで大丈夫そうです
パフォーマンスは気にならないわけではないが・・・まぁいっかw
>>703
TLVとか詳しくわからない・・・
まぁ何送るか教えて、(サイズ教えて)、データ送るようにはしてたが、
マクロとか使えるものが合ったのか・・・・
0711デフォルトの名無しさん
2009/09/09(水) 23:02:10ブロードキャストで送ると受信はされるのですが…
送信に関しては設定はいらないけど受信する場合は何か設定がいるのでしょうか?
0712デフォルトの名無しさん
2009/09/10(木) 10:08:350713デフォルトの名無しさん
2009/09/10(木) 11:15:43一種のウィルスだな、それは。
0714デフォルトの名無しさん
2009/09/10(木) 22:16:06できるわけねーだろクソガキ消えろ
0715デフォルトの名無しさん
2009/09/10(木) 23:06:520716デフォルトの名無しさん
2009/09/10(木) 23:50:12> まぁ何送るか教えて、(サイズ教えて)、データ送るようにはしてた
TLV は type, length, value だからそんなもん。
メリットとしては新旧バージョンが混在しても
TL の部分で読み飛ばし判定が出来るってことかな。
だから構造体みたいなのは構造体ごと読み飛ばせるように
中の要素サイズも含めたサイズを指定することになる。
0717デフォルトの名無しさん
2009/09/10(木) 23:57:31マルチキャストアドレスグループの参加の方法ってどうやるのでしょうか?
送信側は参加に関係ないのかな
0718デフォルトの名無しさん
2009/09/11(金) 00:01:39とっておきの解説サイトを教えてやろう。
http://www.google.com/
0719デフォルトの名無しさん
2009/09/11(金) 00:14:24素人の知識で自慢するなかれ。笑われるよ。
0720デフォルトの名無しさん
2009/09/11(金) 01:08:46国際通信規格でも使われてますが何か?(プ
0721デフォルトの名無しさん
2009/09/11(金) 01:15:14その国際通信規格を>>679,710に勧める(自慢する)のが適切か?と言ってるだけ。
他の選択肢と比較した場合の利点と欠点を理解してるのか?
0722デフォルトの名無しさん
2009/09/11(金) 01:34:12・固定長
・区切りをつける(STX,ETXとか改行とかみたいな)
・ヘッダ+ボディ構成(ヘッダ部に種別と長さみたいな)
くらいなもんじゃね?
TLV形式って名前は知らなくてもみんな無意識に
似たような実装してるだろ
0723デフォルトの名無しさん
2009/09/11(金) 02:03:59・オブジェクトマーシャリング -- >>679,710が選んだ方式で、言語が限定される
・テキスト -- Internetプロトコルで多用される(SMTP/HTTPなど)
・プログラミング言語様式の定義言語 -- 現在の主流(Protocol Buffer/IDL/XDRなど)
・形式的仕様記述言語 -- TLV方式(国際通信規格の名称はASN.1/BER)
後にいくほど、メッセージ形式仕様定義の厳密さは増すが、実装は困難になる。
だから安易にTLV方式を採用することで「みんな無意識に似たような実装して」
似たようバグを作り込んでいる。もしもTLV方式に固執しつつ、他の方式と同等な
品質も確保するのなら、ASN.1インスタンスをBERへ変換するC言語モジュールを
自動生成できるASN.1コンパイラを導入するしかないが、覚悟と準備が前提になる。
これらの事柄を理解した上で、その国際通信規格とやらを提案(自慢)するのか?と
言っているのだが。自分は、>>679,710が彼自身の置かれている現状の中で、
最良な方式を(無意識にせよ)選択したと考えたから、特にレスもせずスルーしたよ。
0724デフォルトの名無しさん
2009/09/11(金) 02:35:38似たようなバグってたとえばどんなの?
0725デフォルトの名無しさん
2009/09/11(金) 03:01:22TLV方式というのは、XMLと同じで柔軟で階層的なデータ構造を実現できる(これは利点)。
ただし、それだけでは、スキーマを決めずに(定義せずに)XMLでデータ交換するようなものだから、
通信相手相互の解釈の違いがバグに直結する。
解釈の相違について、具体的な例をあげる。
・このTypeは必須か/オプションか
・これらのTypeの並び順は規定されるか/自由か
・このTypeの重複は許すか/禁止するか(列の表現)
・このTypeの列の要素は多相を許すか/禁止するか
これらのデータ構造(構文)を形式的に定義するのが、ASN.1という言語。
XMLでいうDTD/RELAX-NG/XML Schemaといったスキーマ定義言語に相当する。
おそらく、これらが問題になるほどの複雑なメッセージ形式は必要ねえだろ?と
思うかもしれない。だとすれば(それほど単純なメッセージ形式であるならば)、
それは他の3つの方式を選択すべきで、あえて柔軟なTLV方式を選ぶこと自体が誤りである、
という結論になる。
0726デフォルトの名無しさん
2009/09/11(金) 03:13:10それを通信路上でやるだけ。
0727デフォルトの名無しさん
2009/09/11(金) 03:33:15DBスキーマは固定的(柔軟ではない)だよ。
通信であれば>>723の3番目にあげたProtocolBuffer/IDL/XDLに近い。
これなら、ある程度のプログラマなら対応できると思う。
ただ、ASN.1は(>>723で書いたように)、XMLスキーマに近い位置づけの言語。
そこらの人間だってDBスキーマくらいはやれるかもしれないけど、
XMLスキーマを自由に操れる人は、RDB屋さんほどありふれていないでそ。
XMLデータベースの普及を遅らせている、最大の要因だと思っているよ。
0728デフォルトの名無しさん
2009/09/11(金) 23:54:35単にTLVってType,Length,Valueの略ってわけじゃないの?w
0729デフォルトの名無しさん
2009/09/12(土) 00:08:500730デフォルトの名無しさん
2009/09/12(土) 00:43:05一般的には、ネットワーク上を流れるバイナリ形式のデータ構造表現法の一つ。
で、そのエンコード/デコード処理は手作業で作成することもできるし、過去はそうだった。
ただ、(>>725であげたような)問題があるから、最初は(日本語のような)自然言語で
メッセージの仕様(エンコードの規則)を記述していた。そして自然言語では、
仕様の曖昧さが残るから、形式的な仕様記述法が考案され、最終的にOSIプレゼンテーション層仕様の
一つとして、ASN.1(Abstract Syntax Notation:抽象構文記法)という名前で国際規格化された。
で、ASN.1の仕様策定と同時に、ASN.1で定義されたメッセージ仕様をエンコードするための規則も
策定された。これがBER(Basic Encoding Rule:基本エンコーディング規則)。
BERの中身は、階層的なType,Length,Value構造になっている。
自分としては、>>720で国際通信規格という言葉が提示されたから、
ああ、それは一般的なTLV構造ではなく、ASN.1/BERの事を指しているんだなと解釈し、
それ以降は>>720の意向に沿った形でレスしているつもりだよ。
0731720
2009/09/12(土) 02:14:31いや、全然沿ってない(w
どうも俺には ASN1 や XML ってパラノイア的に自由度
が高すぎるというか、レキシカルな部分とセマンティッ
クな部分がごっちゃになってるとういか、やれやれだぜ
とい印象を受ける。
TLV 的なもの、というのはレキシカルな意味で出したん
だよ。元々「シリアライズ」なんて言葉も出てたしオブ
ジェクトとの紐づけもそんなに難しくない。X というコ
ンポーネントがオプショナルに更に小さな a を持つ、
とかなら X の試験における a の有り無し評価くらいの
試験で済むじゃん。X が充分小さければ組合わせ数も
小さいし、X を含む試験では a の評価はオミット出来る。
ところが XML とかになるともう大変。あらゆる文脈で
X の a を評価しないといけなくなりそうなんだが皆どう
してんの? それとも皆そんなに巷のエンコーダ/デコー
ダ信用してんの?
俺が時流に乗ってないという意見は認める(w
0732デフォルトの名無しさん
2009/09/12(土) 02:58:30ではナゼ>>716でTLVを提案し、>>720で国際通信規格という言葉を持ち出したの?
そんな「パラノイア的に自由度が高すぎるというか....」な物を初心者に自慢したのはナゼ?
それを何度も問いているんだけど、まるで返答がない。まあ、どうでもいいんだけどね...。
>TLV 的なもの、というのはレキシカルな意味で出したんだよ。
TLVのレキシカル(lexical:字句)には、必ずシンタックス(syntax:構文)が伴う。
言語処理系を知っているなら、それは常識だよね。
そのTLV(BER)のシンタックスに対応するのがASN.1。
TLVという「パラノイア的に自由度が高すぎるというか....」な物を提案する以上、
そのシンタックスも一緒に考えないと、システム設計が崩壊するよ。
>皆どうしてんの? それとも皆そんなに巷のエンコーダ/デコーダ信用してんの?
今のネットあるいはビジネス分野では、SOAPやXML-RPCといったXMLベースの技術が主流だよ。
特にアプリケーションに近い開発者には、XMLとXMLスキーマは避けて通れない技術になりつつある。
ネットワークに近い開発者(たとえば、このスレ住人の大半であろうソケットプログラマ)であれば、
>>723の3番目にあげたProtocolBuffer/IDL/XDRが主流であると思う。ただし、実際の実装は、
手作業でデコーダ/エンコーダを作成することが大半。メッセージ形式が単純なうちは、それで十分。
もし、それが負担になるようなら、専用のコンパイラ(ソースコードジェネレータ)の導入を検討すべき。
ProtocolBuffer/IDL/XDRのどれもがプログラミング言語に近い様式でメッセージ形式を記述できるから、
多くのプログラマが活用できると思う。ただ、新しい技術の導入には、必ず壁がつきまとうから、
生産性や品質保証といった項目を十分に比較/検討してから、導入の是非を判断してください。
0733720
2009/09/12(土) 03:05:07> ではナゼ>>716でTLVを提案し、>>720で国際通信規格という言葉を持ち出したの?
TLV は国際通信規格でも使われてるし、もっとお手軽に
使える考え方でもあるでしょ。実際 >>710 だって独自に
> まぁ何送るか教えて、(サイズ教えて)、データ送るようにはしてた
って言ってるんだし。
そこに「そんなの教えてどうすんの」的なのを言いだす
方が「説教したいだけなんですね?」って思うけど。
0734デフォルトの名無しさん
2009/09/12(土) 04:11:50>TLV は国際通信規格でも使われてるし、もっとお手軽に
>使える考え方でもあるでしょ。
その「国際通信規格」という甘い言葉にのせられ、一見すると「もっともお手軽に使える考え方」に
思える「TLV方式の実体」というのが、ASN.1という「パラノイア的に自由度が高すぎる(>>731)」
枠組みで固めなければ容易に扱えない「怪物」であるという事を、気がついてくれないのかな....orz
>実際 >>710 だって独自に
>> まぁ何送るか教えて、(サイズ教えて)、データ送るようにはしてた
>って言ってるんだし。
>>710が言ったのは、単純に<長さ, 固定長ヘッダ(複数フィールド), 可変長ボディ(単一)>という
メッセージ形式ではないのかな。これはTLV方式じゃないよね。Typeフィールドが無いから。
このくらい単純なメッセージ形式であれば、(怪物である)TLV(あるいはXML)を採用しなくても、
ProtocolBuffer/IDL/XDRが使えるよ。どれも構造体/共用体/可変長文字列/可変長配列が定義できるし、
>>716にあった新旧バージョンの混在は、共用体で容易に実現できる。
返答してくれたから、>>720の意図は理解できた。説教臭いと感じているようだし、
後ろ向きな問いかけであるのは事実だから、これ以降は提案うんぬんの話は持ちかけない。
これで終わりにするよ。
0735デフォルトの名無しさん
2009/09/12(土) 09:01:200736デフォルトの名無しさん
2009/09/12(土) 11:48:28実際に受信してみればわかる
ioctlsocketとかでもわかるけど、それをやる前にザ・間違いリストの12番を読むべき
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/lame-list.html#item12
0737デフォルトの名無しさん
2009/09/12(土) 12:35:450738デフォルトの名無しさん
2009/09/12(土) 13:25:09元の質問は, 全部到着したかどうかを判定したいって書いてないんだが…
おれは, バッファをどれだけ増やせばいいかを調べるときには ioctlsocket
を使うけどな
0739デフォルトの名無しさん
2009/09/12(土) 15:41:51送信側は参加に関係ないのかな
0740デフォルトの名無しさん
2009/09/12(土) 17:18:10とっておきの解説サイトを教えてやろう。
http://www.google.com/
0741デフォルトの名無しさん
2009/09/12(土) 17:27:060742デフォルトの名無しさん
2009/09/12(土) 20:39:13くだらない。ひねりがない。
0743デフォルトの名無しさん
2009/09/12(土) 21:00:310744デフォルトの名無しさん
2009/09/12(土) 21:21:050745デフォルトの名無しさん
2009/09/12(土) 21:23:010746デフォルトの名無しさん
2009/09/12(土) 21:27:11>>739-740
次回用テンプレおいときますね
マルチキャストアドレスグループの参加の方法ってどうやるのでしょうか?
送信側は参加に関係ないのかな
とっておきの解説サイトを教えてやろう。
http://www.google.com/
0747デフォルトの名無しさん
2009/09/12(土) 21:36:490748デフォルトの名無しさん
2009/09/12(土) 21:39:350749デフォルトの名無しさん
2009/09/12(土) 22:09:23setsockopt で IP_ADD_MEMBERSHIP を設定するんじゃねぇの?
0750デフォルトの名無しさん
2009/09/12(土) 22:16:26・非ブロッキング
・acceptはSleepとセットのループ
・送受信はwrite(const void *p, int len)のようなラップ関数内で、recv/sendとselect(待つのは一つのソケットのみ)によるループ
により実装されていました。
※何れも一つのソケット(コネクション?)に対し一つのスレッドを生成し処理していました。
この場合、ブロッキングと比べてどのようなメリットがありますでしょうか?
私の無い頭だと、ブロッキングとあまり変わらないように思ってしまいまして・・・
0751デフォルトの名無しさん
2009/09/12(土) 22:59:49なにか質問があったら「ググレ」って得意げに言うのやめてもらえます?
こっちは別にあんたらみたいに教える気などなく説教したがりなだけの人に無理に聞こうと思ってませんよ。
私は、グーグルさんじゃなくて、ここで聞いているんです。
自分で調べる気がないのはなく、ここでもし知ってる人がいたら教えてもらおうという選択肢を選んだだけのこと。
教える気ないなら黙ってもらってて結構。
この掲示板の管理人さんに「質問はしないでください」といわれるのなら質問は自粛しますが
質問の制約のない掲示板で、管理人でもない分際の人に「自分で調べなさい」などと言われる筋合いはありません。
0752デフォルトの名無しさん
2009/09/12(土) 23:02:370753デフォルトの名無しさん
2009/09/12(土) 23:04:00バッファを動的に増減するメリットは何?
0754デフォルトの名無しさん
2009/09/12(土) 23:11:54「UDPで複数の端末にパケット投げたりできますか?」
という質問なら親切に答えたかもしれないけど。
0755デフォルトの名無しさん
2009/09/12(土) 23:21:460756デフォルトの名無しさん
2009/09/12(土) 23:28:25質問者に不快な思いをさせても回答者は損しない
従って回答者は何書いてもどうってことないが、質問者は書く内容をよく考えるべき
0757デフォルトの名無しさん
2009/09/12(土) 23:34:000758デフォルトの名無しさん
2009/09/12(土) 23:39:04最近いるようなのでもちつけ。
0759デフォルトの名無しさん
2009/09/12(土) 23:40:160760デフォルトの名無しさん
2009/09/12(土) 23:40:530761デフォルトの名無しさん
2009/09/12(土) 23:41:060762デフォルトの名無しさん
2009/09/12(土) 23:41:530763デフォルトの名無しさん
2009/09/12(土) 23:42:03ブロックするか、ブロックしないか
0764デフォルトの名無しさん
2009/09/12(土) 23:49:44=== マルチスレッド&ブロッキング方式 ====
<利点>
・プログラムのロジックが単純になる。一般的なCプログラムが標準入力からのreadと
標準出力へのwriteをループさせて処理しているように、ソケットとのreceive/sendを
ループさせることで処理を実現できる。
・上記の理由により、TCPはレコード境界が無いプロトコルであるにもかかわらず、
receiveで待ち続ければいいから、受信メッセージの組立て処理のロジックは単純になる。
・マルチコア/マルチプロセッサ構成ではスレッド単位にコアまたはCPUが割り当てられるから、
コア数/プロセッサ数に応じてシステムの性能がスケーラブルに向上しやすい。
<欠点>
・スレッド間で資源の競合がある場合(たとえば同じ変数/ファイルを複数のスレッドが共有する場合)、
スレッド間で排他制御が必要になる。一般に、排他制御のデバッグは再現性が無いために難しい。
=== シングルスレッド&非ブロッキング方式 ====
<利点>
・そもそもスレッド間の資源競合が存在しないため、デバッグが容易になる。
<欠点>
・プログラムのロジックが複雑になる。TCPコネクション単位にオブジェクトを管理する(Cであれば、
たとえば構造体で送受信バッファ等を表現し、それらをリンクリストで繋いで管理する)必要がある。
・TCPはレコード境界の無いプロトコルであるため、ソケットに届いた受信メッセージの断片を
少しずつ組立て、さらにその処理を各TCPコネクション上で並行に実行させる必要があるため、
プログラムのロジックが複雑になる。
・マルチコア/マルチプロセッサ構成ではコアまたはCPUへの割り当てはコンパイラの最適化に
依存するから、コア数/プロセッサ数を増やしていっても、期待したほどシステムの性能は向上しない。
他にもあれば(訂正を含めて)追加ヨロ >>all
0765デフォルトの名無しさん
2009/09/13(日) 00:02:20プロセス間通信をしたいんですけど、
サーバーは同一のパソコン上で一つのみしか
起動できないんでしょうか?
複数サーバーがあるとクライアントがどのサーバーにつなげば良いのかわからないのでは?
と思うのですが。
それとも、サーバーのアドレスはそれぞれ異なるように設定できて
そういう問題は起こらないんでしょうか?
よろしくお願いします。
0766デフォルトの名無しさん
2009/09/13(日) 00:07:43クズ質問者に文句付けるのがオレの流儀。
管理人に「クズ質問者に文句付けるな」と言われたら自粛するが、
制約の無い掲示板で、管理人でも無い分際のクズに「ググれ言うな」と
言われる筋合いは無い。
嫌なら来るな。
0767本当に”管理”者です
2009/09/13(日) 00:10:54ググれ言うな。
0768デフォルトの名無しさん
2009/09/13(日) 00:14:05ポート番号というもので区別できるようになっている
サーバの待機するポート番号とクライアントの接続先のポート番号が一致したものが接続される
HTTPは80番、FTPは21番、のように、サーバの種類ごとにあらかじめ決まっている
同じポート番号でサーバを2つ起動することは出来ないので、その場合は番号をずらすなりなんなり調整する
0769デフォルトの名無しさん
2009/09/13(日) 00:14:46消えろ。カス。
0770デフォルトの名無しさん
2009/09/13(日) 00:16:12ごく稀なケースだけど, 俺は,
各データのサイズが結構巨大な可変長のデータで頭にデータ長がない
場合に使う
0771デフォルトの名無しさん
2009/09/13(日) 00:16:44なるほどー。ポート番号で区別するんですね。
設定の仕方とか調べてみます。
0772デフォルトの名無しさん
2009/09/13(日) 00:23:39それすると何が嬉しいんだ? パフォーマンスには影響無さそうに思う。
0773デフォルトの名無しさん
2009/09/13(日) 00:24:430774デフォルトの名無しさん
2009/09/13(日) 00:26:120775デフォルトの名無しさん
2009/09/13(日) 00:26:130776デフォルトの名無しさん
2009/09/13(日) 00:32:38何とsocketのポート番号との違いを知りたいの?
0777デフォルトの名無しさん
2009/09/13(日) 00:37:570778デフォルトの名無しさん
2009/09/13(日) 00:50:42mallocして一回?のrecvで受信するのと固定長バッファで複数回recvするのと
どちらが効率が良いかって話になりますね。
固定長バッファのサイズにもよるけど>>772さんの言われるようにたいして
パフォーマンスは変わらない気がする。
0779デフォルトの名無しさん
2009/09/13(日) 00:54:16socketにポート番号はない。
ポート番号はUDPやTCPに対してある。
0780デフォルトの名無しさん
2009/09/13(日) 01:54:14おぉありがとうございます。
でもこのアプリはマルチスレッド&非ブロッキングなんですよ。
一つのスレッドは一つのソケットしか操作しないのでブロッキングでもいいような気がするんですが。
メリットがあるとすれば、スレッド(送受信)の停止等を楽にコントロール出来るってところでしょうか?
っと思いましたがSleepやselectでの待機処理があるので一緒な気もします。
しかし本当の意味?での非ブロッキングはすごく複雑そうですね・・・
0781デフォルトの名無しさん
2009/09/13(日) 04:02:41一回は無理してでもシングルスレッドで書いとくと
後の人生で応用が利くからお勧め
0782デフォルトの名無しさん
2009/09/13(日) 05:25:360783デフォルトの名無しさん
2009/09/13(日) 09:28:28selectはコネクション数が非常に多い場合に非効率的になる。
>>782
UDPやTCPはプロトコルです、socketではありません。
0784デフォルトの名無しさん
2009/09/13(日) 18:45:45thx!
0785デフォルトの名無しさん
2009/09/13(日) 18:50:101万個くらいつくれるの?
0786デフォルトの名無しさん
2009/09/13(日) 19:27:46他にも制限あるだろうけどね。
0787764
2009/09/13(日) 19:28:48>でもこのアプリはマルチスレッド&非ブロッキングなんですよ。
>>764に挙げたのはselectによるタイマ監視を使用しない、一般的なケースですね。
もし>>750のようにタイマ監視が前提であれば、receiveによるプロセスのブロックは
selectによる監視の妨げになりますから、非ブロッキングなreceiveを使います。
ソケットは1個でも、そのデータ受信イベントとタイムアウト発生イベントを
同時に待ち受けるわけですから、selectの利用は自然な発想だと思います。
あと>>750で気になったのは、acceptをSleepとのループで待っているとの記述です。
acceptも(receiveと同じように)TCPコネクション確立通知イベント発生をタイムアウト付きで
selectを用いて監視できます。Sleepというのが何なのか分かりませんが(おそらくは独自の
マクロかライブラリ関数?)、C標準ライブラリのsleep関数に相当ものであると仮定すれば、
sleepによる待ち時間は無駄ですから、TCPコネクション確立通知に対する応答時間を
遅延させるだけの意味しか持たないように思えます。だから一般的にはタイムアウト付きの
selectでacceptをループさせます。謎のSleepについて、調査する必要があるかもしれません。
(長いので続く)
0788764
2009/09/13(日) 19:34:47>しかし本当の意味?での非ブロッキングはすごく複雑そうですね・・・
非ブロッキング処理を一般的に書くと>>764のようになって難解に見えますが、
その実装方法は「イベント駆動プログラミング」です。GUIアプリ開発では一般的ですよね。
普通の対話型Cプログラムだとscanf/printfのループで処理しますが、イベント駆動なGUIだと、
まずイベント待ちループに入り、マウスクリック/キー押下イベントが発生すると、事前に
登録しておいたアクションが実行され、そのアクションの中でウィジェットを操作します。
ネットワークプログラムにおけるイベント駆動プログラミングも同様に、イベント待ちループ内の
selectでTCPコネクション確立通知/データ受信(複数)/タイムアウトといったイベントの発生を
同時に待ち受け、イベントが発生すると対応するアクションを実行し、そのアクションの中で
独自プロトコルを実装した有限状態機械(Finite State Machine)へ発生イベントを送ります。
何度か開発経験を重ね、慣れてくるとイベント駆動処理を独自のライブラリ関数として
設計できるようになると思います。またGUIアプリ開発でも考え方は同じですから、
その本質を理解できれば、Webブラウザやメーラのようなネットワーク対応GUIアプリも、
自分で一から開発できるようになる訳で、(>>781が言うように)後の人生で応用が利きます。
大変ですが技術の習得をお勧めします。
0789デフォルトの名無しさん
2009/09/13(日) 19:37:05Sleep(0)を呼び出しているんじゃないのか?
Sleepに与えている時間は何ミリ秒なんだ?>>780
0790デフォルトの名無しさん
2009/09/13(日) 20:29:14サーバもクライアントも自作なのでなんでもし放題です
0791デフォルトの名無しさん
2009/09/13(日) 20:42:54ipsecとか、ssh port forwardとか。
0792デフォルトの名無しさん
2009/09/14(月) 00:00:25レスありがとうございます。
同期recvのみでもデータ受信とタイムアウト発生を待機出来るような気がしますが、
やはりselectの方が良いのでしょうか?
sleepは>>789さんの仰る通り、Win32APIのSleepを呼び出しているようです。
接続が無い場合の無駄なループを減らすためか、100ms待機しています。
しかし>>787さんのselectを使う方が理にかなっていますね。
あと勘違いしてましたが、acceptの場合は非ブロッキングやselectのメリットって多いんですね。
というか同期acceptのみだと、停止(やるとすると無理矢理かWSACancelBlockingCallかな?)や受け入れ数制限とか出来ないんですね。
>>788
おかげさまで少しだけイメージが掴めてきたような気がします。
でもブロッキングに比べて、スレッドやメモリは節約できますが、コアが多くなるほど全体的なパフォーマンスが落ちるような気もします。
その場合はある程度接続が多くなると、スレッドを増やす感じなのかな?(イベントオブジェクトの場合は必然的にそういう実装になるようですが)
おもーい腰を上げて、もう少し他のP2Pあたりのソースコードでも読みつつ勉強しようと思います。。
0793764
2009/09/15(火) 01:09:01スマン、自分はWinSockについてはまるで詳しくない。
勝手にUNIXソケットだと思い込んでレスしてた。
>同期recvのみでもデータ受信とタイムアウト発生を待機出来るような気がしますが、
>やはりselectの方が良いのでしょうか?
UNIXの場合は(シグナルを除いて)receiveではタイムアウト発生を待機できないから、
select使用が必須になる。WinSockが待機できるのなら、それで実装してもいいと思う。
自分なら(>>788で述べた)イベント待ちループ内で、すべてのイベント発生を待機させるけどね。
言い換えると、selectを使用して、イベント監視を1カ所に局所化した設計を選ぶ。
ただ、(>>783が指摘しているように)WinSockはselectのオーバヘッドが大きい。
だから、receiveで待機させる設計を選んだのかもしれない。自分に分かるのはここまで。
(UNIXであれば、それなりのリソースを用意することで、数10から数百TCPコネクションくらい
までなら実用的な性能を実現できる。シングルプロセッサの時代には多用された手法です。)
>でもブロッキングに比べて、スレッドやメモリは節約できますが、
>コアが多くなるほど全体的なパフォーマンスが落ちるような気もします。
その通りだと思う。
今でもシングルスレッド&非ブロックが多用されるのは、クライアントの開発。
GUIツールキットがあるから、マルチスレッディングが使いづらいのと、
性能や規模拡大性(スケーラビリティ)は、それほど重視されないのが理由。(Winnyが典型例かな?)
サーバ開発で採用されるのは、組み込み用途でリソースが極端に制限される場合が多い。
今時のサーバ開発では、(UNIXであっても)マルチスレッディングが一般に採用されるはず。
0794デフォルトの名無しさん
2009/09/15(火) 09:29:250795デフォルトの名無しさん
2009/09/15(火) 10:22:150796デフォルトの名無しさん
2009/09/15(火) 16:30:18マルチスレッドだと、スレッドからのプロセスのフォークが怖かったので
シングルスレッドでやることが多かったな。
今は怖くないから問題ないけど。
0797デフォルトの名無しさん
2009/09/15(火) 17:39:29たとえば210.58.02.XX君は58.697.67.XXX君の後ろで・・・とか
0798デフォルトの名無しさん
2009/09/15(火) 17:45:270799デフォルトの名無しさん
2009/09/15(火) 17:49:30acceptする場合にクライアントの選択は出来ないので、不可能。
0800デフォルトの名無しさん
2009/09/15(火) 17:57:01接続要求は 即accept → クライアントのIPをプール
予定セッション数未満ならそのまま受け付け、予定セッション数いっぱいの場合には
優先順位の低いクライアントのIPかを判定して、そいつを切断
クライアント側は再接続をトライさせる
こういう管理になるんかねぇ
0801デフォルトの名無しさん
2009/09/15(火) 18:09:36予定セッション数いっぱいの場合には、
acceptせずに放っておく方法(>>795)もあるね。
0802デフォルトの名無しさん
2009/09/15(火) 18:16:010803デフォルトの名無しさん
2009/09/15(火) 18:25:130804デフォルトの名無しさん
2009/09/15(火) 18:28:13クライアントのIPをプール って書いたつもりだったが言葉足らずだったかも
accept 直後の奴も 一旦プールの中に収めたうえで
「プールしたIP内で最も優先度の低い接続を切断しちゃおう」 という発想ね
0805デフォルトの名無しさん
2009/09/15(火) 18:30:390806デフォルトの名無しさん
2009/09/15(火) 20:19:41その理由をメッセージとして送ってから切る(send&close)ほうがいいだろね。
だって、せっかく待ち行列に並んでマダカナ・マダカナーって待ってたのに、
後から来たヤローに割り込まれてキャンセルさせられるわけだから涙目になる。
きちんとクライアントに説明してあげたほうがいいと思われ。
あと最初の受け付けを拒否される場合も、理由の説明は必要だろうね。
普通はクライアントが時間を置いてリトライすれば、いつかは成功するんだろうけど、
何か障害が発生していて、何度リトライしても成功しない状況だってありえるから。
0807デフォルトの名無しさん
2009/09/15(火) 20:54:45切断をする時点で明示的に切断されてるから
ある程度の説明責任は果たしてると思う。
なんか障害発生してたら接続された上で放置されたり
そもそも接続できないことがほとんどな気がする
0808デフォルトの名無しさん
2009/09/15(火) 21:52:03変な挙動起こしたりするんかな
0809デフォルトの名無しさん
2009/09/15(火) 21:55:060810デフォルトの名無しさん
2009/09/15(火) 22:03:30斧は待ち行列じゃないよ
排卵と精子の関係だお
0811デフォルトの名無しさん
2009/09/15(火) 22:20:33たぶんないな。
システムが割り当てたWSA系のリソース開放でしょ
だとすれば最悪メモリリーク起こすぐらいで挙動に大きな問題を抱えるものじゃないと思う。
0812デフォルトの名無しさん
2009/09/15(火) 23:35:31どういう意味?
0813デフォルトの名無しさん
2009/09/16(水) 10:23:26その後、サーバーからクライアントに返信した場合、クライアントアプリケーション側で受信できるのって
クライアントからサーバーに送信した地点で一時的にポート解放されてるから?
ファイアウォール等で受信拒否していてもつながるのも同じ理由なんだろうか
もしそうだとしたら、サーバーと通信中の2つのクライアントにお互いのIPとポートを教えて
お互いに何度かパケットを送信すれば何回目かで届き、
一度サーバーを経由するけど、そんな感じでP2Pネットワークを構築することってできる?
ためしにサンプルプログラムを組んでみたらうまくいったんだが、理論的にはどうなんだろう。
ルーターとかネットワーク環境によってはだめなんかな・・・
長文すまそ
あとスレチだったらすまそ
0814デフォルトの名無しさん
2009/09/16(水) 10:45:160815デフォルトの名無しさん
2009/09/16(水) 11:20:090816デフォルトの名無しさん
2009/09/16(水) 12:29:540817デフォルトの名無しさん
2009/09/16(水) 12:46:42セッションハイジャックとかしらべてみたらどうかな
0818デフォルトの名無しさん
2009/09/16(水) 13:05:00サーバーとの接続は公開鍵方式で、その後クライアント同士の接続はサーバーが指定した
秘密鍵で行う予定なのでその辺は問題ない…と思う
セキュリティー云々は置いといて、ファイアウォールはアプリケーション許可してもらう前提で
これで一般家庭でつながらないことは無いのかな?と思ったまでです
0819デフォルトの名無しさん
2009/09/16(水) 16:04:150820デフォルトの名無しさん
2009/09/16(水) 16:05:200821デフォルトの名無しさん
2009/09/16(水) 16:08:25何か垂れ流してるみたいで気持ちが悪い
0822デフォルトの名無しさん
2009/09/16(水) 16:20:020823デフォルトの名無しさん
2009/09/16(水) 16:23:260824デフォルトの名無しさん
2009/09/16(水) 16:31:092.液晶画面の局所的なフレネル反射の本気
3.819が光過敏性てんかんになった
4.ソケットを開いたプロセスが終了しきれずに生きている
5.知らね
0825デフォルトの名無しさん
2009/09/16(水) 16:34:400826デフォルトの名無しさん
2009/09/16(水) 16:37:460827デフォルトの名無しさん
2009/09/16(水) 16:40:410828デフォルトの名無しさん
2009/09/16(水) 16:54:180829デフォルトの名無しさん
2009/09/16(水) 20:00:09Wiresharkも回せないのか?
0830デフォルトの名無しさん
2009/09/17(木) 09:07:17なんでそういう単語を照れもなく使っちゃうレベルの人が
Winsock なんかに手ぇ出すかなあ。
0831デフォルトの名無しさん
2009/09/17(木) 18:38:250832デフォルトの名無しさん
2009/09/17(木) 20:38:44こいつにレスポンスコード302返したらどうなるん?
0833デフォルトの名無しさん
2009/09/17(木) 21:03:230834デフォルトの名無しさん
2009/09/17(木) 21:36:18セッションクッキー情報はTemporary Internet Filesに作られないのでせうか?
0835デフォルトの名無しさん
2009/09/17(木) 21:49:580836デフォルトの名無しさん
2009/09/17(木) 22:40:050837デフォルトの名無しさん
2009/09/18(金) 03:01:400838デフォルトの名無しさん
2009/09/18(金) 15:55:07サーバープログラムに、クライアント数制限をつけたいと思っています。
例えば、10人までしか接続が確立できない。という類です。
FD_ACCEPTが呼ばれた際、acceptをします。
定員を超えていたら、次の行でacceptから帰ってきたSOCKET(正常なもの)をshutdownし、closesocketしました。
そうしたところ、どうやらクライアントに切断したことが伝わらないようで、クライアントのrecvがSOCKET_ERRORを返してくれません。
FD_ACCEPTを抜けた後、別の場所(メインループなど)でshutdown & closesocketした場合は伝わるようです。
・FD_ACCEPT内でclosesocketしてはダメなのでしょうか?
・そもそも上限に達していたら、acceptしないという方法はないのでしょうか?
ご教示よろしくお願いいたします
0839デフォルトの名無しさん
2009/09/18(金) 16:20:07・recvが0を返したら、通信終了でいいんじゃない?
> ・そもそも上限に達していたら、acceptしないという方法はないのでしょうか?
それぞれのクライアントに対する処理は非同期で動作してる前提で話すけど、
acceptする前に、セマフォとかで調停する。
0840デフォルトの名無しさん
2009/09/18(金) 16:35:28お返事ありがとうございます。なるほど。SOCKET_ERRORではなく、recvの返り値が0の場合も切断なのですね。
調べてみたところ、recvが0を返すのは「正常な終了」が行われた時とありました。
どうもありがとうございます。
0841デフォルトの名無しさん
2009/09/18(金) 16:40:43aaceptする前に既にクライアントには受理されたことになってしまうので
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-3.html#ss3.3
acceptする前に調停しても、クライアントには伝わらないんじゃないかな。
acceptしないだけだと、たぶんクライアント側をしばらく待たせることになるので
それよりは一旦acceptだけしてから切断するほうが親切じゃないかな。
0842デフォルトの名無しさん
2009/09/18(金) 17:07:45ありがとうございます。
最初から拒否しておく。ということはできないのですね。
意外でした。
・FD_ACCEPTの中で切断しても大丈夫
・上記の結果、クライアント側のrecvの返り値が0になる
のが確認できました。
0843デフォルトの名無しさん
2009/09/20(日) 19:01:52既に接続が確立されてる相手からの送信データを待ちつつ
新たな接続が無いかどうかチェックするにはどうしたらいいの?
0844デフォルトの名無しさん
2009/09/20(日) 19:47:02acceptでブロックされたくないなら
該当descriptorをselect/pollすりゃいい
0845デフォルトの名無しさん
2009/09/20(日) 19:47:03接続待ちになるのはacceptね。
> 既に接続が確立されてる相手からの送信データを待ちつつ
> 新たな接続が無いかどうかチェックするにはどうしたらいいの?
接続が確立した相手用に新しいスレッド起こすか、
select使って複数のソケットに対してデータ待ちするか。
Windowsなら他の方法もあったかもしれない。
0846デフォルトの名無しさん
2009/09/20(日) 19:47:200847デフォルトの名無しさん
2009/09/20(日) 20:06:14select/pollのとこでフリーズしてしまいましたが。。
0848デフォルトの名無しさん
2009/09/20(日) 20:30:14別に>>844,845は、特に変な事は言っていないと思うけどな。
>>845に細かすぎる指摘(改善)すると、以下のようになるけど。
>select使って複数のソケットに対してデータ待ちするか。
==>select使って複数のソケットに対してデータ受信と接続を同時に待つか。
文句付けるなら、自分ならこうだ!ってのをレスしたほうがいいと思われ。
0849デフォルトの名無しさん
2009/09/20(日) 20:30:42素人でしゃばんな
0850デフォルトの名無しさん
2009/09/20(日) 21:15:37それは使い方が悪いからだろう。たぶん。
0851デフォルトの名無しさん
2009/09/21(月) 02:17:11夏厨は土に返ったはずであるが?
にーとさんかな?
0852デフォルトの名無しさん
2009/09/21(月) 07:09:590853デフォルトの名無しさん
2009/09/21(月) 12:58:080854デフォルトの名無しさん
2009/09/21(月) 14:22:25言語とかトラフィックパターン依存になるから、
プリミティブなソケット以上の共通化は不可能なのかね。
スレッドプールの共通インターフェイスが先か。
0855デフォルトの名無しさん
2009/09/21(月) 15:57:500856デフォルトの名無しさん
2009/09/21(月) 16:24:00俺のとこじゃフリーズしなかった
0857デフォルトの名無しさん
2009/09/21(月) 18:27:22select/pollのとこで止まってしまって先に進まなくなるのです。
0858デフォルトの名無しさん
2009/09/21(月) 19:13:010859デフォルトの名無しさん
2009/09/21(月) 19:19:500860デフォルトの名無しさん
2009/09/21(月) 21:17:270861デフォルトの名無しさん
2009/09/21(月) 22:26:20どこまでライブラリに機能を提供させるかという、境界線を引くのが難しい気がする。
トラフィックパターンが一方向の要求/応答に限定できるならRPC(JavaならRMI?)あるいは
HTTPライブラリで済むけど、わざわざソケットに手を出すのは、それ以外のパターンが
必要になる、ある程度複雑な(高機能な)アプリケーションを開発するケースだと思う。
ただ、そうなると、メッセージの衝突/送信権、分割/連結、優先制御/流量制御なども、
ライブラリが提供すべき機能要素として要求される(要求する人もいる)だろう。
またマルチスレッド/マルチプロセス/ファイバに関しても、どこまでライブラリで
対応させるべきか、人によって意見は分かれるはず。
だから、最終的には必要最低条件を満たしたソケットで落ち着いてしまうのだと思う。
個人的にはレコード指向(TCPのメッセージ境界対応)で全二重な機能だけを提供し、
あとは上位レイヤのプロトコル(アプリケーション)の実装にまかせる、軽いライブラリが
あってもよさげだと思うんだけどね。
0862デフォルトの名無しさん
2009/09/22(火) 15:55:58よかったね。
コード見せてくれないとわからんがな
0863デフォルトの名無しさん
2009/09/23(水) 16:30:480864デフォルトの名無しさん
2009/09/23(水) 16:35:36「readして読んだバイト数が0の場合」ってのじゃなくて、なんかのひっかけ?
0865デフォルトの名無しさん
2009/09/23(水) 16:35:440866デフォルトの名無しさん
2009/09/23(水) 16:51:050867デフォルトの名無しさん
2009/09/23(水) 16:55:47Unix 系の EBADF, ENOTCONN, EINTR, EFAULT は
相手がクローズするしないに関わらず発生する
0868デフォルトの名無しさん
2009/09/23(水) 19:07:23EINTR以外はプログラムバグじゃないの?
0869デフォルトの名無しさん
2009/09/23(水) 19:24:59そうだけど、そんなん言ったらECONNRESETだけじゃないか
明示的にエラーになってクローズされてるのは
0870デフォルトの名無しさん
2009/09/23(水) 21:32:37ですな〜
でも、recvが想定外なエラーを返した時点でそのソケットは捨てるしかないけど。
0871デフォルトの名無しさん
2009/09/24(木) 14:51:00一つのソケットでrecvとsendしたい場合はやっぱり非同期にするしかないのか・・・
0872デフォルトの名無しさん
2009/09/24(木) 15:23:51危なくはないと思うが。shutdown/closeさえ気をつければ。
ただ、recvとsendを別スレッドにすると、スレッド間でデータの共有が
必要になって面倒だから、普通はシングルスレッドで作るんじゃねえか?
完全にスレッドが分離してるんなら、別々でも無問題だろ。
0873デフォルトの名無しさん
2009/09/24(木) 15:24:47すくなくとも *nix は大丈夫なもよう
0874871
2009/09/24(木) 15:46:39レスありがとう
Winsock中級者向けの議論からも次の様な一文を発見
一方のスレッドが send() を呼び出し、別のスレッドが同一のソケットに対して recv() を呼び出すのは安全である、という伝説があります。
しかし私はこれを確認したことはありません。より堅固な情報やデモンストレーション用のコード、さらなる伝説などがあれば、教えていただけると幸いです。
まあとりあえず大丈夫だろうってことですね
0875デフォルトの名無しさん
2009/09/24(木) 15:50:58安価ミス
0876デフォルトの名無しさん
2009/09/24(木) 22:21:00Solarisは不定期にハングしてたよ
今はどうだかしらんけど・・・
0877デフォルトの名無しさん
2009/09/25(金) 12:10:34close後にレスポンス着てるみたいなんだがshutdownしないとだめ?
0878デフォルトの名無しさん
2009/09/25(金) 12:17:150879デフォルトの名無しさん
2009/09/25(金) 12:19:31送信スレッドと受信スレッドが別とかって話か?
必要なレスポンスなら何とかしてやるのが筋だろ?
送信側: SHUT_WR 送信で終了
受信側: 読込みバイト数0になるまでレスポンス読んで close
とか………
つか、プロトコル設計見直した方がええんちゃうか?
0880デフォルトの名無しさん
2009/09/25(金) 13:55:05送信パケットもモニタできるようにするのは不可能ですか?
WinPcapドライバを使えば送信パケットもモニタできるのだけど・・
0881デフォルトの名無しさん
2009/09/25(金) 21:03:37できんことは無いけど、それを作り上げていくと
WinPcapドライバが出来てしまうわけで
意味無いよな
0882デフォルトの名無しさん
2009/09/26(土) 20:27:520883デフォルトの名無しさん
2009/09/26(土) 20:46:56あーるいーしーぶい
0884デフォルトの名無しさん
2009/09/27(日) 01:52:410885デフォルトの名無しさん
2009/09/27(日) 16:29:19レスありがとうございます。
いろいろ調べてみた結果、
環境によって送信パケットをモニタできないことがあるみたいです。
別の環境だと普通に送信パケットもモニタできることを確認したので
問題を切り分けてる最中です。
詳しいことがわかりましたら報告させていただきます。
0886デフォルトの名無しさん
2009/09/27(日) 21:56:180887デフォルトの名無しさん
2009/09/28(月) 11:40:55その上何で今頃気づくんだろう俺orz
0888デフォルトの名無しさん
2009/09/28(月) 17:24:01やはり自民党清和会の下に結集し、日教組を壊滅させることでしょうね。
日教組の教師に「労働者の権利」などという左翼思想を吹き込まれた連中が義務も果たさずに
ウリ達は無理矢理連れて来られて強制労働させられているニダ、などと権利ばかり主張しています。
あとは残業代を要求して裁判を起こしてるような腐った輩を社会全体で徹底的に叩くことでしょう。
0889デフォルトの名無しさん
2009/09/29(火) 04:19:150890デフォルトの名無しさん
2009/09/29(火) 22:54:090891デフォルトの名無しさん
2009/09/29(火) 23:21:280892デフォルトの名無しさん
2009/09/30(水) 01:02:380893デフォルトの名無しさん
2009/10/01(木) 17:46:230894デフォルトの名無しさん
2009/10/01(木) 18:13:220895デフォルトの名無しさん
2009/10/01(木) 18:20:38uIPのUDPサポートが半端だからあれやこれや5種類くらいのスタックを参考にして自前で作ってるわ。
純組込系のスタックは金になるから公開しないのかなぁ。
0896デフォルトの名無しさん
2009/10/02(金) 05:38:11金払いたくない乞食はリナックスやバークレー辺りから適当にパクってくればいい訳で。その程度で困らないだろうし。
0897デフォルトの名無しさん
2009/10/02(金) 11:55:160898デフォルトの名無しさん
2009/10/02(金) 14:59:55> 純組込系のスタックは金になるから公開しないのかなぁ。
BSD のスタック移植することが多いかな
CPU の規模によっては、大昔 MIT が IBM PC に実装やつをモディファイ
して使ってる
0899デフォルトの名無しさん
2009/10/06(火) 22:23:220900デフォルトの名無しさん
2009/10/06(火) 22:43:080901デフォルトの名無しさん
2009/10/06(火) 22:57:060902デフォルトの名無しさん
2009/10/06(火) 23:48:30やめておくわ
0903デフォルトの名無しさん
2009/10/07(水) 00:25:580904デフォルトの名無しさん
2009/10/07(水) 11:17:020905デフォルトの名無しさん
2009/10/07(水) 11:24:05マイコンプログラミングと電子回路始めたら全然すごくないことが
わかった。
0906デフォルトの名無しさん
2009/10/07(水) 14:20:19ケーブルを流れてる定常波から信号を取り出してるのはすごいと思うけどね
promisc自体はたいしたことやってない
ただのbitパターンマッチの繰り返し
0907デフォルトの名無しさん
2009/10/07(水) 14:39:35selectはヘヴィーロードサーバで、
bitmask処理がオーバーヘッドになる。
>>6辺りからそれを報告した論文を辿れる。
0908デフォルトの名無しさん
2009/10/07(水) 20:57:330909デフォルトの名無しさん
2009/10/07(水) 22:02:58wiresharkにほぼそっくり開発チーム移ったよね。
0910デフォルトの名無しさん
2009/10/07(水) 23:28:220911デフォルトの名無しさん
2009/10/08(木) 04:38:27> ケーブルを流れてる定常波から信号を取り出してる
何が言いたいのか意味不明
0912デフォルトの名無しさん
2009/10/08(木) 08:50:170913デフォルトの名無しさん
2009/10/08(木) 09:01:17ただの知ったか君だろ
0914デフォルトの名無しさん
2009/10/08(木) 18:03:490915デフォルトの名無しさん
2009/10/08(木) 22:23:530916デフォルトの名無しさん
2009/10/09(金) 00:13:15TCP/IPで通信するWindowsプログラムでWinSockの
WSAEventSelect(sock,WM_USER,FD_CLOSE);を使用しています。
このプログラムの接続が確立している状態で物理的にLANを抜くと、
OSがWindows XP・Windows Server 2003の場合WM_USERメッセージが発生し
LPALAMにはWSAのエラーコードが格納されていました。
しかし、同様のことをWindows Vista・Windows Server 2008で行った場合
WM_USERメッセージが発生しなくなりました。
なにか要因わかりますでしょうか?
0917デフォルトの名無しさん
2009/10/09(金) 00:17:47(ダイアルアップだかの兼ね合いだったと思う)
NT系もwin2000からそうなった気がするが
もしかしてVista/2008からまた昔のに戻ったのかな
あとWM_USERつかうのはやめれ
WM_APPつかえ
0918デフォルトの名無しさん
2009/10/09(金) 10:21:32ケーブルが抜けただけでは切断しない場合もある。
イベントがでなかったのか接続が切断されていないのかを確認するべし。
0919デフォルトの名無しさん
2009/10/09(金) 10:24:040920デフォルトの名無しさん
2009/10/09(金) 10:44:09XP・2003ではnetstatで接続が消えイベントが発生したのですがVistaでは接続が残ったままとなっています。
Vista以降ウィンドウメッセージのセキュリティが強化されたのが要因かと思っていたんですがnetstafをみると接続を残すのが本来の姿で元に戻した?
現状OSの設定でどうにかならないかとリサーチ中です
0921デフォルトの名無しさん
2009/10/09(金) 10:57:07だから元々の設計思想である>>919に統一方向だろう。
そもそも余計な事するなよ、MSと思っていた人が多かった。> INETの人たち
通知するのはいいけど、切断はやりすぎだろと。バカかと。
0922デフォルトの名無しさん
2009/10/09(金) 10:57:39その先のルータを越えたところのケーブルが抜けたか
どうかなんてわからないんだから、そのPCのケーブルが
抜けたかどうかなんてわかっても意味がないんだよな
0923デフォルトの名無しさん
2009/10/09(金) 11:18:00ケーブル抜けても、WIFi繋がってればそっちで通信続ければいいわけだし。
0924デフォルトの名無しさん
2009/10/09(金) 11:31:300925デフォルトの名無しさん
2009/10/09(金) 11:32:570926デフォルトの名無しさん
2009/10/09(金) 11:37:42いずれにせよ、ケーブルが抜けた、アンテナロストした、
どうやら経路がなくなっているようだ(ICMPなど)、
そういうのを対処するのは基本はOSとデスクトップの仕事で、
アプリが対処すべき場合は希少。
接続切るなんて言語道断。
0927デフォルトの名無しさん
2009/10/09(金) 12:27:15おかしくは無いが、ソケットレイヤーでやるのは間違い。
0928デフォルトの名無しさん
2009/10/09(金) 12:30:11自分の階層以外のことに口出しすんな
ってことですかな?
0929デフォルトの名無しさん
2009/10/09(金) 12:38:57必要ならこの階層を使えばいい。
この階層にアクセスするAPIの存在は知らないが。
0930デフォルトの名無しさん
2009/10/09(金) 12:48:54そんなかんじ
0931デフォルトの名無しさん
2009/10/09(金) 16:34:18擬似コードを以下に。
// フレームワーク側で、recvイベントが発生した際に呼ばれる関数。
// 受信したデータがbufにバッファリングされてる
void F(buffer &buf){
if(buf.size()==0) return;
// TLV形式で、Typeを取ってくる
switch(buf[0]){
case MAP_DATA:
if(buf.size()<5) return;
size_t len = *(size_t*)(&buf[1]);
// TLを読み込んだ時点で、読み込んだサイズ分、bufからpopする
buf.pop(5);
// (*ここで質問)データを処理する
// len分データが届いていなかったら、届いてる分だけ処理してreturnする
}
こういうコードの場合、len分データが届いてなかったらreturnして、またFが呼ばれるのを待つんだけど、
次にFが呼ばれた場合、TLの解析は飛ばして、(*ここで質問)から処理を再開させたい
んだけど、coroutineとかステートパターンみたいなことを駆使しなきゃダメなの?
それとももっと別の"データを処理するためのコーディング方法/パラダイム"みたいなものがあるの?
0932デフォルトの名無しさん
2009/10/09(金) 16:56:05動けばいいの。動けば。
0933デフォルトの名無しさん
2009/10/09(金) 17:28:24自前でステート管理のコードを書くかわりに自動生成したコードに管理してもらう
あとは構文とアクションを書くだけ
ただしパーサジェネレータを作るのが面倒いかもしれない
0934デフォルトの名無しさん
2009/10/09(金) 17:29:09俺はStateパターンというか、状態変数持たせてる。
0935デフォルトの名無しさん
2009/10/09(金) 20:04:33recvで変数に入りきらずあまった分のデータって2度目のrecvで受け取れないの??
0936デフォルトの名無しさん
2009/10/09(金) 20:09:00UDPなら受け取れない
0937デフォルトの名無しさん
2009/10/09(金) 20:10:510938デフォルトの名無しさん
2009/10/09(金) 22:41:28自分も>>934と同様に、状態変数で管理してたよ。
・Type待ち
--> 初期状態
・Length待ち
--> 1byte固定なら1個、2byte固定なら2個、可変長ならN個の状態
・Value処理中
--> 受信カウンタを併用(初期値は0, Lengthになれば終了)
実装はインスタンス生成時に受信バッファを渡し、後はgetで取得するイテレータになる。
>>933
(Valueが更にTLVとして定義される)階層的なTLV構造で、それが再帰的である、
または複雑な構造(構文)を持つなら、yaccを使うのは良いアイデアかもしれない。
その場合、前記のイテレータをスキャナ(字句解析)として位置付け、
Typeをトークン(字句)として返すよう実装することになる。
yacc以外だと、precssというコードジェネレータを使うのが良いかもしれない。
0939デフォルトの名無しさん
2009/10/09(金) 23:27:21必要があるか」というのと、その「読んだバイト列から
パケット長を得る callback」をパラメータにした受信
部を作った。
内部的には皆が言っている「状態」を持っていて、使う
側からのインタフェイスは recv や recvfrom に管理情
報の引数が一つ増える感じ。
0940デフォルトの名無しさん
2009/10/09(金) 23:56:070941デフォルトの名無しさん
2009/10/10(土) 01:55:16accept関数で10014のエラーが出てしまいます。
エラー番号の意味は、
呼び出しでポインタ引数を使用するときに、無効なポインタ アドレスを検出しました。
らしいのですが、acceptの引数については今まで普通に動いてきたソースのコピペなので
正直なにが悪いのかよく分かりません。どなたか、原因を教えていただけないでしょうか?
http://www.dotup.org/uploda/www.dotup.org241369.cpp.html
0942デフォルトの名無しさん
2009/10/10(土) 02:02:14ってこともまれにある。
ぱっとみ、acceptの代参引数をsizeof( struct sockaddr_in )で初期化してねーだろ
0943デフォルトの名無しさん
2009/10/10(土) 02:04:20len = sizeof(client);
をコピペミスしてました。
0944デフォルトの名無しさん
2009/10/10(土) 02:07:42ありがとうございます。
まさにその部分が原因でした。
コピペ元も初期化してなかったのですが、そっちでは何故かうまく動いてましたw
これで1時間くらい悩んでたのですが、書き込んだ直後に解決しました。
スレ汚しすみません。
0945938
2009/10/10(土) 02:10:51yaccとか難しすぎて俺には無理です。
みんな状態持たせて大変なことやってるんすね
>>938の
>実装はインスタンス生成時に受信バッファを渡し、後はgetで取得するイテレータになる。
「イテレータになる」ってあたりがどういうコードになるのかイメージできません
buffer::iterator iter;
while(true){
iter = buf.begin(); //TLVの解析はbufferクラスの中に閉じ込める
if(iter==buf.end()) break;
// 処理。bufクラスのクライアントはiterから取得するだけ。
}
こんな感じ?
0946931
2009/10/10(土) 02:12:200947938
2009/10/10(土) 05:31:28>yaccとか難しすぎて俺には無理です。
yaccについては、>>938で書いたのは単なる思いつきだから、スルーでオケー。
ただ、preccsは面白いと思う。一読を薦めるヨ。自分も実際には触った事ないけどネ。
>こんな感じ?
だいたい、そんな感じ(w
ただ、C++のテンプレートは使用せず、一般的なTLVReaderクラスを定義していた。
イテレータという言葉は(>>938のカキコ内では)デザインパターン用語のつもりで書いた。
疑似コードで書くと、こんな感じ。(実際にはC言語で(GTKみたいな)疑似クラスで実装していた)
unsigned char *recv_buf;
TLVReader reader;
reader = TLVReader.new(recv_buf);
while (tlv = reader.get()) {
switch (tlv.type) {
case TYPE_XXX_PDU:
: // Type別の処理
}
}
階層的なTLV構造の場合には、Type別処理の中で、更に別のTLVReaderインスタンスを生成する。
xxx_reader = TLVReader.new(tlv.value)
while (xxx_tlv = xxx_reader.get()) {
switch (xxx_tlv.type) {
: // Sub Typeの処理
}
}
0948デフォルトの名無しさん
2009/10/10(土) 06:05:50メンバ関数へのポインタをメンバに持って
状態が遷移したら、returnする前に次の処理をするメンバ関数を設定するんだ。
いや、可読性を無視するなら、ね。
0949デフォルトの名無しさん
2009/10/10(土) 08:36:40I/Oイベントドリブンが前提って書いてあるだろ。
0950938
2009/10/10(土) 09:59:42あるいは、メッセージが未完成の場合にはget操作内でプロセス(or スレッド)がブロックされる、
言い換えると同期I/Oを前提にしている、という前提がある。
だから、そもそもの質問>>931(未完成時の再開方法)に対するレスとしては不適切だった。
質問の意図に沿って「非同期I/Oを前提(だよね?)」とした場合、最も外側のTLV構造の処理は、
ステートマシン(状態管理処理)と一体になる。疑似コードだと、こんな感じ。
(続く)
0951938
2009/10/10(土) 10:01:02RecvAcceptorState state = STATE_WAIT_TYPE; // 初期状態はType待ち
void recv_acceptor() // recvイベント発生に呼ばれるコールバック関数
{
while (buf.size() > 0) {
byte = buf.pop(1)
switch (state) {
case STATE_WAIT_TYPE: // Type待ち状態
tlv.type = byte; // Type値が決定
state = STATE_WAIT_LEGTH; // 次の状態(Length待ち)へ遷移
break;
case STATE_WAIT_LENGTH: // Length待ち状態
tlv.length = byte; // Length値が決定(Lengthフィールドが1byte固定である事を仮定)
value_counter = tlv.length; // 受信カウンタをLength値で初期化
state = STATE_PROCESS_VALUE; // 次の状態(Value処理中)へ遷移
break;
case STATE_PROCESS_VALUE: // Value処理中状態
:
if (メッセージ組立て完了) {
: // 受信メッセージ処理のアクションを起動する
: // もし階層的なTLV構造であれば、>>947のメッセージ解析処理を呼ぶ
state = STATE_WAIT_TYPE; // 初期状態へ遷移(必要であれば他の再初期化処理も)
}
:
break;
}
}
}
(更に続く)
0952938
2009/10/10(土) 10:01:59>>931の場合、Lengthとして4byte固定を想定しているみたいだから、
上記の疑似コードに対して、Length待ち状態をSTATE_WAIT_LENGTH1..._LENGTH4に分割するか、
あるいはLength受信カウンタを追加する、といった改造を加える必要があるから、注意してね。
他にも、pop値は1byte固定になってるけど、Value処理中状態ではNbyteに高速化すべきだろうし。
0953デフォルトの名無しさん
2009/10/10(土) 12:50:43yacc 使えばいいんじゃね?
作らなきゃいけないのは、レキシカルアナライザ部分だ。
0954デフォルトの名無しさん
2009/10/10(土) 13:14:500955デフォルトの名無しさん
2009/10/10(土) 14:25:34一度書いたらいろんなプロジェクトで使いまわしできるもんだし。
0956デフォルトの名無しさん
2009/10/10(土) 14:29:250957デフォルトの名無しさん
2009/10/10(土) 16:27:51イベント駆動TLVデコーダの話なんじゃないの?
0958938
2009/10/10(土) 23:16:02# スレの流れが錯綜しそうなので、強引にマトメてみる。
最も外側のTLV構造のデコード処理は(>>950-952に書いた)イベント駆動方式(PUSH型)で実現できる。
この部分は比較的に単純なステートマシンだから、わざわざyaccみたいなコードジェネレータを
持ち出す必要性は(個人的には)感じられない(>>957)。
検討課題になるのは、メッセージを組立てた後に、階層的なTLV構造の内側をデコードする
(>>938の)プロセス駆動(PULL型)処理だと思う。
TLV方式は拡張性があるから、必要に応じていくらでも要素を追加できる。
しかも、それに対応するコードは(>>938で書いたような)単純なイテレータで実現できるから、
コピペでコーディングできる。>>955の言葉を借りれば、プロジェクト間で使いまわしができる。
とはいっても単調なコーディング作業の連続だから、(>>948の言う)関数ポインタを活用したり、
あるいはテーブル駆動なコーディング様式を検討したくなるのは、自然な発想だと思う。
そして、それを追求するとTLVデコード処理に特化した俺様言語(DSL)が欲しくなるのも自然な成り行き。
で、DSL(Domain Specific Language)を定義して、その言語処理系(コードジェネレータ)を
開発してみては?という提案が、>>933になる。それに対して、新たにメタ言語を定義して
処理系を開発するのは面倒だから、既に存在しているyaccで(メタ言語を)代用できるんじゃね?
ってのが、>>953の提案。ここでのTLVデコード処理はプロセス駆動方式(PULL型)だから
yaccとの相性は良いかもしれない(>>954)。容易に実現可能である、とまで断定はできないけどね。
(続く)
0959938
2009/10/10(土) 23:20:31最後に、>>956の意図をエスパーしてみたら、通信プロトコル(の状態遷移)そのものをDSLあるいは
yaccで記述できないのか?に読めた。もしそうなら、UNIX板の「yacc & lex」スレ内にある
レス#112-120で議論されていたから、まずそちらを参照してみて。
# 最後に訂正。>>958内にあるアンカ>>938は誤り。>>947が正しい。
0960デフォルトの名無しさん
2009/10/11(日) 00:45:27イベント駆動だから、yaccで直接書こうとすると、
yyparseをコルーチン化する必要があるぞ。
しかも不完全パケットを受けた状態を
それぞれ非終端記号にする必要がある。
ある程度はまとめられるとしてもね。
>>931のF()は一旦意味のある単位にまとめるのに集中して、
その結果をparseする別のコルーチンに渡すやり方なら簡単だけど。
0961デフォルトの名無しさん
2009/10/11(日) 08:29:230962デフォルトの名無しさん
2009/10/11(日) 10:12:13解釈勝手すぎくね?全部主観じゃね?うざくね?
0963931
2009/10/11(日) 10:20:40push/pullの概念がわかりません
>>960
コルーチンの方が楽っすかね?
とりあえず、>>951みたいな形で
stateとcounterを持たせる方法で書き始めました
>>962
何もしなくて、批判文句垂れる奴がうざいとおもますぅ><
0964デフォルトの名無しさん
2009/10/11(日) 11:44:08使うフレームワークが固定でそういうわけにもいかないんでしょう
0965938
2009/10/11(日) 11:45:06yaccとイベント駆動の組み合わせで生まれる問題(push/pull不整合)については、
>>961が1行レスでマトメてくれたので、これ以上はツッこまない。ただ、2点だけ補足。
・イベント駆動問題の解決方法はコルーチンだけではない。UNIX板で紹介したWebアプリの場合、
(コルーチンを使わずに)別の方法を使ってI/Oライブラリ(yylex()関数)内で吸収させている。
・イベント駆動問題はI/Oライブラリで吸収できる程度の問題だけど、他にも(ライブラリでは
吸収できない)本質的な問題(制約)が存在する。具体的な内容は省略。
>>963
push/pullやコルーチンなどの話題は、yaccとイベント駆動を組み合わせた場合に限定できるから、
元の質問(>>931)に関しては無視して進めればいいと思うよ。(これも個人的な主観かもしれんが)
0966デフォルトの名無しさん
2009/10/11(日) 11:50:38フレームワーク(他にもデザインパターンなど)という言葉の幻想(固定観念)に囚われることなかれ
0967デフォルトの名無しさん
2009/10/11(日) 12:09:34> // フレームワーク側で、recvイベントが発生した際に呼ばれる関数。
このフレームワークを変更可能であると想定していいのかね。
0968931
2009/10/11(日) 12:34:35一応このフレームワークを使おうって流れ(チームで)なんで変更できなさそうです。
フレームワーク側は、
bonblockingソケットを使っていて、EAGAINを帰すまで読み込んだ後、コールバック呼ぶっぽいです
0969デフォルトの名無しさん
2009/10/11(日) 19:50:570970デフォルトの名無しさん
2009/10/11(日) 19:52:000971デフォルトの名無しさん
2009/10/11(日) 19:54:130972デフォルトの名無しさん
2009/10/11(日) 21:53:200973デフォルトの名無しさん
2009/10/11(日) 22:58:400974デフォルトの名無しさん
2009/10/11(日) 23:04:430975デフォルトの名無しさん
2009/10/12(月) 11:51:39ジュールもブロックされそうだな
0976デフォルトの名無しさん
2009/10/12(月) 12:01:450977デフォルトの名無しさん
2009/10/12(月) 12:23:450978デフォルトの名無しさん
2009/10/12(月) 14:14:55そろそろ産め。
0979デフォルトの名無しさん
2009/10/12(月) 15:20:590980デフォルトの名無しさん
2009/10/12(月) 17:50:53ゲームつくるときに、たとえば12345番のポートでお互いUDPで
送受信するとします。
きっとそれはうまくいくんでしょうけど、そもそもだれか別アプリが
わざとこの12345にゴミパケット投げたりしたらどうなるんでしょう。
ゲーム側でいろいろチェックしとかないといけないってことで
いいんでしょうか。
0981デフォルトの名無しさん
2009/10/12(月) 18:09:00基本的にはそのとおり。
0982デフォルトの名無しさん
2009/10/12(月) 18:10:53そういうこと
Webプログラミングと似たような感じで、基本は送られて来たデータを信用しない
0983デフォルトの名無しさん
2009/10/12(月) 18:36:29>>982
どもです。
遅いのを気にしないならTCPにしとけばよいんでしょうか。
仮に10人でできるゲームだとして、他の全部のマシンとコネクション
はるってのは、なにも送受信してなければメモリもCPUも大した負荷
じゃないんでしょうか。
でも座標いっぱい送りあうなら、あんまりTCP向いてないんですよね?
多人数なアクション作るんだったら、基本TCPはホストになった
マシンとだけはっておいて、あとはUDP1こあけておき、
座標とかどうでもいいものはUDPで、ホスト経由せず全員になげて、
重要なものはTCPでホスト経由でほかのクライアントに通知、とか
でしょうか。
0984デフォルトの名無しさん
2009/10/12(月) 18:41:56悪意のあるクライアントが不正なデータを送りつけてサーバをダウンさせたり乗っ取ろうとするかもしれないし
0985デフォルトの名無しさん
2009/10/12(月) 19:00:03数十ならTCPでも余裕。
ただ、クライアント/サーバ構成にした方がいいと思うけど。
クライアントはサーバとだけ通信すればいいんで。
0986デフォルトの名無しさん
2009/10/12(月) 20:17:01チェックていっても、まあマジックナンバーつけるとかチェックサムとか
値のレンジチェックくらいしか思いつかないがおk?
>>985
そういうもんなんですね。
なんか気を使ってサーバーに負担をかけないようにとか考えて
ちょくせつクライアント同士でとかおもったけど、
そこまで気にしなくていいってことでしょうか。
0987デフォルトの名無しさん
2009/10/12(月) 21:05:19マジックナンバーつけて暗号化して、
複合化してマジックナンバーチェックすれば
中間者攻撃でも無い限り大丈夫と思われ。
0988デフォルトの名無しさん
2009/10/12(月) 23:58:12ダミーデーター送りつけたりするひとはいるね
だからマジックナンバーとかチェックサムとか値のレンジチェックは必要
0989デフォルトの名無しさん
2009/10/13(火) 08:46:28recvfromすればいい。
0990デフォルトの名無しさん
2009/10/13(火) 08:52:29制御しなかったらの話だけど
再送やソートの有無や優先度をパケット単位で指定出来る疑似TCPを
UDPで実装しようと前から思ってるんだが難しい・・・
そういうフリーのライブラリ無いのかねぇ
DirectPlayはそんな感じだったが、今じゃサポート外だしバグもあるらしいし・・・
0991デフォルトの名無しさん
2009/10/13(火) 09:06:00それならTCP使えばいいじゃんって思うけど、なぜUDPにこだわる?
0992デフォルトの名無しさん
2009/10/13(火) 09:22:17>>980
connectすればいいんじゃね?
0993デフォルトの名無しさん
2009/10/13(火) 09:43:510994デフォルトの名無しさん
2009/10/13(火) 10:31:46そりは再送が必要ないデータと必要なデータとで、UDPとTCPを使い分けるか組み合わせればいいんでそ。
NBT(NetBIOS over TCP/IP)だと、アドレス解決にはUDPが、データ転送にはTCPが使用されているし、
逆に、RTSPみたいなストリーミングでは、データ転送にはUDPが、その制御にはTCPが使用されている。
それを、わざわざUDPだけで苦労して実装する価値があるのかが疑問なんだが。
0995デフォルトの名無しさん
2009/10/14(水) 00:36:58・TCPの再送が邪魔になる
これらのケース以外は迷わずTCP使ってるな。
0996デフォルトの名無しさん
2009/10/14(水) 02:48:10それらの中間の特性を持つプロトコルを
UDP上に実装したくなるというのは分からないでもない。
たとえば、粒度の小さいトランザクションが大量に発生する
大規模分散アプリケーションでは、転送の信頼性が要求される一方で、
コネクションのオーバヘッド(時間/リソース)が無視できなくなる。
0997デフォルトの名無しさん
2009/10/14(水) 03:32:170998デフォルトの名無しさん
2009/10/14(水) 03:33:150999デフォルトの名無しさん
2009/10/14(水) 03:34:391000デフォルトの名無しさん
2009/10/14(水) 03:46:48http://pc12.2ch.net/test/read.cgi/tech/1255459388/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。