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

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

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

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

前スレ
ネットワークプログラミング相談室 Port24
http://pc12.2ch.net/test/read.cgi/tech/1246895188/
関連スレ
ネットワークプログラミング雑談
http://pc12.2ch.net/test/read.cgi/tech/1235800707/
Java ネットワークプログラミング 【教えて!】
http://pc12.2ch.net/test/read.cgi/tech/1086238859/
0083デフォルトの名無しさん2009/10/27(火) 23:38:53
ICMP って 「アイコンプ」って読んだら変かなあ
0084デフォルトの名無しさん2009/10/27(火) 23:54:47
hen
0085デフォルトの名無しさん2009/10/27(火) 23:56:00
SNMPをスヌンプって読む人はいるよ
漏れは読まないけど
0086デフォルトの名無しさん2009/10/27(火) 23:57:11
>>82
ノ
0087デフォルトの名無しさん2009/10/28(水) 11:08:25
WSDLはうぃずどぅるだけどな
0088デフォルトの名無しさん2009/10/31(土) 04:47:46
リフラグメント前提のパケットを大量に流してあげると、フラグメントしてくれる親切なルータにDoS出来てしまう気がした。これってセキュリティホールじゃ?
ICMP echoは捨ててもいいと思うけどね。ルータで捨てた時に送って来るICMPは捨てると良くないことが起きそうだが。
0089デフォルトの名無しさん2009/11/01(日) 21:35:44
>>80
UDPのconnectなんてあるんですね。。でも、connectすりゃ、send,recv使えるって
しなくてもmtu以下のサイズなら使えます。そういうことではないのでしょうか?

OSがUNIXでもwindowsでもないからおくれないのかなぁ
0090デフォルトの名無しさん2009/11/01(日) 21:47:16
connectしなかったらsendは使えない
だって宛先不明
sendtoやsendmsgは使える
connectしたらsendも使える
0091デフォルトの名無しさん2009/11/01(日) 23:04:55
>>88
そんな古いDoS攻撃…
0092デフォルトの名無しさん2009/11/01(日) 23:21:35
複数の接続を受けるサーバーを作りたいんだけど
人数が増えるたびrecvの回数増やすにはどうすればいいんだ?
0093デフォルトの名無しさん2009/11/02(月) 00:37:19
recvの回数増やすというのはよくわからないが
受け付けた接続ごとに別々のスレッドを立ち上げるか
selectやpoll等を使ってひとつのスレッドですべての接続を捌くか
好きなほうを選べ
0094デフォルトの名無しさん2009/11/02(月) 02:12:48
スレッドで処理してる間に、パケット届くと取りこぼしそうだw
0095デフォルトの名無しさん2009/11/02(月) 02:37:43
はあ?
0096デフォルトの名無しさん2009/11/02(月) 03:33:19
UDPパケットを取りこぼしなく取り込みたいのですが
なにかいい方法ありませんか?
0097デフォルトの名無しさん2009/11/02(月) 09:59:52
あきらめれ
0098デフォルトの名無しさん2009/11/02(月) 10:28:49
>>96
取りこぼさないのは無理なので、取りこぼしたことを検出して回復を図る
0099デフォルトの名無しさん2009/11/02(月) 11:25:32
取りこぼしたくなければ素直にTCP使っとけ
UDPにするなら取りこぼしてもいいようにプログラム側を設計しろ
っていうのが定型文的な解答
0100デフォルトの名無しさん2009/11/02(月) 15:29:39
決してしてはならないのは
「Ethernat直結でしか使わないからUDPでも取りこぼしなんて起きないだろう」
などと考えること。これをやってハマる初心者が意外に多くて困る。
0101デフォルトの名無しさん2009/11/02(月) 16:09:27
同時にパケット発射すれば簡単に消えるしな。
0102デフォルトの名無しさん2009/11/04(水) 18:16:51
マルチスレッド鯖製作中なんだけど
誰かからデータ受信したら送信してきた相手以外の
クライアントにそのデータを送るにはどうしたらいいの?
0103デフォルトの名無しさん2009/11/04(水) 18:29:17
言葉どおりにやればいい
0104デフォルトの名無しさん2009/11/04(水) 18:31:15
受信したことを別スレッドに通知するにはどうすればいいの?
0105デフォルトの名無しさん2009/11/04(水) 19:14:21
通知を受け取りたい各スレッドごとにキューのようなデータ構造を何か用意する
通知を送りたいスレッドは宛先スレッドのキューに送りたいデータを置く
通知を受け取りたいスレッドはヒマなときに自分のキューを見てデータが来ていたら取り出す
OSによってはそういったメッセージキューの機能をすでに持っていることもある
自分で作る場合はスレッドセーフにすることを忘れずに
0106デフォルトの名無しさん2009/11/04(水) 19:29:06
難しいこと考えないで、
受信したスレッドが全部のソケットに書けばいい
排他が気になるなら、ひとつmutexをロックしておけばいい
0107デフォルトの名無しさん2009/11/04(水) 19:30:21
>>102
その質問そのものをコードにしてみればいいじゃないか(受け取ったデータを他に転送)
リソース競合には気をつける必要があるけど処理自体はおまいの質問そのものだぞ
0108デフォルトの名無しさん2009/11/04(水) 19:32:41
>>102
何か効率の良い方法とか、そういうライブラリの存在を訊きたいのかもしれないが
そのレベルだとどちらの意味でもがんばって送信しやがれってレベルでしかないぞ。
0109デフォルトの名無しさん2009/11/04(水) 22:04:39
>>106
スレッドに値渡ししたら次のアクセプトで変数上書きしてて
受信したスレッドは、送信する相手のソケットを知ることができないんだ
だから他のスレッドに通知してそのスレッドから送信させようかなと

グローバルの配列で管理しておかないとだめってことか


0110デフォルトの名無しさん2009/11/04(水) 22:13:09
配列というか上に書いてある通りキューだろ
(キューの実装は配列でもいいけれど)
0111デフォルトの名無しさん2009/11/04(水) 22:36:17
でもそれってrecvをノンブロックのしないといけないんでしょ?
0112デフォルトの名無しさん2009/11/04(水) 22:56:51
そんなこと関係ない。
0113デフォルトの名無しさん2009/11/05(木) 00:15:28
どういうこと
ノンブロックで受信とそのキューとやらのチェックをポーリングさせるってことじゃないのか
0114デフォルトの名無しさん2009/11/05(木) 01:33:27
1接続しか許さないサーバプログラムを作る方法を教えてくだちい
listen()でバックログを1にしてaccept()した瞬間にlistenソケット閉じて
ってやればいいかと思ったけど
acceptする前にどんどん接続を受け付けやがる
0115デフォルトの名無しさん2009/11/05(木) 02:47:46
接続待ち受けのソケットでそのまま通信すればいいんじゃね?
0116デフォルトの名無しさん2009/11/05(木) 04:37:56
システムコールに惑わされずにまずRFC読め
0117デフォルトの名無しさん2009/11/05(木) 08:47:12
同期用キューでも作って渡せばいい

詳しくはこっちだな
マルチスレッドプログラミング
http://pc12.2ch.net/test/read.cgi/tech/1253521167/
0118デフォルトの名無しさん2009/11/05(木) 09:01:16
>>114
無理なOSは無理なんで諦めてください。

あらかじめ双方のポート番号が分かっているなら
双方からconnectって手があるけど。
0119デフォルトの名無しさん2009/11/05(木) 09:02:35
>>113
お前がそう言う実装に拘る理由こそ、どういうこと?
0120デフォルトの名無しさん2009/11/05(木) 09:29:30
>>114
キミのやりたい事は完璧にはできない。
バックログを0にして、acceptしたらlistening socketをcloseする。
これでもacceptしてからcloseするまでの間は接続を受け付けてしまう。

>>118
可能なOSを例示してくれ。今まで聞いたことが無いから知りたい。
0121デフォルトの名無しさん2009/11/05(木) 09:41:41
昔のvxWorks
0122デフォルトの名無しさん2009/11/05(木) 10:01:50
>>118
双方からconnectってなんだよ。
0123デフォルトの名無しさん2009/11/05(木) 10:46:35
ポート食いつぶし攻撃か?
0124デフォルトの名無しさん2009/11/05(木) 11:55:49
マイコンのプロトコルスタックを作ってる最中なのだがちょっと質問。

データ送信したとき全くの正常ならば
相手から返ってくるAcknoledgeNumber=自分が送信したSequenceNumber+TCPデータ長
となる筈なんだろうけど、この相手のACKパケットに入ってるAcknoledgeNumberが和より少ないときってこっちは何をすれば良いんだ?
もらったAcknoledgeNumberの分までは正常と見なして続きから送り直せばいいのかね?
0125デフォルトの名無しさん2009/11/05(木) 15:25:59
>>124
そんなもんは気にせずに window size が 0 になるまで無理やり送りつけるんだ
0126デフォルトの名無しさん2009/11/05(木) 17:43:56
マイコンに限らず再送バッファの大きさに支配されると思う
再送バッファサイズ<=窓までは送れる
0127デフォルトの名無しさん2009/11/05(木) 22:18:00
>>126
最後は再送バッファサイズの問題とかスロースタートの問題には
行き当たるんだろうけど、プロトコル的には送ったもん勝だわな

0128デフォルトの名無しさん2009/11/06(金) 02:03:33
>>122
host1: socket→bind→connect
host2: scoket→bind→connect

TCPの接続開始ハンドシェイクはこういうやり方でも可能。
0129デフォルトの名無しさん2009/11/06(金) 22:03:48
意味が分からん。
ソースで示して>128
0130デフォルトの名無しさん2009/11/07(土) 13:54:24
横着しないで RFC 位読め
0131デフォルトの名無しさん2009/11/07(土) 14:48:44
UDPって「取りこぼし」だけじゃなくて「送りそこね」もあるんだよな
0132デフォルトの名無しさん2009/11/07(土) 16:41:10
途中で捨てられたも多い。取りこぼしだと届いてるのに拾えなかった感が有るが、そもそも届いてない。
0133デフォルトの名無しさん2009/11/08(日) 21:50:24
Windowsでネットワークアドレスの違うIPアドレスへ強制的に
UDPのパケットを送る方法って無いでしょうか?
SetIpNetEntry()で静的arpに登録して送っても駄目みたいでした。
(たぶん送信時に跳ねられている)
0134デフォルトの名無しさん2009/11/08(日) 23:07:35
arpコマンドで登録すればいいんじゃ?
0135デフォルトの名無しさん2009/11/09(月) 00:10:05
>>134
SetIpNetEntry()を呼ぶのと、arpコマンド実行は同じ事だと思うけど、
試しにpingとwireshark使ってやってみました。

Destination host unreachable.
と出て、相手には何も届いてないですね。
しかも、Windows7でやると特権がいるとかでエラーになるし、
諦めてブロードキャストで送ることにします。
0136デフォルトの名無しさん2009/11/09(月) 08:54:56
ftpでファイルを送受信することになりました
こっちも相手側もクライアントとサーバになります
VC(MFC)でプログラムを作ろうと思いますが
どうやって作っていいかわかりません
クライアント側はサーバーに接続して
ファイルを転送する?イメージがあります。
検索するとCFtpConnectionをつかって作るのがわかりました
でもサーバー側ってどうやって作るんでしょうか?
どこかにサンプルとかヒントはありませんか?
0137デフォルトの名無しさん2009/11/09(月) 09:38:23
ファイルが転送できればいいのかFTPプロトコルを実装したいのか
0138デフォルトの名無しさん2009/11/09(月) 10:18:54
多分ファイル転送ができればいいです
プログラムでファイルをリモートのPCに送りたいのと
相手側がいつでもファイルをこちら側に送れるように
ftpサーバー機能があればいいです
0139デフォルトの名無しさん2009/11/09(月) 10:21:10
>>133
違うネットアドレスへ送ろうとする場合、arpはgateway
に対してだよ?routeはどうなってるの?
0140デフォルトの名無しさん2009/11/09(月) 10:39:50
>>138
では
http://www.geekpage.jp/programming/winsock/
をちょこっと見ればできますね
0141デフォルトの名無しさん2009/11/09(月) 11:07:33
>>140
ありがとうございます
見てみましたがftpについては見当たりませんでした
ftpサーバとしてftpクライアントの要望にこたえる例とかしりませんか?
0142デフォルトの名無しさん2009/11/09(月) 11:10:23
サーバなんて既存のやつ使えばいいじゃない
サーバもクライアントも作るなら特定のプロトコルにこだわる必要もないだろう
0143デフォルトの名無しさん2009/11/09(月) 11:11:38
だめだこりゃ
0144デフォルトの名無しさん2009/11/09(月) 11:13:14
あとMFCならこういうのでどうか
ttp://www.codeproject.com/KB/IP/CFtpServer.aspx
0145デフォルトの名無しさん2009/11/09(月) 11:18:28
>>142
一応売り物にするのでフリーのは問題ある?のではないかと思ってます
システムに組み込んで売っても問題ないフリーソフトとかありませんか?

>>144
ありがとうございます
参考にサンプル落とし見ようとしたら登録が必要なようですorz
英語はわからなくて…すみません
0146デフォルトの名無しさん2009/11/09(月) 11:25:49
多少の英語も出来ずにプログラマやってるのかよ
0147デフォルトの名無しさん2009/11/09(月) 11:28:01
もうRFC959読んで自前で実装しちゃいなよ
日本語訳もあったはずだ
0148デフォルトの名無しさん2009/11/09(月) 11:48:47
>>145
BSDライセンスのFTPサーバ。FreeBSDのとか。
まあ機能限定で実装すれば自前でも簡単だけど。
0149デフォルトの名無しさん2009/11/09(月) 11:54:27
>>148
ありがとうございます
ちょっと調べてみます

自分でいろいろ調べてたらXPにもftpサーバがあるみたいなのですが
XPのを使うのとフリーのftpサーバ使うのは全然違う意味ですか?
XP標準にあるならそっちのが楽なのかなぁ?と思ったりしてます
0150デフォルトの名無しさん2009/11/09(月) 12:03:14
>>149
IISのこと?
0151デフォルトの名無しさん2009/11/09(月) 12:04:52
IISはXPのProにはあるけどHomeには無いから気をつけて
0152デフォルトの名無しさん2009/11/09(月) 12:09:04
>>150
そうです
XP Proを使う予定でs
0153デフォルトの名無しさん2009/11/09(月) 17:17:07
初心者極まりない質問で申し訳ないですが、お願いします。

VB6.0のwinsockオブジェクトを用いて、出来合いのサーバ(ORCA_CLAIM)に
データを送信するプログラムを作成してます。
ポートとアドレスを指定して送りたいデータを送信し、
ただクローズするだけなのですが、送信後にサーバのステータスが
CLOSE_WAITになったまま消えてくれません。
(# netstat -nap localhost などで確認)
そうなると再送信してもポートが現在使用されていますと出て、
エラーを返すのでとても困っています。
サーバソフトの製作元にもたずねて見ましたが、そんな現象はありえないと
いうお話でしたので、どうもこちら側に決定的な原因があるようです。

状況説明がうまくないようでしたら申し訳ありません。
何か、ありがちなミスなどありましたらご指摘よろしくお願いします。
0154デフォルトの名無しさん2009/11/09(月) 17:41:20
winsock1.closeはしてるの?
0155デフォルトの名無しさん2009/11/09(月) 17:51:47
IISに投げてみたけどCLOSE_WAITにはならないよ

Option Explicit

Private Sub Command1_Click()
  Winsock1.LocalPort = 0
  Winsock1.RemoteHost = "localhost"
  Winsock1.RemotePort = 80
  Winsock1.Connect
End Sub

Private Sub Winsock1_Close()
  Winsock1.Close
End Sub

Private Sub Winsock1_Connect()
  Winsock1.SendData "GET / HTTP/1.0" & vbCrLf & vbCrLf
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  Dim s As String
  Winsock1.GetData s
  MsgBox s
End Sub
0156デフォルトの名無しさん2009/11/09(月) 18:47:40
同じ質問を過去に見たんだが、解決方法忘れてしまった
VBスレの人なら知ってる人いるんじゃない?
0157デフォルトの名無しさん2009/11/09(月) 19:29:30
>>153です。皆様レスをつけていただいて有難うございます。

>>154
うーん。Winsock1.closeはやっているのですが、反応がないようです。
>>155
すいませんサンプルソースまで書いてもらって、助かります。
私のソースもだいたいそのような感じなのですが、見直してみることにします。
>>156
有力情報有難うございます。
そちらの方にも尋ねてみることにします。
0158デフォルトの名無しさん2009/11/09(月) 20:08:45
>>157
どちらが先にクローズする仕様なの?
0159デフォルトの名無しさん2009/11/09(月) 23:25:49
レス有難うございます。

>>158
http://www.orca.med.or.jp/receipt/tec/dev/soft/claim.rhtml

の(2)によると、送信した側がsocket closeと書いてあるようですので
こちら側(送信側)がCloseしなければいけないのかなと考えています。
0160デフォルトの名無しさん2009/11/09(月) 23:38:25
closeする前にサーバのACK/NAK応答は受信したのかと
0161デフォルトの名無しさん2009/11/09(月) 23:41:31
言っとくがTCPじゃなくてアプリレイヤーの話だぞ?
>>159のシーケンスをちゃんと嫁
0162デフォルトの名無しさん2009/11/09(月) 23:45:18
見落としてるだけだろ
アホとしか
0163デフォルトの名無しさん2009/11/10(火) 00:01:16
>>159
これだとCloseイベントでcloseしたほうがいいかもしれない。
>>155のように
0164デフォルトの名無しさん2009/11/10(火) 00:32:37
closeしなくてもほっときゃ切れるだろ
0165デフォルトの名無しさん2009/11/10(火) 01:37:03
socketは全二重
送る側だけまずshutdown
読む側でEOFまで全て読み終わるのを確認してからclose
これはちゃんとやって
0166デフォルトの名無しさん2009/11/10(火) 09:17:58
皆様何度も返信してくださって
厳しいながらもありがたい限りです

>>160
そちらの受信は確認しております。
>>161
アプリレイヤーとTCPの違いがまだよく分かっていないのですが、
そこの部分は調べてみます
>>163
ちょっとその手法でやってみます
>>165
shutdownはwinsockメソッドにはなく、
http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/9802/winsock/
で見ました。全文読んでいないのでなんともいえませんが、
まだ使い方が不明なので調査してみます。
0167デフォルトの名無しさん2009/11/10(火) 23:40:54
>>166
> shutdownはwinsockメソッドにはなく、

何言ってるかわからない。
書く側だけまずshutdownしろってのは、
winsockのFAQの初心者向け項目に書いてあること。
0168デフォルトの名無しさん2009/11/10(火) 23:47:48
良くこれで仕事が出来るな・・・
0169デフォルトの名無しさん2009/11/11(水) 00:04:43
とりあえずWiresharkで
双方の FIN → FIN,ACK → ACK のどこまで出てるか見てみたら?
0170デフォルトの名無しさん2009/11/11(水) 05:43:11
サーバの開発元に質問するほうもアレだが、ありえないと回答するのもひどいな。
お互い良くそれでプログラマって言えるよな。
0171デフォルトの名無しさん2009/11/11(水) 18:13:12
IdBaseComponent,
IdComponent,
IdTCPConnection,
IdTCPClient,
IdHTTP
IdException

このへんのコンポーネントってIndyですか?
0172デフォルトの名無しさん2009/11/11(水) 18:18:28
Indyですね
0173デフォルトの名無しさん2009/11/11(水) 18:27:53
>>172
ありがとう

IdってIndyって意味だったのか
コンポーネントないからビルドできねぇ
0174デフォルトの名無しさん2009/11/11(水) 23:35:50
>>153
> CLOSE_WAITになったまま消えてくれません。
サーバ側のCLOSE_WAITは全く関係ない。お前の作ったクライアントがダメなだけ。

> 何か、ありがちなミスなどありましたらご指摘よろしくお願いします。
自分のバグを他人の所為だと思いたがる態度が、初心者にありがちな重大なミス。

bindしてるだろ。
01751142009/11/12(木) 01:33:52
>>120
やっぱ無理だよな、ありがとう

>>118
相手がわかってればいいんだけどねぇ
0176デフォルトの名無しさん2009/11/12(木) 07:44:31
>>128
それじゃ3-wayハンドシェイクが成立しないだろ。可能だと主張するなら動作するサンプルコードを。
0177デフォルトの名無しさん2009/11/12(木) 08:50:27
>>176
RFC に双方 connect() 時のシーケンス載ってるが?
0178デフォルトの名無しさん2009/11/12(木) 09:01:03
>>176
RFC793 の figure 8 だけど、rfc1122 でその図の間違
いが訂正されてる。

  4.2.2.10  Simultaneous Open Attempts: RFC-793 Section 3.4, page
            32

            There is an error in Figure 8: the packet on line 7 should
            be identical to the packet on line 5.

            A TCP MUST support simultaneous open attempts.

            DISCUSSION:
                 It sometimes surprises implementors that if two
                 applications attempt to simultaneously connect to each
                 other, only one connection is generated instead of two.
                 This was an intentional design decision; don't try to
                 "fix" it.

0179デフォルトの名無しさん2009/11/12(木) 09:25:14
> This was an intentional design decision; don't try to "fix" it.
うわっ、強引。決めたんだからなおすな。
0180デフォルトの名無しさん2009/11/12(木) 09:37:37
>>179
違う違う。「実装者は双方同時 open の結果として一つ
しかコネクションが出来ないことに驚くかもしれないが、
これはそうなるように『設計』されているので直そうと
するな」ということ。
0181デフォルトの名無しさん2009/11/12(木) 10:28:32
コネクションが2つでなく1つなのは「そのように決めたんだからなおすな」って事でしょ。
なんで、そのように決めたんだろう。

という事は置いておいて、これは同時にconnectが発生した(例外的な)場合に関しての
規定であって、>>118が言ってるような狙ってできるってもんじゃないよね。
0182デフォルトの名無しさん2009/11/12(木) 10:29:35
>>174
>自分のバグを他人の所為だと思いたがる態度が、初心者にありがちな重大なミス

逆に自分のせいだと思って散々調べたら自分のせいじゃ無かったってのもよくある
まずは切り分けが大事と思い知らされた
■ このスレッドは過去ログ倉庫に格納されています