ネットワークプログラミング相談室 Port25
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/10/14(水) 03:43:08Programming 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/
0075デフォルトの名無しさん
2009/10/26(月) 20:21:31今のトレンドのプログラム言語はなんでしょうか
0076デフォルトの名無しさん
2009/10/26(月) 20:22:200077デフォルトの名無しさん
2009/10/26(月) 20:26:400078デフォルトの名無しさん
2009/10/26(月) 20:29:140079デフォルトの名無しさん
2009/10/27(火) 00:12:51すみません、UDPでMTU以上のデータを送りたいということです。
分かりにくくて申し訳ないです
0080デフォルトの名無しさん
2009/10/27(火) 00:54:01OSとか環境とか情報はないのか?
sendto で宛先指定すりゃ普通に出ていかないか?
送れてない時ってエラー帰ってないか?
どうしても send が使いたいんだったら >>74
もっとも, 組み込み用のスタックとかだと UDP の
connect は, 実装してないスタックもあるらしいが…
0081デフォルトの名無しさん
2009/10/27(火) 06:19:11送れません。
0082デフォルトの名無しさん
2009/10/27(火) 10:31:310083デフォルトの名無しさん
2009/10/27(火) 23:38:530084デフォルトの名無しさん
2009/10/27(火) 23:54:470085デフォルトの名無しさん
2009/10/27(火) 23:56:00漏れは読まないけど
0086デフォルトの名無しさん
2009/10/27(火) 23:57:11ノ
0087デフォルトの名無しさん
2009/10/28(水) 11:08:250088デフォルトの名無しさん
2009/10/31(土) 04:47:46ICMP echoは捨ててもいいと思うけどね。ルータで捨てた時に送って来るICMPは捨てると良くないことが起きそうだが。
0089デフォルトの名無しさん
2009/11/01(日) 21:35:44UDPのconnectなんてあるんですね。。でも、connectすりゃ、send,recv使えるって
しなくてもmtu以下のサイズなら使えます。そういうことではないのでしょうか?
OSがUNIXでもwindowsでもないからおくれないのかなぁ
0090デフォルトの名無しさん
2009/11/01(日) 21:47:16だって宛先不明
sendtoやsendmsgは使える
connectしたらsendも使える
0091デフォルトの名無しさん
2009/11/01(日) 23:04:55そんな古いDoS攻撃…
0092デフォルトの名無しさん
2009/11/01(日) 23:21:35人数が増えるたびrecvの回数増やすにはどうすればいいんだ?
0093デフォルトの名無しさん
2009/11/02(月) 00:37:19受け付けた接続ごとに別々のスレッドを立ち上げるか
selectやpoll等を使ってひとつのスレッドですべての接続を捌くか
好きなほうを選べ
0094デフォルトの名無しさん
2009/11/02(月) 02:12:480095デフォルトの名無しさん
2009/11/02(月) 02:37:430096デフォルトの名無しさん
2009/11/02(月) 03:33:19なにかいい方法ありませんか?
0097デフォルトの名無しさん
2009/11/02(月) 09:59:520098デフォルトの名無しさん
2009/11/02(月) 10:28:49取りこぼさないのは無理なので、取りこぼしたことを検出して回復を図る
0099デフォルトの名無しさん
2009/11/02(月) 11:25:32UDPにするなら取りこぼしてもいいようにプログラム側を設計しろ
っていうのが定型文的な解答
0100デフォルトの名無しさん
2009/11/02(月) 15:29:39「Ethernat直結でしか使わないからUDPでも取りこぼしなんて起きないだろう」
などと考えること。これをやってハマる初心者が意外に多くて困る。
0101デフォルトの名無しさん
2009/11/02(月) 16:09:270102デフォルトの名無しさん
2009/11/04(水) 18:16:51誰かからデータ受信したら送信してきた相手以外の
クライアントにそのデータを送るにはどうしたらいいの?
0103デフォルトの名無しさん
2009/11/04(水) 18:29:170104デフォルトの名無しさん
2009/11/04(水) 18:31:150105デフォルトの名無しさん
2009/11/04(水) 19:14:21通知を送りたいスレッドは宛先スレッドのキューに送りたいデータを置く
通知を受け取りたいスレッドはヒマなときに自分のキューを見てデータが来ていたら取り出す
OSによってはそういったメッセージキューの機能をすでに持っていることもある
自分で作る場合はスレッドセーフにすることを忘れずに
0106デフォルトの名無しさん
2009/11/04(水) 19:29:06受信したスレッドが全部のソケットに書けばいい
排他が気になるなら、ひとつmutexをロックしておけばいい
0107デフォルトの名無しさん
2009/11/04(水) 19:30:21その質問そのものをコードにしてみればいいじゃないか(受け取ったデータを他に転送)
リソース競合には気をつける必要があるけど処理自体はおまいの質問そのものだぞ
0108デフォルトの名無しさん
2009/11/04(水) 19:32:41何か効率の良い方法とか、そういうライブラリの存在を訊きたいのかもしれないが
そのレベルだとどちらの意味でもがんばって送信しやがれってレベルでしかないぞ。
0109デフォルトの名無しさん
2009/11/04(水) 22:04:39スレッドに値渡ししたら次のアクセプトで変数上書きしてて
受信したスレッドは、送信する相手のソケットを知ることができないんだ
だから他のスレッドに通知してそのスレッドから送信させようかなと
グローバルの配列で管理しておかないとだめってことか
0110デフォルトの名無しさん
2009/11/04(水) 22:13:09(キューの実装は配列でもいいけれど)
0111デフォルトの名無しさん
2009/11/04(水) 22:36:170112デフォルトの名無しさん
2009/11/04(水) 22:56:510113デフォルトの名無しさん
2009/11/05(木) 00:15:28ノンブロックで受信とそのキューとやらのチェックをポーリングさせるってことじゃないのか
0114デフォルトの名無しさん
2009/11/05(木) 01:33:27listen()でバックログを1にしてaccept()した瞬間にlistenソケット閉じて
ってやればいいかと思ったけど
acceptする前にどんどん接続を受け付けやがる
0115デフォルトの名無しさん
2009/11/05(木) 02:47:460116デフォルトの名無しさん
2009/11/05(木) 04:37:560117デフォルトの名無しさん
2009/11/05(木) 08:47:12詳しくはこっちだな
マルチスレッドプログラミング
http://pc12.2ch.net/test/read.cgi/tech/1253521167/
0118デフォルトの名無しさん
2009/11/05(木) 09:01:16無理なOSは無理なんで諦めてください。
あらかじめ双方のポート番号が分かっているなら
双方からconnectって手があるけど。
0119デフォルトの名無しさん
2009/11/05(木) 09:02:35お前がそう言う実装に拘る理由こそ、どういうこと?
0120デフォルトの名無しさん
2009/11/05(木) 09:29:30キミのやりたい事は完璧にはできない。
バックログを0にして、acceptしたらlistening socketをcloseする。
これでもacceptしてからcloseするまでの間は接続を受け付けてしまう。
>>118
可能なOSを例示してくれ。今まで聞いたことが無いから知りたい。
0121デフォルトの名無しさん
2009/11/05(木) 09:41:410122デフォルトの名無しさん
2009/11/05(木) 10:01:50双方からconnectってなんだよ。
0123デフォルトの名無しさん
2009/11/05(木) 10:46:350124デフォルトの名無しさん
2009/11/05(木) 11:55:49データ送信したとき全くの正常ならば
相手から返ってくるAcknoledgeNumber=自分が送信したSequenceNumber+TCPデータ長
となる筈なんだろうけど、この相手のACKパケットに入ってるAcknoledgeNumberが和より少ないときってこっちは何をすれば良いんだ?
もらったAcknoledgeNumberの分までは正常と見なして続きから送り直せばいいのかね?
0125デフォルトの名無しさん
2009/11/05(木) 15:25:59そんなもんは気にせずに window size が 0 になるまで無理やり送りつけるんだ
0126デフォルトの名無しさん
2009/11/05(木) 17:43:56再送バッファサイズ<=窓までは送れる
0127デフォルトの名無しさん
2009/11/05(木) 22:18:00最後は再送バッファサイズの問題とかスロースタートの問題には
行き当たるんだろうけど、プロトコル的には送ったもん勝だわな
0128デフォルトの名無しさん
2009/11/06(金) 02:03:33host1: socket→bind→connect
host2: scoket→bind→connect
TCPの接続開始ハンドシェイクはこういうやり方でも可能。
0129デフォルトの名無しさん
2009/11/06(金) 22:03:48ソースで示して>128
0130デフォルトの名無しさん
2009/11/07(土) 13:54:240131デフォルトの名無しさん
2009/11/07(土) 14:48:440132デフォルトの名無しさん
2009/11/07(土) 16:41:100133デフォルトの名無しさん
2009/11/08(日) 21:50:24UDPのパケットを送る方法って無いでしょうか?
SetIpNetEntry()で静的arpに登録して送っても駄目みたいでした。
(たぶん送信時に跳ねられている)
0134デフォルトの名無しさん
2009/11/08(日) 23:07:350135デフォルトの名無しさん
2009/11/09(月) 00:10:05SetIpNetEntry()を呼ぶのと、arpコマンド実行は同じ事だと思うけど、
試しにpingとwireshark使ってやってみました。
Destination host unreachable.
と出て、相手には何も届いてないですね。
しかも、Windows7でやると特権がいるとかでエラーになるし、
諦めてブロードキャストで送ることにします。
0136デフォルトの名無しさん
2009/11/09(月) 08:54:56こっちも相手側もクライアントとサーバになります
VC(MFC)でプログラムを作ろうと思いますが
どうやって作っていいかわかりません
クライアント側はサーバーに接続して
ファイルを転送する?イメージがあります。
検索するとCFtpConnectionをつかって作るのがわかりました
でもサーバー側ってどうやって作るんでしょうか?
どこかにサンプルとかヒントはありませんか?
0137デフォルトの名無しさん
2009/11/09(月) 09:38:230138デフォルトの名無しさん
2009/11/09(月) 10:18:54プログラムでファイルをリモートのPCに送りたいのと
相手側がいつでもファイルをこちら側に送れるように
ftpサーバー機能があればいいです
0139デフォルトの名無しさん
2009/11/09(月) 10:21:10違うネットアドレスへ送ろうとする場合、arpはgateway
に対してだよ?routeはどうなってるの?
0140デフォルトの名無しさん
2009/11/09(月) 10:39:50では
http://www.geekpage.jp/programming/winsock/
をちょこっと見ればできますね
0141デフォルトの名無しさん
2009/11/09(月) 11:07:33ありがとうございます
見てみましたがftpについては見当たりませんでした
ftpサーバとしてftpクライアントの要望にこたえる例とかしりませんか?
0142デフォルトの名無しさん
2009/11/09(月) 11:10:23サーバもクライアントも作るなら特定のプロトコルにこだわる必要もないだろう
0143デフォルトの名無しさん
2009/11/09(月) 11:11:380144デフォルトの名無しさん
2009/11/09(月) 11:13:14ttp://www.codeproject.com/KB/IP/CFtpServer.aspx
0145デフォルトの名無しさん
2009/11/09(月) 11:18:28一応売り物にするのでフリーのは問題ある?のではないかと思ってます
システムに組み込んで売っても問題ないフリーソフトとかありませんか?
>>144
ありがとうございます
参考にサンプル落とし見ようとしたら登録が必要なようですorz
英語はわからなくて…すみません
0146デフォルトの名無しさん
2009/11/09(月) 11:25:490147デフォルトの名無しさん
2009/11/09(月) 11:28:01日本語訳もあったはずだ
0148デフォルトの名無しさん
2009/11/09(月) 11:48:47BSDライセンスのFTPサーバ。FreeBSDのとか。
まあ機能限定で実装すれば自前でも簡単だけど。
0149デフォルトの名無しさん
2009/11/09(月) 11:54:27ありがとうございます
ちょっと調べてみます
自分でいろいろ調べてたらXPにもftpサーバがあるみたいなのですが
XPのを使うのとフリーのftpサーバ使うのは全然違う意味ですか?
XP標準にあるならそっちのが楽なのかなぁ?と思ったりしてます
0150デフォルトの名無しさん
2009/11/09(月) 12:03:14IISのこと?
0151デフォルトの名無しさん
2009/11/09(月) 12:04:520152デフォルトの名無しさん
2009/11/09(月) 12:09:04そうです
XP Proを使う予定でs
0153デフォルトの名無しさん
2009/11/09(月) 17:17:07VB6.0のwinsockオブジェクトを用いて、出来合いのサーバ(ORCA_CLAIM)に
データを送信するプログラムを作成してます。
ポートとアドレスを指定して送りたいデータを送信し、
ただクローズするだけなのですが、送信後にサーバのステータスが
CLOSE_WAITになったまま消えてくれません。
(# netstat -nap localhost などで確認)
そうなると再送信してもポートが現在使用されていますと出て、
エラーを返すのでとても困っています。
サーバソフトの製作元にもたずねて見ましたが、そんな現象はありえないと
いうお話でしたので、どうもこちら側に決定的な原因があるようです。
状況説明がうまくないようでしたら申し訳ありません。
何か、ありがちなミスなどありましたらご指摘よろしくお願いします。
0154デフォルトの名無しさん
2009/11/09(月) 17:41:200155デフォルトの名無しさん
2009/11/09(月) 17:51:47Option 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:40VBスレの人なら知ってる人いるんじゃない?
0157デフォルトの名無しさん
2009/11/09(月) 19:29:30>>154
うーん。Winsock1.closeはやっているのですが、反応がないようです。
>>155
すいませんサンプルソースまで書いてもらって、助かります。
私のソースもだいたいそのような感じなのですが、見直してみることにします。
>>156
有力情報有難うございます。
そちらの方にも尋ねてみることにします。
0158デフォルトの名無しさん
2009/11/09(月) 20:08:45どちらが先にクローズする仕様なの?
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:250161デフォルトの名無しさん
2009/11/09(月) 23:41:31>>159のシーケンスをちゃんと嫁
0162デフォルトの名無しさん
2009/11/09(月) 23:45:18アホとしか
0163デフォルトの名無しさん
2009/11/10(火) 00:01:16これだとCloseイベントでcloseしたほうがいいかもしれない。
>>155のように
0164デフォルトの名無しさん
2009/11/10(火) 00:32:370165デフォルトの名無しさん
2009/11/10(火) 01:37:03送る側だけまず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> shutdownはwinsockメソッドにはなく、
何言ってるかわからない。
書く側だけまずshutdownしろってのは、
winsockのFAQの初心者向け項目に書いてあること。
0168デフォルトの名無しさん
2009/11/10(火) 23:47:480169デフォルトの名無しさん
2009/11/11(水) 00:04:43双方の FIN → FIN,ACK → ACK のどこまで出てるか見てみたら?
0170デフォルトの名無しさん
2009/11/11(水) 05:43:11お互い良くそれでプログラマって言えるよな。
0171デフォルトの名無しさん
2009/11/11(水) 18:13:12IdComponent,
IdTCPConnection,
IdTCPClient,
IdHTTP
IdException
このへんのコンポーネントってIndyですか?
0172デフォルトの名無しさん
2009/11/11(水) 18:18:280173デフォルトの名無しさん
2009/11/11(水) 18:27:53ありがとう
IdってIndyって意味だったのか
コンポーネントないからビルドできねぇ
0174デフォルトの名無しさん
2009/11/11(水) 23:35:50> CLOSE_WAITになったまま消えてくれません。
サーバ側のCLOSE_WAITは全く関係ない。お前の作ったクライアントがダメなだけ。
> 何か、ありがちなミスなどありましたらご指摘よろしくお願いします。
自分のバグを他人の所為だと思いたがる態度が、初心者にありがちな重大なミス。
bindしてるだろ。
■ このスレッドは過去ログ倉庫に格納されています