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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/03/23(火) 20:31:49
主にソケットに関しての質疑応答スレッドです。

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

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

前スレ
ネットワークプログラミング相談室 Port25
http://pc12.2ch.net/test/read.cgi/tech/1255459388/
関連スレ
ネットワークプログラミング雑談
http://pc12.2ch.net/test/read.cgi/tech/1235800707/
Java ネットワークプログラミング 【教えて!】
http://pc12.2ch.net/test/read.cgi/tech/1086238859/
0002デフォルトの名無しさん2010/03/23(火) 20:32:30
過去スレ:
Port25 ttp://pc12.2ch.net/test/read.cgi/tech/1255459388/
Port24 ttp://pc12.2ch.net/test/read.cgi/tech/1246895188/
Port23 ttp://pc12.2ch.net/test/read.cgi/tech/1230466044/
Port22 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 http://pc5.2ch.net/tech/kako/1052/10521/1052106444.html
Port5 http://pc2.2ch.net/tech/kako/1040/10402/1040220302.html
Port4 http://pc3.2ch.net/tech/kako/1034/10342/1034236536.html
Port3 http://pc3.2ch.net/tech/kako/1023/10233/1023359282.html
Port2 http://pc.2ch.net/tech/kako/1006/10062/1006258198.html
Port1 http://pc.2ch.net/tech/kako/970/970344582.html
0003デフォルトの名無しさん2010/03/23(火) 20:33:15
図書コーナー:
UNIXネットワークプログラミング〈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/
0004デフォルトの名無しさん2010/03/23(火) 20:34:04
マスタリングTCP/IP RTP編
 http://www.amazon.co.jp/exec/obidos/ASIN/4274065618/
Linuxソケットプログラミング?ネットワークプログラミングにおける実践技法
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714671/
Webプロトコル詳解?HTTP/1.1、Webキャッシング、トラフィック特性分析
 http://www.amazon.co.jp/exec/obidos/ASIN/4894715414/
WinSock2.0プログラミング
 http://www.amazon.co.jp/exec/obidos/ASIN/4797306882/
猫でもわかるネットワークプログラミング
 http://www.amazon.co.jp/exec/obidos/ASIN/4797323604/
IPv6ネットワークプログラミング
 http://www.amazon.co.jp/exec/obidos/ASIN/4756142362/
Visual Basicではじめるネットワークプログラミング超入門
 http://www.amazon.co.jp/exec/obidos/ASIN/4839917523/
0005デフォルトの名無しさん2010/03/23(火) 20:34:44
URL抜粋:
★規格
RFC 日本語版リスト
 http://www5d.biglobe.ne.jp/~stssk/rfcjlist.html
JPNIC RFC関連リンク集
 http://rfc-jp.nic.ad.jp/link/
RFC Editor
 http://www.rfc-editor.org/
HTMLなRFC (セクションを直に示すのに便利)
 http://www.freesoft.org/CIE/RFC/
RFC 2616 "Hypertext Transfer Protocol -- HTTP/1.1" 日本語訳
 http://www.studyinghttp.net/cgi-bin/rfc.cgi?2616
IANA Well known port numbers
 http://www.iana.org/assignments/port-numbers
0006デフォルトの名無しさん2010/03/23(火) 20:36:22
★プログラミング
C10K ヘヴィーロードサーバ
 http://www.kegel.com/c10k.html
C10K ヘヴィーロードサーバ(日本語訳)
http://www.hyuki.com/yukiwiki/wiki.cgi?TheC10kProblem
MSDN
 http://msdn.microsoft.com/library/en-us/dnsitehelp/html/tochelp.asp
Raw IP Networking FAQ
 http://www.whitefang.com/rin/
Java で packet capture
 http://netresearch.ics.uci.edu/kfujii/jpcap/doc/
Randomness Recommendations for Security
 http://www.faqs.org/rfcs/rfc1750.html
BoostSocket
 http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?BoostSocket
The Code Project - Internet & Network programming
 http://www.codeproject.com/internet/
ネットワークプログラミングの基礎知識 (問題ありのサイト?)
 http://X68000.q-e-d.net/~68user/net/
0007デフォルトの名無しさん2010/03/23(火) 20:42:11
★ツール類
ethereal - http://www.ethereal.com/
Wireshark - http://www.wireshark.org/
tcpdump - http://www.tcpdump.org/
Windump - http://netgroup-serv.polito.it/netgroup/tools.html
WinPcap - http://www.winpcap.org/
pathchar - ftp://ftp.ee.lbl.gov/pathchar/
pchar - http://www.employees.org/~bmah/Software/pchar/
Packetyzer - http://www.networkchemistry.com/products/packetyzer/
libevent - http://www.monkey.org/~provos/libevent/

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

★IP, TCP実装
http://www.iti.fi/documentation/miniip.html
http://www.sics.se/~adam/uip/
http://www.codeguru.com/Cpp/I-N/network/tcpip/article.php/c5447/
http://www.geocities.jp/bruce_teller/security/garakuta.htm
0008デフォルトの名無しさん2010/03/23(火) 21:41:10
リンク切れぐらいは消せよ
0009デフォルトの名無しさん2010/03/23(火) 22:18:42
文句言うならお前が立てるか前スレで指摘しとけクソ野郎
0010デフォルトの名無しさん2010/03/23(火) 22:28:13
コピペしか出来ないコーダーは立てるなよ
0011デフォルトの名無しさん2010/03/23(火) 22:35:35
なら立てる前にちゃんと立てろ役立たず
0012デフォルトの名無しさん2010/03/23(火) 23:05:28
とりあえず>>1乙
0013デフォルトの名無しさん2010/03/24(水) 00:08:28
まずはプログラムやる前にtcp/ipの本読もうぜって感じだな。
0014デフォルトの名無しさん2010/03/24(水) 01:06:06
残り3レスしか無かったし、次スレ誘導くらいはしたかったから
いちいちリンク確認してる暇なかったんだわ
次スレではよろしく
0015デフォルトの名無しさん2010/03/24(水) 03:04:43
/   //   /   //    ______     /   //   /
 / //   /|   r'7\ ,.ヘ‐'"´iヾ、/\ニ''ー- 、.,   /    /
  /   / |  |::|ァ'⌒',ヽ:::ヽrヘ_,,.!-‐-'、二7-ァ'´|、__
`'ー-‐''"   ヽ、_'´  `| |:::::|'"       二.,_> ,.へ_
         /  //__// / / /      `ヽ7::/
 か っ も  |  / // メ,/_,,. /./ /|   i   Y   //
 ァ  て う.  |'´/ ∠. -‐'ァ'"´'`iヽ.// メ、,_ハ  ,  |〉
  |  約 ク  ヽ! O .|/。〈ハ、 rリ '´   ,ァ=;、`| ,ハ |、  /
  |  束 ソ   >  o  ゜,,´ ̄   .  ト i 〉.レ'i iヽ|ヽ、.,____
  |  し  ス  /   ハ | u   ,.--- 、  `' ゜o O/、.,___,,..-‐'"´
  |  た  レ  |  /  ハ,   /    〉 "从  ヽ!  /
  |  じ  は  |,.イ,.!-‐'-'、,ヘ. !、_   _,/ ,.イヘ. `  ヽ.
 ッ .ゃ .立   |/     ヽ!7>rァ''7´| / ',  〉`ヽ〉
 ! ! な  て   .',      `Y_,/、レ'ヘ/レ'  レ'
   い  .な    ヽ、_     !:::::ハiヽ.   //   /
   で   い   ./‐r'、.,_,.イ\/_」ヽ ',       /  /
   す      /    `/:::::::/ /,」:::iン、 /    /
          〈  ,,..-‐''"´ ̄ ̄77ー--、_\.,__  /
      ,.:'⌒ヽ ´         | |  , i |ノ   `ヾr-、
0016デフォルトの名無しさん2010/03/25(木) 03:32:11
これら俺のとこからリンク駄目だな。繋がるか?
★プログラミング
MSDN
 http://msdn.microsoft.com/library/en-us/dnsitehelp/html/tochelp.asp
Raw IP Networking FAQ
 http://www.whitefang.com/rin/
The Code Project - Internet & Network programming
 http://www.codeproject.com/internet/

★ツール類
Windump - http://netgroup-serv.polito.it/netgroup/tools.html
pchar - http://www.employees.org/~bmah/Software/pchar/
Packetyzer - http://www.networkchemistry.com/products/packetyzer/

★IP, TCP実装
http://www.iti.fi/documentation/miniip.html
http://www.sics.se/~adam/uip/
http://www.geocities.jp/bruce_teller/security/garakuta.htm
0017デフォルトの名無しさん2010/03/25(木) 03:58:19
http://www.sics.se/~adam/uip/
これはだいじょうぶ
0018デフォルトの名無しさん2010/03/27(土) 20:09:29
>>3の一番上の本だけじゃプログラムでの簡単なファイアウォールの作成はきついですか?
0019デフォルトの名無しさん2010/03/27(土) 20:28:02
そんな質問してる人には無理
0020デフォルトの名無しさん2010/03/27(土) 20:32:16
簡単だよ
http://ruffnex.oc.to/kenji/text/fire_a/
0021デフォルトの名無しさん2010/03/27(土) 20:51:40
>>19
個人の技術力うんぬんでなくその本でファイアウォールを作るだけの知識が
つくか聞いたんだす。
>>20
windows持ってないんです。。

どうやら上記の本だけでは無理っぽいですね。
パケット単位での取扱いはAPIじゃ難しいと某巨大掲示板に書いてありました。
とりあえずサーバをプログラムで作って、その後、勉強しようと思います。
0022デフォルトの名無しさん2010/03/28(日) 00:18:00
WSAAsyncSelectでイベント型のクライアント作ってるんだが
接続時のタイムアウトはどうやればいいの?
ioctlsocket + selectだとタイムアウトするまでメッセージ処理が止まっちゃうし
0023デフォルトの名無しさん2010/03/28(日) 02:28:42
ネットワーク以前に、もうちょっとプログラミングスキル高めたほうがいいよ。無茶過ぎる。

http://pc12.2ch.net/test/read.cgi/tech/1263738929/
VB.NET質問スレ(Part33)
http://pc12.2ch.net/test/read.cgi/tech/1267775473/
【初心者歓迎】C/C++室 Ver.72【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1269517734/
C言語なら俺に聞け(入門編)Part 62
http://pc12.2ch.net/test/read.cgi/tech/1269438098/
C/C++の宿題片付けます 135代目
http://pc12.2ch.net/test/read.cgi/tech/1268699491/
スレ立てるまでもない質問はここで 105匹目
0024デフォルトの名無しさん2010/04/02(金) 17:59:11
Linuxで、/proc/fdの下見るとソケット一覧が見られるけど
ここにちょっかいを出してネットワークを切断したいと思います。
いい方法はありますか?
0025デフォルトの名無しさん2010/04/03(土) 14:26:27
関係ないけど sudo rm -rf /proc/fd とかやるとどうなるのかな?
0026デフォルトの名無しさん2010/04/04(日) 04:20:30
>>24
ソケットの場合は/proc/<pid>/fdは単にsocket[<inode番号>]
という文字列を含むシンボリックリンクであり、参照的な機能しか
無いようだ。 

ls -l /proc/21853/fd
total 0
lrwx------ 1 root root 64 Apr 3 15:14 0 -> /dev/pts/16
lrwx------ 1 root root 64 Apr 3 15:14 1 -> /dev/pts/16
lrwx------ 1 root root 64 Apr 3 15:14 2 -> /dev/pts/16
lrwx------ 1 root root 64 Apr 3 15:14 3 -> socket:[27284825]
# file /proc/21853/fd/3
/proc/21853/fd/3: broken symbolic link to `socket:[27284825]'
# whoami
root
# rm -f /proc/21853/fd/3
rm: cannot remove `/proc/21853/fd/3': Operation not permitted
0027デフォルトの名無しさん2010/04/07(水) 00:13:12
マスタリングTCP/IP RTP編
 http://www.amazon.co.jp/exec/obidos/ASIN/4274065618/

って入門編読んだぐらいの知識でも理解できそうですか?
0028デフォルトの名無しさん2010/04/07(水) 00:15:08
↑マスタリングTCP/IP 入門編の事です
0029デフォルトの名無しさん2010/04/07(水) 00:28:28
お前が理解できるかなんて、誰がわかるってんだよ
0030デフォルトの名無しさん2010/04/07(水) 00:41:28
切れすぎワロタw
0031デフォルトの名無しさん2010/04/07(水) 01:51:36
RecallToyotaProtocol
0032デフォルトの名無しさん2010/04/07(水) 02:55:21
最後はPriusだろ
0033デフォルトの名無しさん2010/04/08(木) 22:07:13
APIスレでスルーされたのでこっちに貼ります
リモートのIPアドレスからコンピューター名を得る方法ありますか?
自分も相手もWindows(XP以降)です
正しくはコンピューター名じゃなくてUNC名ですが
0034デフォルトの名無しさん2010/04/08(木) 22:19:34
2時間でスルーとかどんだけ自分勝手なんだって話だと思うが。
0035デフォルトの名無しさん2010/04/08(木) 22:44:23
ってかこのスレ全然建設的じゃないな。
教える気がないんだったら煽ってないで黙ってろよ。
0036デフォルトの名無しさん2010/04/08(木) 22:44:45
うるせえ
0037デフォルトの名無しさん2010/04/08(木) 23:14:21
ある。でも聞き方が気に入らないから取り方は教えない。
0038デフォルトの名無しさん2010/04/08(木) 23:21:38
お前にきいてねえよ。
他の奴、答えろ。
0039デフォルトの名無しさん2010/04/08(木) 23:23:13
ある。でも聞き方が気に入らないから、オレも取り方は教えない。
0040デフォルトの名無しさん2010/04/08(木) 23:23:42
やったことないけどWMIは使えないだろうか
0041デフォルトの名無しさん2010/04/09(金) 23:04:31
サーバで、100クライアントからの要求を 100ms 毎に 1回受信
(1クライアントは 10sec 毎に1回要求送信)
し、DB検索後、応答を最大 100ms 内に返す時の、サーバーの
I/O 戦略 (下記 url 参照) は、一般的に、どのような形になるでしょうか?
なお、その他の処理に DB 更新処理があります。

参考:
Winsock Programmer's FAQ: Articles: Which I/O Strategy Should I Use?
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/io-strategies.html

まず、C# で beginread() (上のページの非同期型ソケット?)を使用して
作っていましたが、その他の DB 更新に時間がかる等、高負荷時に、
要求を受信しても、beginread() が起動しない (スニファで受信確認)、
という事象があり、応答が 100ms を超えてしまいます。

コンテキストスイッチが原因と思われたので、socket.select() で、
受信後、DB 検索を threadpool を利用し、別スレッドで実行し、
受信スレッドは、常に受信を続ける等を検討していますが、
正しいのでしょうか?

応答上限 100ms は、馬鹿げていると思いますが、仕様なので、
なんともなりません・・・

環境:
サーバ:Win2008 server 32bit sp1, Xeon5500 x 2, 4Gb
クライアント:WinXP sp3, Core 2 Duo 7400, 2GB
開発環境:VS2008 .net FW 3.5 sp1
0042デフォルトの名無しさん2010/04/09(金) 23:06:31
その仕様を作った奴にきいたら?
そいつはできるから仕様にしたんだろ
0043デフォルトの名無しさん2010/04/09(金) 23:14:13
客先は、同じ内容を他社にも発注しており、
他社システムは 100ms 内になっているため、
苦しんでおります・・・
0044デフォルトの名無しさん2010/04/09(金) 23:19:22
やりかた聞けよそいつに
客先にソースあんだろ?
0045デフォルトの名無しさん2010/04/09(金) 23:25:03
IISなら速いよ
0046デフォルトの名無しさん2010/04/09(金) 23:25:41
どーみてもボトルネックはDB操作。
0047デフォルトの名無しさん2010/04/10(土) 02:18:35
0.1秒って考えれば結構長時間にみえてくる
0048デフォルトの名無しさん2010/04/10(土) 03:59:46
FPSでpingが100以上だと致命的だな
0049デフォルトの名無しさん2010/04/10(土) 09:37:42
100msって、単に通信だけなら相当に長い。
それがきつく感じるのは>>46にもあるけどDB操作があるからだろ。
通信周りをどうこう考える前に、DB操作が、せめて80ms以内にできなきゃ話にならん。
DB操作が並列処理で高速化できるなら通信まわりも並列化だろうが、
DB操作が並列操作でもスループットあがらない処理なら、通信周りだけ並列化しても意味が無い。
0050デフォルトの名無しさん2010/04/10(土) 10:11:52
同期処理しなけりゃならないなら、NoSQL系の奴使うとか。
同期じゃなくて良いなら、要求をキューイングしておいて、別プロセスとかで処理すれば?
0051デフォルトの名無しさん2010/04/10(土) 10:22:16
コネクションプールしてないとか
まさかね
0052デフォルトの名無しさん2010/04/10(土) 10:34:46
他社は出来てるんだから遅い原因は>>41にあるという結論に至る。
>>51あるいはDBの設計が致命的にヘボい。
0053デフォルトの名無しさん2010/04/10(土) 10:36:30
プログラミングに工数かけるくらいなら、50万くらいで買えるそこそこ高速なDBサーバ提案しろよ。
0054デフォルトの名無しさん2010/04/10(土) 15:24:39
>>41
>サーバで、100クライアントからの要求を 100ms 毎に 1回受信
>(1クライアントは 10sec 毎に1回要求送信)
速攻クビにしたいレベル。
0055デフォルトの名無しさん2010/04/10(土) 15:34:59
とりあえずサーバがDBを兼ねているとして、検索するだけで更新が無いし、
検索用にスレッドを作っておいて検索内容を受信したら投げてseteventでもして起こす。
そういうのにすれば良さそう。
0056デフォルトの名無しさん2010/04/11(日) 02:39:31
他社で出来るなら、他社のシステム導入すればいいだけだしな。
遅いシステムしか組めない所はイラネ。
0057デフォルトの名無しさん2010/04/11(日) 09:10:58
サーバー、クライアントプログラミングを勉強しております。
サーバー側でacceptで停止している場合はどうしたらいいのでしょうか?
クライアント側を再起動すると直るのですが。
サーバー側でどうにかしたいのですが、accept内部で待ちに入ってしまったら
どうしようもないのですか?
0058デフォルトの名無しさん2010/04/11(日) 09:13:29
普通はacceptでブロックしないように、selectする。
0059デフォルトの名無しさん2010/04/11(日) 09:34:32
recvとsendのソケットをわざわざ別タスクにする意味ってありますか?
一つのソケットでsendとrecvやってはまずいでしょうか?
0060デフォルトの名無しさん2010/04/11(日) 14:22:30
どっちでも

タスクを分けられるなら分けたほうがいい
0061デフォルトの名無しさん2010/04/11(日) 15:32:45
何故?
0062デフォルトの名無しさん2010/04/11(日) 16:10:31
別タスクって何?二つのソケットっていうこと?だとしたらそんな必要全然ない。
0063デフォルトの名無しさん2010/04/11(日) 16:34:50
>>62
二つのソケットつくるということです。タスクを別にして。
メリットってなんかあるのでしょうか?
設定の簡略化?
0064デフォルトの名無しさん2010/04/11(日) 17:04:20
二つのソケットってディスクリプタが別のソケットってこと?
それサーバ側とクライアント側でどう二つのコネクションを確立するつもり?
0065デフォルトの名無しさん2010/04/11(日) 17:16:44
UDPならコネクションいらないとおもいまして
0066デフォルトの名無しさん2010/04/11(日) 19:42:31
どっちでもいいと思うけど、なぜ頑なにひとつのソケットでやりたいのかの方が分からん
0067デフォルトの名無しさん2010/04/11(日) 19:57:59
二つのソケットつかってやろうとすると、なぜかうまくいかなかったので
ひとつでrawつかってるせいか。
0068デフォルトの名無しさん2010/04/11(日) 22:34:01
送信と受信を同じソケットでやるさい、送信と受信のバッファみたいなのは別なのでしょうか?

例えば、

while{
send
recv}

でループするような処理の場合、recvを抜けたあとに大量にデータが送られてきて、
sendをしようとするも、送信するはずのデータが受信データがはいってきたことによって
送信できなくなるということはあるのでしょうか?

バッファとはソケットレイヤにあるものと考えて
0069デフォルトの名無しさん2010/04/11(日) 22:40:32
UDPなんだかTCPなんだかはっきりしろ
0070デフォルトの名無しさん2010/04/11(日) 22:54:48
ごめんなさい。UDPです。
0071デフォルトの名無しさん2010/04/11(日) 22:56:16
疑問なんだけど、windosやmacが独自につかってるプロトコルを、
unixが受け取るにはどうしてるの?unixのtcp/ipでもないやつとか
0072デフォルトの名無しさん2010/04/11(日) 23:10:39
unixは盗人が標準装備だから
あとは判るな?
0073デフォルトの名無しさん2010/04/11(日) 23:56:41
すみません、詳しくお願い致します
0074デフォルトの名無しさん2010/04/12(月) 00:44:42
ただのUDPのデータと、DNSのデータってどうプロトコルの違いをみつけてるのでしょうか?

ポート番号とプロトコル種別含めて、別々のプロトコルと区別するのでしょうか?
そうした場合、別のプロトコル同士としてドライバレベルで認識してしまうのでしょうか
0075デフォルトの名無しさん2010/04/12(月) 01:01:35
同じUDPやTCPのデータであっても、セッション層やプロトコル層までいくデータでは、
recvの扱い方が違うのでしょうか?
0076デフォルトの名無しさん2010/04/12(月) 01:30:26
>>74,75
意味不明。まずは質問できる程度の知識をつけてから出直そう
0077デフォルトの名無しさん2010/04/12(月) 03:17:17
私の作っているチャットのサーバ側のプログラムは仮にクライアント、AとBがサーバに接続していて、
AがBにチャットを申し込むとAとBのスレッドを別々に作成し、お互いのスレッド内のみでチャットするという動作(希望)をします。
両者のスレッドでは自分のソケット宛にrecvをしていて
仮にクライアントAがBにデータを送ろうとするとA側のスレッドのプログラムだけを通ってデータが行くのか、
それともB側のスレッドのプログラムも通って行くのかが気になり
(A側のスレッドでBのソケットディスクリプタにデータを送る際、B側のスレッドでBのソケットディスクリプタでrecvをしているため。)
下記プログラムを作って試してみました。
(main関数ではほぼaccpetしてスレッド作るだけなので省略します)
続く
0078デフォルトの名無しさん2010/04/12(月) 03:18:43
void *threadMain(void *socketer){
int recvSocket,sendSocket,bufLen;
char buffer[100];
FILE *fp;
struct socket *abbr = (struct socket *)socketer;
//Aが既にコネクションを確保していて、Bが確保すると抜ける
while(abbr -> flag == 0){
sleep(1);
}
//Aはabbr -> flag == 1の括弧内、Bは == 2の括弧ないの処理をする。
if(abbr -> flag == 1){
abbr -> flag++;
recvSocket = abbr -> socket1; //Aのソケット
sendSocket = abbr -> socket2; //Bのソケット
}else if(abbr -> flag == 2){
recvSocket = abbr -> socket2; //Bのソケット
sendSocket = abbr -> socket1; //Aのソケット
}

while(1){
bufLen = recv(recvSocket,buffer,sizeof(buffer),0);
buffer[bufLen] = '\0';
sleep(5); //Bを経由しているか確認するため。

printf("%d--%d--%s--%ld\n",recvSocket,sendSocket,buffer,(unsigned long int)pthread_self());

send(sendSocket,buffer,bufLen,0);
sleep(1);
}
}
続く
0079デフォルトの名無しさん2010/04/12(月) 03:20:43
私の考えではもしもBを経由するなら
クライアントAがデータ送信→スレッドAで受信、Bのソケットに送信→スレッドBで受信、Aのソケットに送信→無限ループ
経由しないなら
クライアントAがデータ送信→スレッドAで受信、Bのソケットに送信→クライアントBに届いて終了
となるはずでした。

結果的にBは経由せずにデータが送られるということがわかったのですが
(A側のスレッドでsleep(5)が終了後、クライアント側にデータが送信されたため)
なぜか、下記のように無限ループが起きてしまいます。
5--4--abc---1225315472
4--5-----1216922768
5--4-----1225315472
4--5-----1216922768
5--4-----1225315472.....

クライアント側は送信側はデータを送信した時点で、受信側は受信した時点で終了しているのでデータは何も送信していません。
また、最初の送信以降はデータabcが消えています。なぜこのような動作をするのでしょうか。
長々とすみません。よろしくお願いします。
0080デフォルトの名無しさん2010/04/12(月) 03:23:23
fork
0081デフォルトの名無しさん2010/04/12(月) 07:28:40
recvってどこの層でデータをとってるのでしょうか?

httpプロトコルとか、トランスポート層より上にあるプロトコルの場合、
どうデータを処理しているのでしょうか。
0082デフォルトの名無しさん2010/04/12(月) 17:32:07
ソケットに対しての O_SYNC って何か意味を成すの?
0083デフォルトの名無しさん2010/04/12(月) 18:30:12
winsockについて質問です。よろしくお願いします。

まず現象を説明します。
クライアントはWindowsのゲームアプリケーションで、2本スレッドが走っています。

片方は、連続的に映像を描画しています。
もう片方は通信を担当しており、ノンブロッキングモードのSOCKETを監視しています。
秒間60回程度「recv()を監視し、受信バイト数をデバッグウインドウに出力」するスレッドです。

サーバーからデータをsend()すると、クライアントのデバッグウインドウにすぐさま何バイト受け取ったかが表示されます。
(1回のrecvで受信しきれるとは限らないのはもちろんですが)

問題は「映像の描画」の負荷が重くなった時に起きます。
サーバーがsend()してから、受信されるまでの間隔が5秒〜20秒くらいとものすごく遅延するのです。

最初は、描画負荷によって、通信監視スレッドが止まってしまっているのかとも思いました。
ですがループ自体は軽快にまわっています。(0バイト受信というメッセージが、秒間60回吐かれ続けています)

質問は
・これは良くある現象であり、プログラムが間違っているわけではないのかどうか
・解決する方法はあるのか(一応映像の描画は、フレームスキップやらSleep(1)を毎ループ挟んだりやらしたのですが改善せず)
です。
アドバイスよろしくお願いします。
0084デフォルトの名無しさん2010/04/12(月) 18:44:48
>>83
ちゃんと秒間60回吐かれ続けてるの?
ここでログとって時間調べた方がよくね?
あと、念のためマジで受信してるかパケットログ取ろうぜ
0085デフォルトの名無しさん2010/04/12(月) 18:51:19
>>84
はい、60回については通し番号やWindows時間とともに吐かせて確認したので、ループ自体は正常にまわっているようです。

すいません「パケットログ」というのが分からないので、よろしければ教えていただけますでしょうか。
低レベル層でパケットの受信が行われたかを、ツールか何かで見る。ということでしょうか?
教えていただけると幸いです。

余談です。
勝手な素人考えでは
「パケット自体はもちろんすぐ受信されているのだけど、
 CPUパワーを食いすぎており、
 アプリケーション層に渡すまでの処理が超時間かかってしまている」

のかなと。
でも、そこまですさまじく重い(Windows全体がカクつく)ほどではない状態でもなるです
0086デフォルトの名無しさん2010/04/12(月) 19:02:27
読みこんでないデータがあって通信バッファが空くまでまってるんじゃねーの?
0087デフォルトの名無しさん2010/04/12(月) 20:09:17
>>84
>send()してから、受信されるまでの間隔が5秒〜20秒くらいとものすごく遅延
これは明らかに何かが破綻しているね。

単純に時間当たりの通信量がシステム能力に対して多すぎて
間に合ってないってことは?
そうでなければ多分受信スレッドのバグだね。

パケットログはWireSharkをインストールする。通信系のソフト作る場合
パケットログをいつでも採れるようにしておくのは必須事項。
0088デフォルトの名無しさん2010/04/12(月) 21:02:30
UDPw
0089872010/04/12(月) 22:26:20
アンカー間違ってた。>>83ね。
0090デフォルトの名無しさん2010/04/12(月) 23:26:19
ソケットのバッファって、どうなってますか?受信と送信用それぞれ別々?
0091デフォルトの名無しさん2010/04/12(月) 23:38:43
は?
0092デフォルトの名無しさん2010/04/12(月) 23:41:50
君が期待しているようなバッファはない
0093デフォルトの名無しさん2010/04/13(火) 00:02:54
>>90
一般的にはバッファというのはカーネル内での制限値の様な物。 必要があったら
配分して溜め、規定値を超えたら残りは状況に応じた処理をする。 受信側と送信側は
全く別。 

recv側:
  udp 捨てる
  tcp 窓を0にして送信側をブロックする

send側
  sendのコールがブロックされる(バッファに空きが出来るまでコールが終了しない)
  nonblockingという場合はもうちょっと複雑。
   
バッファの容量はシステム設定やソケットのオプションで変更出来る。
0094デフォルトの名無しさん2010/04/13(火) 00:02:54
>>90
setsockopt
SO_RCVBUF int Specifies the total per-socket buffer space reserved for receives. This is unrelated to SO_MAX_MSG_SIZE and does not necessarily correspond to the size of the TCP receive window.
SO_SNDBUF int Specifies the total per-socket buffer space reserved for sends. This is unrelated to SO_MAX_MSG_SIZE and does not necessarily correspond to the size of a TCP send window..
0095デフォルトの名無しさん2010/04/13(火) 01:37:01
>>80
pthreadじゃ出来ないんですか?
ソケットじゃなくてpthreadの方の問題ならスレチになってしまいますが。
0096デフォルトの名無しさん2010/04/13(火) 07:22:45
>>93
UDPの場合、
sendやrecvをコールすることによって、バッファの中をとっていくわけですよ。
逆にコールしないと、recvではデータが上書きされていくような感じなのでしょうか?
sendはバッファに空きが出るまでコールが終了しないということですが、
その間、他の処理はできないというわけでしょうか?
だとしたら、sendのタイムアウト値みたいなものはないのでしょうか。
また、sendのバッファを一度クリアしてから、sendをコールするということはできますか?


0097デフォルトの名無しさん2010/04/13(火) 08:04:18
UDPであれ、TCPであれ、RAWであれ、1つのソケットで送受信ができるバッファが用意されるのでしょうか?
0098デフォルトの名無しさん2010/04/13(火) 08:22:19
1500バイトぐらいはあるんじゃね
0099デフォルトの名無しさん2010/04/13(火) 10:33:41
>>97
ソケットごとにな!
0100デフォルトの名無しさん2010/04/13(火) 13:12:04
ソケットにO_SYNCつけてみたけど、なにも変化なかった。
これって単に無視されてるだけ?
0101デフォルトの名無しさん2010/04/13(火) 14:34:05
変な質問繰り返してる奴って同一人物かな
■ このスレッドは過去ログ倉庫に格納されています