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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

じゃぁ、rfc2616読むといいよ
いろいろ書いてあるから
0039デフォルトの名無しさん2009/07/15(水) 01:01:06
HTTプロトコルプロトコル
0040デフォルトの名無しさん2009/07/15(水) 13:54:24
鯖側で/丸見えにしたら、世界中から丸見えで恥ずかしいと思うよ。
httpプロトコルで丸ごとコピーのプロトコル?を通せば(ry
0041デフォルトの名無しさん2009/07/17(金) 09:07:27
int listen(sockfd,backlog);
backlog=0とするのはご法度ということですが
バックログをゼロにしたいときはどうしたらよいでしょうか。
0042デフォルトの名無しさん2009/07/17(金) 10:16:23
> backlog=0とするのはご法度ということですが
聞いたこと無いなぁ。
0043デフォルトの名無しさん2009/07/17(金) 10:24:28
バックログがゼロということは、接続を一切受け付けられないということでは?
受け付けた接続を保持するキューのサイズのはずだから
0044412009/07/17(金) 10:34:48
>>43
おっしゃるとおりです。
ようするにlisten()して最初の接続を受け付けた段階で
2つ目以降の接続を受け付けたくないんですが
実際にはaccept()する前にいくつもの接続を受け付けてしまう
(クライアント側からはconnect()が完了したように見える)
のを抑止したいんです。
0045デフォルトの名無しさん2009/07/17(金) 11:04:02
>>41
acceptしたあとlistenを再度呼び出して0に再設定すればいい…
と記憶しているが、実際に試した事は無い。
■ このスレッドは過去ログ倉庫に格納されています