トップページ⇒tech
956コメント340KB

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

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001名無しさん@お腹いっぱい。 NGNG
主にソケットに関してのFAQ
0809デフォルトの名無しさんNGNG
ウザくて申し訳ないですが、ageさせてもらいます。
どなたか、よろしくお願いします
0810デフォルトの名無しさんNGNG
一対一でつながるwinsockのサーバーとクライアント両方を作ってます

つながっている状態から、

クライアントがソケットを切断した場合、

サーバー側は、一度ソケットを閉じないで
そのままlistenしても良いのですか?
0811デフォルトの名無しさんNGNG
閉じろ
0812デフォルトの名無しさんNGNG
>>810
接続受付用のソケットとデータ通信用ソケットの違いを理解していない奴が多すぎる
0813810NGNG
じゃあ、
閉じる(closesocket) -> socket生成(socket) -> bind ->
listenで良いのですか?
0814デフォルトの名無しさんNGNG
>>810
acceptで受け取ったsocketは閉じるとして、
bindした方は閉じる必要無いのでは?
0815デフォルトの名無しさんNGNG
>>813

812が言っていることに対して勉強し直せ。
0816810=813NGNG
やっとわかりました。自分の大ボケぶりが恥ずかしい。

1.bind->listen->accept用のソケット(socketで生成)と、
2.acceptで受け取ったデータ通信ソケットということですね

で、2は閉じて、また新たにacceptしなさい
ということですね
0817socksockNGNG
Win98で動作していたwinsockプログラムを
Win2kでビルドし直して動作させたところ、
30分ぐらいで止まってしまいました。

Win2kはSP2を適用しています。(SP1ではBugが…)
SP2でwinsockプログラムがうまく動作しないという噂
を聞いたことがありますでしょうか。
0818デフォルトの名無しさんNGNG
いっさいありません
0819デフォルトの名無しさんNGNG
>>817

OSを疑うよりもまず自分のコードを徹底的に疑いましょう。99.9%は自分のミスです。
0820デフォルトの名無しさんNGNG
WinInetって使えるの?
さっきちょっと調べたら送信要求タイムアウト設定できない
バージョンもあるじゃん。
WinInet使ってHttp転送しよとしてるんだけど、諦めろってことか?
0821デフォルトの名無しさんNGNG
>>819
0.1%もOSに責任があるようなOSなぞ逝ってよし
0822デフォルトの名無しさんNGNG
>821

マターリいこうよ、なっ?
0823デフォルトの名無しさんNGNG
>>821
0.1%って微妙な線だな
Winは45%くらい責任があるしなぁ
BSDくらいか?
0824デフォルトの名無しさんNGNG
>>823
なんでもOSのせいにするなって
0825デフォルトの名無しさんNGNG
大概の場合、自分のミスをOSが許容してしまい、環境が変わると発現する
でも結局ミスしているのは自分
以前、人殺ししたけど捕まらなかったから、また殺したら今回は捕まるのはおかしいと言っているようなもの
0826デフォルトの名無しさんNGNG
↑こいつ何言ってんの????????
0827デフォルトの名無しさんNGNG
>826

>825は>823に文句言ってんの。

分かった?
0828デフォルトの名無しさんNGNG
>>821

その0.1%のバグもほぼ対処法がある。
その対処を知らない/行っていないのはやっぱり開発者の責任。
0829元PGNGNG
>828

そうとも言い切れないと思うけど?

漏れは5年間でメーカーが認めたOSバグに2回遭遇したよ。
(汎用機でね、KシリーズとASシリーズ)
ASのバグなんて、工場のシステム2日間止まって大騒ぎ、保
証騒動になってた。
米国の開発チームにまで話がいったのどうのと聞いた。

OSのバグやと騒ぐ奴に限ってショボミスしてるというのは賛成
する。
大体、開発者のミスだもんな。

上記のトラブル時は、その考え方のせいで対応が遅れたけどな。
0830デフォルトの名無しさんNGNG
ネットワーク初心者なのですが、ソケットとポートに関する質問です。

まず、サーバがポート番号10000を見張っている、並列サーバ
(fork()する、またはマルチスレッド)だとします。サーバは、ク
ライアントから接続要求が来ると、要求を受け付けて、要求を受
け付けるためのプロセスをfork()します。fork()されたプロセス
はそれぞれサーバ側では10000番ポートを利用して通信を行いま
す。

クライアント1: 20000 <- TCP/IP -> 10000 :サーバプロセス1
クライアント2: 20001 <- TCP/IP -> 10000 :サーバプロセス2

ここで、疑問なのですが、要求を処理するためにfork()されたプ
ロセスは、それぞれサーバ側では10000番ポートを利用して通信
を行いますよね。クライアントが複数あった場合、10000番ポー
トに飛んできたデータは、サーバプロセス1に渡すべきかサーバ
プロセス2に渡すべきかどうやって判断するのでしょうか?
TCP/IPでの接続確立とは、こういったセッションの管理を自動で
やってくれるものなのでしょうか?それとも私、根本から勘違い
しています?
0831デフォルトの名無しさんNGNG
>>830
また>>812に該当する奴が出てきたな
0832 デフォルトの名無しさんNGNG
>>812に付け加えるに、
TCPの接続は、
・自分のIP address
・自分のport番号
・相手のIP address
・相手のport番号
の4つ組で識別される。始めの二つだけではない。
始めの二つは同じなのに別の接続、という事があり得るという事。

そして、TCPの接続と(各自分サイドの)socketは一対一対応。
上記の事を知らない人が多い事を見ても、socketはいい抽象化だと思われ
0833デフォルトの名無しさんNGNG
ポートっていくつぐらいあるの?
結構少ないのかなあ
0834デフォルトの名無しさんNGNG
素人です。教えてください。

(スレ立てるまでもない第5弾にも投稿したのですが…)
(こちらの方が、より技術的なレスがくると思い再投稿します)

今まで作業上、
TeraTermを用いてIP経由(TCPポートは任意。仮に6001)でリモートアクセスサーバに
接続後、TeraTermのbreak信号を送出(Alt+b)して遠隔端末にして使っていました。

これと同等のことをperlで実行したいと考えているのですが、
方法がいまいちわかりません。

IO::Socket::INETでソケット作ってそれにbreak信号を流すことで
実現できると考えているのですが、ブレーク信号って具体的にはどうやって送るんだろ?
というところで行き詰まっております。

ex.) printf <$SOCKET_hoge> "break信号??"; # という感じかなーと。

それとももっと別の良い方法があるのでしょうか?

ご指導のほどよろしくお願いします。
0835 デフォルトの名無しさんNGNG
>>834
> TeraTermを用いてIP経由(TCPポートは任意。仮に6001)でリモートアクセスサーバに
> 接続後、TeraTermのbreak信号を送出(Alt+b)して遠隔端末にして使っていました。

相手はtelnet protocolを理解するわけね?

IAC BRKを送る。"\255\243"
http://www.iij.ad.jp/pub/RFC/rfc845.txt
0836デフォルトの名無しさんNGNG
File Not Found
?
0837 デフォルトの名無しさんNGNG
>>835
> http://www.iij.ad.jp/pub/RFC/rfc845.txt

ftp://ftp.iij.ad.jp/pub/RFC/rfc854.txt

でした。(記憶で書いたたら番号も間違えていた…)
0838デフォルトの名無しさんNGNG
>>835

いまさらながら、
RFCと2chのありがたみを感じております。

(RFCを真剣に読もうとしなかったあっしが恥ずかしいです。)

感謝。多謝。
0839デフォルトの名無しさんNGNG
telnetあげ
0840デフォルトの名無しさんNGNG
ネットワークプログラミングの練習もかねて、
TFTPのサーバプログラムを作ってみようと思うのですが、
参考になるサイトや書籍、
もしくは、ソース公開してるフリーソフトで参考になりそうなもの、
なにか知りませんか?
0841デフォルトの名無しさんNGNG
>>840
tftpd.cそのもの。BSDやLinuxにはついてくる。
0842デフォルトの名無しさんNGNG
>>840
http://RFC.net/rfc1350.html
このくらい自分で探せや
0843デフォルトの名無しさんNGNG
共有メモリを使うと、セマフォもだいたい同時に使うのですが、
セマフォの使い方がよくわかりません。
POSIX, SYSV,形式それぞれについて教えてください。

ネットワークプログラミングIPC編は読みました。
それでも、サパーリです。
0844 デフォルトの名無しさんNGNG
>>843
> セマフォの使い方がよくわかりません。

原理が分かってないのだから、OSの原理/基礎の本を読め。
0845-NGNG
>共有メモリを使うと、セマフォもだいたい同時に使うのですが、
>セマフォの使い方がよくわかりません。

だいたい同時に使ってるのに使い方がよくわからないのか??
0846デフォルトの名無しさんNGNG
データ送受信用socketが接続状態の時、
サーバ側からshutdown -> closeというのは、
本来やってはいけない事なのでしょうか

win32でこれをやった場合、特に問題なかったのですが、
winCEでこれをやったら動作がおかしくなってしまうのです
(その後、新しいsocket生成はできるのだが、connectができない
リセットかけるまで復帰しない)

かならずクライアント側から先に
shutdown -> closeしなくてはいけないのでしょうか?
0847デフォルトの名無しさんNGNG
>>846
>>794
0848デフォルトの名無しさんNGNG
>>794のサイト(・∀・)イイ!! thnx>847
0849  NGNG
特定のアプリケーションの行っている通信パケットを監視するには
どうやればいいんでしょうか?
本屋であさってみたものの、どれもピンとくるものがなくって・・・
0850デフォルトの名無しさんNGNG
パケットモニタを使ってみるとか。
http://www.vector.co.jp/soft/winnt/net/se136129.html
0851デフォルトの名無しさんNGNG
winsockで、
一度にsendして良いサイズの基準って、なにかありますか?

何も考えずにそのまま、最大2Mくらいのものを一度にsendしていたのですが、
(有線の)LANでは特に問題なかったのですが、
(しかも、sendの戻り値を見ると、一回のsendで送れてしまっているようである)
無線LANで使用したら、
sendすると固まってしまい、しばらく(数十秒)してタイムアウトで返ってくる、という事が
多く発生するようになりました
それで、分割して(たとえば2kくらいとか)sendするようにしたのですが、
そしたら固まる確率はかなり減ったのですが、やっぱりたまに固まりがおきてしまいます

無線LAN自体の問題でしょうか?
0852デフォルトの名無しさんNGNG
>>851
たしか、8kか16kだったような。
0853デフォルトの名無しさんNGNG
>>851
ただ、分割してるだけ?
2k送ったら1バイトのackを受信って感じでどうかな?
ちょっと遅くなるかもしれないけど。
0854デフォルトの名無しさんNGNG
バッファの量を取得する関数を使え
あとは自分で調べよ
0855デフォルトの名無しさんNGNG
>>854
ヒントくださーい。
0856ヒントNGNG
おぷと
0857デフォルトの名無しさんNGNG
>>856
もう一声!
0858デフォルトの名無しさんNGNG
getsockopt
SO_MAX_MSG_SIE
0859デフォルトの名無しさんNGNG
追加(Stream)
SO_RCVBUF
SO_SNDBUF
0860デフォルトの名無しさんNGNG
>>858, >>859
これ、どう使えばいいんですか?
0861デフォルトの名無しさんNGNG
>>860
調子に乗るな、いい加減にしろ
0862デフォルトの名無しさんNGNG
>>861
なーんだ、知らないんだー
0863デフォルトの名無しさんNGNG
>>862
さようなら、そしてもう来るな
0864デフォルトの名無しさんNGNG
>>863
プログラマーはすぐ怒るんだから。こわっ
0865デフォルトの名無しさんNGNG
ポート番号10000って、何に使われる事が多いですか?
使わない方がよいですか?
0866デフォルトの名無しさんNGNG
問題ない、良きに計らえ
0867デフォルトの名無しさんNGNG
厨房よ、無知をさらけだして
みっともない恥じをカクコト莫れ

すっこめウンこ厨房
0868デフォルトの名無しさんNGNG
FAQ スレで厨房に説教タレル工房発見
0869デフォルトの名無しさんNGNG
>>865
> ポート番号10000って、何に使われる事が多いですか?
> 使わない方がよいですか?

http://www.iana.org/assignments/port-numbers読め。最後の部分もな。

> 何に使われる事が多いですか?

「多い」とか「多くない」の問題じゃないよ。自由に使っていいport番号は決まってる。
お前がICQ.comの馬鹿技術者なら別だけど。
0870デフォルトの名無しさんNGNG
>>863
けっきょくマニュアルに載っていること以外は答えられないのね.
0871デフォルトの名無しさんNGNG
初心者なんですが、socket()-bind()、sendto()-recvfrom()の
ソケット通信を行うプログラムでWindows98とNTでの違いはあるんでしょうか?
実は98上で動いたものがNT上で動かなくて困ってるんですが...。
0872デフォルトの名無しさんNGNG
>>870
つか、マニュアルの読み方くらい覚えてから来い。
そこから教えてたんじゃ玉欄。
0873デフォルトの名無しさんNGNG
>>870
これだけヒントをもらった上に、偉く時間が経っているにも関わらず、
未だに道に迷ってうろついている方向音痴のあなたに乾杯!
永久に遭難していた方が世のため人のため。
0874デフォルトの名無しさんNGNG
質問です。
「UNIXネットワークプログラミング」で紹介されている
socketやconnect等のラッパー関数であるSocketやConnect関数は
どこかにソースがあるのですか?
あるのだとしたらどのディレクトリの中にあるのか教えてください。
お願いします。
0875デフォルトの名無しさんNGNG
>>874
11ページを見よ。
0876デフォルトの名無しさんNGNG
>>875
どうもどうも。
0877デフォルトの名無しさんNGNG
netstat -e
で取得できる送受信バイト数と同様な値をプログラムから取得したいのです。
SNMPを使う事まではわかるんですが具体的な手順を教えてください。

あ、Win9xとWin2000のVC6です。
0878デフォルトの名無しさんNGNG
netstat逆汗しれ
0879デフォルトの名無しさんNGNG
>>877
http://www.sysinternals.com/files/netstatp.zip
0880877NGNG
>>879
サンクスね

あと、Google検索で色々調べてたら見つかりました。

http://www.codeguru.com/mfc/comments/26225.shtml
http://www.zdnet.co.jp/help/howto/linux/0007master/06/

何とか目的の物が出来ました。
0881デフォルトの名無しさん NGNG
php覚えやすい言語だけど索引もろくに使えないようなへたくそな本などが多くて無駄手間がかかる。
学生(20歳)
0882デフォルトの名無しさんNGNG
>>881
板違い?
http://pc.2ch.net/php/
WEBプログラミング@2ch掲示板
0883kevin hikinikNGNG
マジで聞きます。

tracertがUDPを利用してるとかICMPを利用してるとか・・・
どゆこと?

プロトコルに基づいてる!?
コードになりゃみんないっしょじゃんか・・・。
用はソケットなりストリームなりを使えばいいだけじゃん。

システムが全治2週間ほどあるんで、見ようにも見れんし。
プロトコル専用のヘッダやライブラリがあるわじゃないっしょ?
プロトコルに基づいて実装するってどゆこと?
0884デフォルトの名無しさんNGNG
>>883
マジなのか?
もう少し勉強してから質問したほうがいいぞ。
それか、質問する時の言葉遣いを覚えろ。
0885kevin hikinikNGNG
すみません、先敗どの!

勉強いっぱいしました。

実装してないだけだい!

頼むから教えろ。
0886デフォルトの名無しさん NGNG
winsockの非同期で、sendで送信中のデータ数をリアルタイムで
知るにはどうしたらいいの?
0887デフォルトの名無しさんNGNG
>>886
小出しにして送信できたバイト数をカウントしなさいYO!
0888デフォルトの名無しさんNGNG
>>883
プロトコルをプログラミング言語か何かだと誤解してるような。
0889デフォルトの名無しさんNGNG
>>883
プロトコルという言葉の意味を考えてみよう。
0890デフォルトの名無しさんNGNG
>>887
小出しにすると送信速度遅くならない?
0891デフォルトの名無しさんNGNG
>>885
「PGなのに知らなかった事を潔く質問してみるスレ」で解決できたんじゃないの?
http://pc.2ch.net/test/read.cgi/prog/1002086817/643-656
0892デフォルトの名無しさんNGNG
UNPを理解していれば旧ネスペも簡単?
本当は資格の勉強なんかしたくないんだけど簡単なら取っちゃおうかなと思ってるのですが・・
0893( メ ´Д`)<893 ◆HHJeUSD6 NGNG
893get
0894質問。NGNG
TCP転送で、sendの方の文字列の大きさとして、
recvの方を固定サイズにした場合、2回以上send
すると正しい文字列でrecvできませんよね?

これを正しく受信するにはどうしたらよいですか??
場合わけしようにもかなりあるような気がして。

send回数は1〜何回でも連続でするものとします。
0895デフォルトの名無しさんNGNG
>>894
可変長のデータをやりとりしたい時は、
最初に長さを送るのが簡単だとおもいます。

それか受けとった後に'\0'を探して…
0896質問。NGNG
>>895

ありがとうございます。でも、
他の方法ってありますか?
0897デフォルトの名無しさんNGNG
数値計算のプログラムをCで書いてるのですが、
結果をグラフで逐次表示したいんですが何か良い方法を
教えて下さい。
0898デフォルトの名無しさんNGNG
>>897
それはネットワークプログラミングと、どのような関係がありますか?
0899デフォルトの名無しさんNGNG
>>894
いまいち言いたいことが分からんけど。

(1)相手が1回目のデータをすべて受信できたことを確認してから2回目のデータを送る
(2)データサイズを固定長にしておく
(3)データを見ればどこで切れるか分かる構造にしておく(データサイズを送る、データを\0で区切る、など)
の、どれか。
0900質問。NGNG
>>899
説明不足ですみません。
sendする文字サイズは文字の長さなので可変長です。
recvする文字サイズは固定長です。

んでもって、sendとrecvが1:1に同期しながら
動かしているんで・・・。(^^;

ありがとうございました。
0901デフォルトの名無しさんNGNG
>>899
sendとrecvが1:1に同期しながら動く?
それは、そもそも無理では?

1回のsendで送ったデータが、2回以上のrecvに分割されるかもしれない。
2回のsendで送ったデータが、1回のrecvで受け取れるかもしれない。

このへんは何も保証されないので、データサイズを送信するなりしなければ、解決になりません。
0902901NGNG
↑ >>900 の間違い
0903デフォルトの名無しさんNGNG
>>898
きっと、計算プログラムとグラフプログラムがあって、その間を
ネットワークで繋いで逐次表示させたいんだよ。だけど、tcp/ipか
udp/ipか、HTTP tunnelingか、RPCかDCOMかの何を使えばいいかで
迷っていたりするんだよ(ワラ。
0904デフォルトの名無しさんNGNG
>>903
UDP/IP っていう言い方、あんまし聞かないな・・・
とりあえず TCP でいいんじゃない?
0905905NGNG
はい、質問!
通信対戦っぽいソフト作ってるんですが、
HTTPプロキシを通して出来ないかと試してみたら、
POSTが効かなかったり、バッファリングしたりしやがりまして、
なかなか上手くいかないんです。
なんか良い方法をご存じの方いらっしゃらないでしょーか?
1回データをやりとりするたびに
HTTPを繋いだり切ったりするしかないんでしょーか?
0906デフォルトの名無しさんNGNG
パフォーマンスの要求されるsocketアプリケーションをPCで開発・運用する場合、最も高速なOSは何でしょうか?
とりあえずWin+cygwin/Winsockを考えているのですが。
0907デフォルトの名無しさんNGNG
>>906
OSが高速でも、ネットワーク回線自体の伝送速度で制限を受けるので、意味ないです。
10Mbps の回線では、どんなOSを使っても 10Mbps しか出ないのです。

・・・それとも、ネットワークとは関係なく、単にCPUパワーを得たいだけ?
0908デフォルトの名無しさんNGNG
>>906

Windows2000Server+Winsock2+完了I/Oポートを使って組むやり方が
Windowsだと最もパフォーマンスが高い。
マルチプロセッサ対応もさせやすいのでCPU毎に得意な処理を分散可能だ。

ただしライセンス料もべらぼうに高い(w
レス数が900を超えています。1000を超えると表示できなくなるよ。