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

このエントリーをはてなブックマークに追加
前スレに引き続き、主にソケットに関しての質疑応答スレです。

過去スレ:
ネットワークプログラミング相談室
http://pc.2ch.net/test/read.cgi/tech/970344582/

ネットワークプログラミング相談室 Port2
http://pc.2ch.net/test/read.cgi/tech/1006258198/
乙!
さっそく質問なのですが、MFCのCSocketをワーカースレッドで使っています。
このCSocketのConnectなどで処理が止まっている(ように見える)とき、
処理を中止させるには普通、どのような方法をとるのでしょうか?
CancelBlockingCallを呼べばよいのかと思うのですが、
メインスレッドからワーカースレッドのCSocketに対してどのように
CancelBlockingCall呼び出せばよいのかがわかりません。
普通にメソッドをcallすればよし。
プロセスが同じだからメモリ空間も共有される
>>4
メインスレッドからCancelBlockingCallを呼ぶという方向性でよかったのですね。
ですがその呼び方がわかりません。
// ワーカースレッド
UINT ThreadFunc(LPVOID pParam)
{
 CSocket socket;
  :
  :
 socket.Connect(strAddress, nPort);
  :
 return 0;
}
のようにやっているのですが、このsocketにはメインスレッドから
どうやってアクセスすればよいのでしょうか。
>>5
一番簡単なのがグローバルにすること。
後は、スレッドのクラス化をして、オブジェクトの参照を返すなりお好きなように。
>>6
あ、なるほど・・・
一所懸命外からアクセスすることを考えてました。
socketの方を外にだしてやればいいんですね。
8デフォルトの名無しさん:02/06/07 00:17
つーかCSocketは糞だから使うなと前スレに
用途によるんじゃないの
10デフォルトの名無しさん:02/06/07 05:24
前スレからの続き。
http://pc.2ch.net/test/read.cgi/tech/1006258198/932-

Telnet つかってみましたが、不便なので嫌です。
Perlは嫌いです。
25ポートを使ってメールの送信は出来ました。

APOP認証は110ポートにつなげてやっています。
ポートを開いた後、AUTH をすると下記のようになりました。
これは APOP に対応しているのでしょうか?

+OK Qpopper (version 4.0.3) at hogehoge.ne.jp starting. <[email protected]>

+OK Supported SASL mechanisms:

X-NONE-SO-USE-APOP-OR-STLS
.
>>10
お前が嫌いだから答えない
12前スレ977:02/06/07 17:40
>>前スレ984
受信したデータを調べてみたら、今までどっかに消えてた部分が見つかりました。
というのも、受信したデータのなかにおそらく'\0'のような文字があり、
データ確認のためにメッセージボックスを使ったりサイズ取得にstrlen()を使っていたため、
保存するサイズ等の計算をミスしていたものと思われます。
ルーチンを組みなおしてやってみたら成功しました。
本当にありがとうございました。
バイナリデータにstrlen()かよ!!
センス無いな・・・<バイナリデータにstrlen()
文字列をつかったインターフェースはunix文化からの伝統ですが何か?
自分が扱っているデータの種類(バイナリ)や関数の機能(strlen)も理解せずに
プログラミングすのもunix文化からの伝統ですか?
ネットワークプロトコルに不定長文字列をふんだんに盛り込むとunix的。
buffer overflowはunix文化の象徴と言えましょう。

プログラムの設定ファイルを空白、改行区切りの生テキストにするとunix的。
buf(以下略)

インターネットの発達はunixによって支えられてきました。
全てのレイヤ5以上のプロトコルは文字列志向に置き換えるべき。
ネトゲのプロトコルが文字列だったらゲームに並んだろうな
もしかして、 char型の配列の事を全て「文字列」って呼んじゃう人ですか?
DNSもPOP3もSMTPもHTTPもFTPも文字列志向だな
バイナリデータの受信に関する部分を、
プロトコルとして議論しているのは何故ですか?

FTPで、
ftp> binary
200 Type set to I.
ftp> get hoge.tar.gz
したあとも文字列志向ですか?
2210:02/06/08 04:09
どうして嫌われたのでしょうか?
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪
24デフォルトの名無しさん:02/06/08 05:11
もうテメーらの質問には答えないから覚えておけよ!
不定長文字列と固定長バイナリが混ざってるプロトコルなんてサイアク
>>21
おまえはftpを勉強なおしたほうがよいと思われ。
27デフォルトの名無しさん:02/06/08 12:15
Windowsで現在の接続のTCP/IP設定から
DNSの設定の情報を取得する方法はありませんか?
28デフォルトの名無しさん:02/06/08 12:37
(゚д゚)ポカーン
29疑問太郎:02/06/08 12:50
プロトコル開発でモデルになるシステムはなに?
過去スレ読むと
トーシローの輩が回答してるね
クサレプログラマの憩いの場か(藁
>>30
間違った回答があるってこと?
たとえばどれ?
unix文化を軽視する奴は許さん。
蛇足かもしれないがTCP/IPのsocket APIはBSD文化と言っていい。
だからお前等はBSDを勉強すべきであってwindowsやlinuxなどという
劣化コピー品を参考にすべきではない。
バクとウィはおんなし奴が作ったんだから中身はおなしやで

リヌはハナデカがつくたけどさ
winsock2はそうでもないような・・・
linuxの微妙な違いはイライラする
uni文化はもう止まっとる(藁

リヌは、、、、(ププ

ウィはブッチギリでしょう
たしかにバカがいるな
ソケット通信で構造体のデータを丸々投げたり受け取ったりって
出来ないんですか?今はデータを文字列として送受信してます。
>>37
できるけど、やるとトラブルの種。
>>38
そうなんですか、結構データの量が多くて文字列に直して送受信するのが面倒で。
データを工夫して量を減らさないとだめかなぁ・・・。
構造体だとメモリ上の隙間ができたりするしねー
後、バイトオーダも気をつけないといかんしねー
>>39
文字列にしなくても、バイトオーダーを決めて(ビッグエンディアンが「ネットワークバイトオーダー」)、
バイナリで送ってもいいっしょ。

構造体そのままだとバイトオーダーの他にアラインや型のサイズの不一致もある。
将来の拡張にも弱い。

そのあたりを意識してればいいんでは。
>>41
難しそうですね^^;。もうちょっと勉強してきます〜。
43デフォルトの名無しさん:02/06/09 22:20
バイトオーダーってなんですか?
エンディアンとも言う
46デフォルトの名無しさん:02/06/11 00:31
winsockでサーバー、クライアントのプログラムを作っています。
プロトコルはUDPで同期通信方式とマルチスレッドを使っています。
クライアントからサーバにデータを送信した後にサーバーから
データを送信しているのですが、頻繁にsendtoでエラーが起こります。
WSAGetLastError()でエラーを調べてみると「10047 WSAEAFNOSUPPORT」らしいのですが、
ずっとlocalhostで通信を行っているので途中で変ったりしないはずなんですが。
エラーも最初の送受信で発生したり、数回送受信をした後に発生したりとランダムに起こります。
クライアントからサーバへのデータは届いていることは確認できます。
考えられる原因があれば教えていただきたいです。
buffer overrunでいろいろ変な風にかきかわってるとか。
48ななし:02/06/11 10:16
struct sockaddr書き潰してるんでしょうな。
49試行錯誤中 ◆.t4dJfuU :02/06/11 11:49
スレ違いでしたらすいません&最適なスレをお教えください。

現在、wininetを用いてCGIに引数を渡すプログラムを作ってます。
言語はVC++です。
一応、CGI側では渡した引数を受け取ってはくれてるのですが何故か、
最後の引数の後ろに/を勝手に補完してくれます。


 http://www.hogehoge.com/hoge.cgi?value1=123&value2=456

上記例の結果(環境変数)
 QUERY_STRING = [ value1=123&value2=456/ ]

# 456の後ろの/が余計


 これは何故でしょうか?
 どうしても原因が分からず悩んでいます。
 どなたかお分かりになる方がいらっしゃいましたらお教えください。
 お願いします。
50試行錯誤中 ◆.t4dJfuU :02/06/11 12:01
因みにHttpOpenRequestでGETしております。

HINTERNET hConnect = InternetConnect(
 hSession,
 url,    // www.hogehoge.com/hoge.cgi?value1=123&value2=456
 INTERNET_DEFAULT_HTTP_PORT
 NULL,
 NULL,
 INTERNET_SERVICE_HTTP,
 NULL,
 NULL);

HINTERNET hRequest = HttpOpenRequest(
 hConnect,
 "GET",
 NULL,
 NULL,
 NULL,
 NULL,
 INTERNET_FLAG_RELOAD
 0);
51デフォルトの名無しさん:02/06/11 12:38
>>49
セッション張るのはwww.hogehoge.comに対してで、CGIやパラメータは
HttpOpenRequestの方で指定するとかかも
52試行錯誤中 ◆.t4dJfuU :02/06/11 12:55
>>51
レスありがとうございます。
当方、よく分からずにネット上で色々と検索しながら組んでいる最中です。

HttpOpenRequestですが、CGIに渡すパラメータを設定する部分が無いように思えますが、
どうでしょうか?
また、関係ないかもしれないですが試しにHttpSendRequestのOptionalにパラメータを設定してみましたが、
それだと、そもそも引数を渡せませんでした。

# まぁ、POSTやPUTで使用するパラメータみたいですし>HttpSendRequestのOptional

何分、よく分かってないのでマヌケなことを聞いてるかも知れませんが、ご教授お願いします。
53試行錯誤中 ◆.t4dJfuU :02/06/11 13:01
>>51
すいません。
HttpOpenRequestのObjectNameパラメータで指定すればいけるようです。
ありがとうございました。
54デフォルトの名無しさん:02/06/12 14:58
同期socketで質問です。
任意のタイミングで、データを受信せずにコネクションが
切断されたことを検出する方法はありませんか?
任意のタイミングでと書いたのは、
シグナルやメッセージではなく、自分から関数を呼び出して取得したいと言うことです。
recvのMSG_PEEKフラグを利用しろ。
>>56
ありがとうございました、すっかり忘れてました。
>>56
それは何ですか?
windowsでチャットプログラムを作っています
telnetでテストをしたいのですが、win版telnetには「一行を送る」という方法はないのでしょうか?
オプションを見た限り見当たらないのですが・・・
TELNETver1.0です
もしできないのなら、何かフリーのtelnet接続ができるスタンダードツールを教えていただければ幸いです
(検索したけどWindowsCE用テ…)
>>59
teraterm pro
teratermに1行送るってあったか?
久々に起動してみたがみあたらん・・・
62デフォルトの名無しさん:02/06/14 16:33
Winsock1.1の制限について解説しているサイトありませんか?
Winsock2.0ばかり使用していて、1.1について覚えてないので、
互換性の問題が出てる可能性があるので、調べたいんです。

win95上でテストすると言う方法も勿論あるのですが、
違いの概要程度は把握していたいので。
IPメッセンジャーって、LAN内で立ち上げると自動でユーザーリストが追加されていくけど、どうやって実現してるの?
TCPやUDPだけじゃ出来ないよね?
>>63
UDPでブロードキャスト送信だよ
>>63
UDPにはブロードキャストという機能がある
LAN内の全てのアドレスが対象になるアドレス
255.255.255.255にsendtoする
LunixとWindowsで使えるC++用のクラスライブラリってありますか?
>>65
255.255.255.255とはかぎらんのでは?
IPADDR | ~NETMASK ダロ
>>68
自分の居るLANのブロードキャストアドレスは、
INADDR_BROADCAST=255.255.255.255から取得するんじゃないの?
localhostを取得するのに127.0.0.1を使うようなもんで。
7166:02/06/14 23:34
>>67
サンクス。 使ってみます。
>>70
255.255.255.255は全アドレスに対するブロードキャストだよね。WANも含む。
実際にはルータが止めるだろうけど、
複数のネットワークインターフェイスがある場合、そのすべてが対象になってしまうよね。

基本的には目的のネットワークインターフェイスの情報からbroadcast addressを得て
そこ宛に送信するのが行儀がいい方法。
TCPでのサーバ、クライアント作ってますが
クライアントがサーバへconnect処理を行うときに
サーバがまだ起動していないときにconnectを行っても
エラーが出ません。普通ですか?
>>72
知らなかった・・・
ブロードキャストフラグ立ててINADDR_BROADCASTにsendtoしてたよ・・・
IPメッセンジャクローンのどれかを参考にしたから、
その参考にしたやつもそうなってた。あんまりお行儀よくなかったのね(´・ω・`)

>目的のネットワークインターフェイスの情報からbroadcast addressを得て
これどうやるの?gccでのやりかた教えてください
75ななーしさん@接続しっぱなし:02/06/15 12:21
>>74
IPアドレスとサブネットマスクから計算できるんでないの?
こにちわー
ひとつ教えてください。
WINDOWSでsetsockopt関数の第3引数に2をセットしているのですが
エラーが帰ってきてしまいます。
OSの仕様でしょうか?
過去ログ見たんですが
・非同期ソケット
・非ブロックソケット
って別物ですよね?
MSDNミロ。

>BSD options not supported for setsockopt are shown in the following table.
>SO_ACCEPTCONN, BOOL, Socket is listening
>79
ありがとー、2日間の悩み解決です。
これで、心置きなく次の課題に移れます。
>>74

Programming UNIX Sockets in C からの引用。
>SIOCGIFCONF を使ってアクティブなネットワークインターフェースの
>リストを取得し、SIOCGIFFLAGS と SIOCGIFBRDADDR を使って
>ブロードキャスト可能なインタフェースを特定し、
>ブロードキャストアドレスを得る

インターネット 256 倍 Vol.2 にものってる。
でも面倒くさい…。
82デフォルトの名無しさん:02/06/16 12:17
http通してgoogleのhtmlファイルを取得しようとしたら、

<HTML><HEAD><TITLE>302 Moved</TITLE></HEAD><
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.jp/">here</A>.
</BODY></HTML>

って感じのreturnが帰ってきました。正常にhtmlファイルを取得するには
どうすればよいのでしょう?

送ったヘッダは send(theSocket, "GET /\n", 256, 0);だけです。
同じコードを使ったらyahooとvectorは取得できました。
それはhttpを通したとは言わないな
ヘッダの作り方なんてここの過去スレでも何度も出てるし
それからsendの第三引数もアレだ
高速DLのftpソフトを作りたい質問です

100倍速ぐらいのをつくりたいんですけど
VCのサンプルおちてないですか?
>>83
適当にやってたらあかんのですね。
ヘッダと第3引数しっかり設定したら上手くいきました。感謝。
82って場合によってはAccessViolationじゃないの?
>>84
適当なソースからコピペするんじゃなくて、仕様書や規格書を頭の中にたたき込んでからにしろ。
何でRFC読まないでインターネット関連のプログラムを作ろうとする人間がいるのか和下欄。
RFC読んでも意味わかんないYO!
そういう奴は中学生からやり直すか、
作るのをあきらめてください。
HTTP1.1のRFCでかすぎ
HTTP/1.1のRFCはでかいけどよくまとまってるから良い。
たとえばメール関連のRFCは、ここのテキストは小さいが
記述が分散していてあちこち読まにゃならん。
通信は相手あってのものだし、"交通ルール"(RFC)の無知は罪。
RFC信者ハケーン
RFCがルールだなんて誰が言ったのかしら、ねえ?
>>93
IETFが・・・
RFCはルールですが、何か?
ルールだったら「RFC」という名前じゃないでしょ。
デファクトスタンダードってやつだ
9885:02/06/17 08:25
……と思ったら、一部のサーバ相手に上手くいかないみたいです。
http://supporter.s1.xrea.com/ に対して、プログラムを動かしたところ、

HTTP/1.1 302 Found
Date: Sun, 16 Jun 2002 23:20:53 GMT
Server: Apache/1.3.24 (Unix) mod_layout/3.0.3 mod_gzip/1.3.19.1a
Location: http://www.xrea.com/err403.htm
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
X-Pad: avoid browser bug

と言われました。ブラウザから見たところ、ファイルは存在していました。

std::string request =
    "GET / HTTP/1.1\r\n"
    "Accept: */*\r\n"
    "User-Agent: Hoge\r\n"
    "Host: www.xrea.com\r\n"
    "Connection: close\r\n"
    "\r\n";
send(sock, request.c_str(), request.length(), 0);
RFC全てが必ず守らなければならないルール(Internet Standard)なのではありません。
# 他にはExperimental, Informational, Historic, Best Current Practiceなど。

RFC2616, HTTP/1.1はstandardですから守りましょう。
詳しくは、RFC2026, The Internet Standards Process -- Revision 3や
http://rfc-jp.nic.ad.jp/introduction/を
各RFCのstatusはrfc-index.txtで一覧できます。

>>96
氏ねや
>>97
違う。公式のルール。
>>98
Host: supporter.s1.xrea.com
85は次に、Chunked-encodeされたbodyについて
「変な文字が混入して困っています」と言うぅっッッ!
>>101
ここは85にゼロからhttpプロトコルを教えるスレになったと言うことでファイナルアンサー?
103デフォルトの名無しさん:02/06/17 20:55
.
>>102
ftpプロトコルかもしれないし、scsiインタフェースかもしれないし、usbバスかもしれない。
しかし、telnetプロトコルじゃなければ、IEEE1394インターフェースでもないし、pciバスでもないだろうね。
>>104
デムパ?
プログラムでフレームを立てて、そのフレームで書いた文を
このスレに書き込めるようなプログラムはどのように書けばいいのでしょうか?
は?
>106
最初の「プログラムで」は余計でした。
フレームって何だよ
<FRAME> - <FRAMESET> - </FRAME>
を自動生成したいのだと思われ
webprog板だろ
>>104
ワラタ
>>104
> telnetプロトコルじゃなければ、

じゃなければ、て(w
114デフォルトの名無しさん:02/06/18 14:04
パケットからパケットの到着時刻を知るには、どうしたら
いいでしょうか?
udp/ipなら、recvしたとき、time()でも、gettimeofday()でも
好きなのを発行すればいいとおもう。
今ごろ104の言いたいことが分ったよ!
カフェオレ牛乳でも飲むよ!
>>116
おれ、102だけどサッパリわからんぞ、教えてくれ
116じゃねーけど。
HTTPのPはProtocolのPだってことでしょ。
Ftpのp、SCSIのI、usbのb。
あー、そういうことかなるほど。
NTテクノロジね
120デフォルトの名無しさん:02/06/19 10:45
Linux&Cでサーバプログラムを作っているのですが、
バッファオーバーランなどのセキュリティーホールをふさぐ為の
設計・コーディングについて解説してある本はありませんか?
>>120
いや、単にバッファを可変長にするかアフォみたいに大きくするかデータ読み出しの時点であるサイズ以上は素来診具する。
122 ◆.t4dJfuU :02/06/19 10:49
お世話になります。

VC++でWinInetを使ってWEBサーバにアクセスするPGを作ってます。
プロトコルはhttpです。

存在しないサーバに対してHttpSendRequestを行うとエラーになるので、
逆に、ここでエラーになった場合はサーバが見つからなかった、ということで
逃げようとしてます。
問題は、サーバは存在しているがページが見つからなかった(若しくはアクセス不可)
場合です。
InternetReadFileで読もうとしてますが、404とかのエラーコードを認識するには
どうしたらいいのでしょうか?

どなたか教えて下さい。お願いします。
123 ◆.t4dJfuU :02/06/19 11:08
HttpQueryInfoで調べられますでしょうか…?

# これからテストしてみます。
>120
djbのトコトカ http://cr.yp.to
esehttpdにもそんな謳い文句があったなぁ……
125120:02/06/19 12:26
>124
読んでみます。ありがとうございました。

あとこんなのを見つけたのでとりあえず買ってみます。
Windows/.NET向けの書籍のようですが。

プログラマのためのセキュリティ対策テクニック
http://www.microsoft.com/japan/info/press/JPN_ViewMsPress.asp?Book_id=822&list_id=1

バッファ オーバーランを解消せよ!
http://www.microsoft.com/japan/msdn/columns/secure/secure05202002.asp
126123 ◆.t4dJfuU :02/06/19 12:58
うまくいきました。
スレ汚しですいません。
127名無しさん@Meadow:02/06/19 16:03
>>120
これはわりと良い、と某所で聞いた。
http://www.ipa.go.jp/security/awareness/vendor/programming/index.html
128デフォルトの名無しさん:02/06/19 23:08
>>115
recvfrom()直後にtime()で得た時刻が正確なパケットの
到着時刻って理解していいんでしょうか?
初心者なものですみません。
>>128
何をもって受信時刻とするかによるが
recvfromで得られたとき、というのが実際妥当なところ。
それ以前の部分は中経路と考え、プログラムに到達したときとなる。
130デフォルトの名無しさん:02/06/19 23:49
>>129
ありがとうございます。
しかし、ループの中にrecvfrom()があると、パケットは送信側から
どんどんくるのに、recvfrom()で得られた時刻が受信時刻って
あんまりしっくりこないなぁと思いました。
Linuxでサーバー、widowsでクライアントという
形を取るときに送受信で気を付けることあります?
>>131
改行コードと漢字コードくらい。

後は何も気にしなくて良いところがプロトコル。
133131:02/06/20 01:31
>>132
なるほど、ソケット通信様々ってところでしょうか。
134ななーしさん@接続しっぱなし:02/06/20 01:53
>>120
StackGuard を使う。
http://www.immunix.org/stackguard.html

んじゃ。
一応、エンディアンも追加しておく。
136デフォルトの名無しさん:02/06/21 09:33
Winsockでrecv関数にタイムアウトを設定したいのですが
できますでしょうか?
もし、やりかたがあったら教えていただきたいのですが。
137136:02/06/21 13:18
これでよいでしょうか?

struct timeval timeout;

timeout.tv_sec = 60;
timeout.tv_usec = 0;
ret = select(0,NULL,NULL,NULL,&timeout);
if (ret == 0){
printf("タイムアウト!\n";
return;
}
ret = recv(s, buff, sizeof(buff), 0);
>>137
selectの第二引数を調べてくれ
139名無しさん:02/06/21 23:41
ソケットプログラムの勉強をしていますが、以下の処理について
何か良い方法があれば教えていただけるとありがたいです。
で、その処理ですが、ひたすらwrite()でデータを送る。
ただし、相手がビジーになったときに、その理由(バッファフルなど)を
送ってくるので,そのような時はread()で読みたい。
というものです。
このような時は、write()でブロックされてしまわないように
fcntl()を使って、NONBLOCKINGモードにしておいて、
write()とread()をループさせようと思いますが
どうでしょうか。
あと、NONBLOCKINGモードの設定とかで注意点とかあればお願いいたします。
>>139
私だったらスレッドで分けちゃいます
selectでタイムアウトを0にしてループ回せば?
142デフォルトの名無しさん:02/06/22 00:07
>>139
selectは読み込み、書き込みの両方を同時に待機できるよ。
readfdsとwritefdsの両方にfd_setを指定すれば、
読み込み可能になるか、書き込み可能になったら復帰する。

int status;
do {
 fd_set rdfds;
 fd_set wrfds;
 FD_ZERO(&rdfds);
 FD_ZERO(&wrfds);
 FD_SET(fd, &rdfds);
 FD_SET(fd, &wrfds);
 status = select(fd + 1, &rdfds, &wrfds, null, null);
} while (status < 0 && errno == EINTR);

if (FD_ISSET(fd, &rdfds)) {
 /* 読み込み可能 */
}

if (FD_ISSET(fd, &wrfds)) {
 /* 書き込み可能 */
}

>>141の方法だとCPUに負荷がかかるからやめた方がいい。
143名無しさん:02/06/22 00:40
ありがとうございます。勉強になります。
>>142
データを送信し終えるまで、このプログラムをループさせれば
良いということですね。
ん?そうすると、141さんのタイムアウト0でループさせるのと
一緒に思えますが、何か思い違いでしょうか。
fd + 1って1じゃないの?
>>143
読み込み、書き込みどちらかが可能になるか、エラーが返るまでブロックする
146名無し:02/06/22 00:51
>>140
スレッドでわけても、writeでブロックされている時は、
別のスレッドでもreadできないのでは?
>>143
>ん?そうすると、141さんのタイムアウト0でループさせるのと

それはいわゆる busy loop というやつで、全速力で回るとCPU時間を
100%消費することになる。マルチタスクなOSでは好ましいスタイルとは言えない。

>>144
伝統的なbsd socketにおけるselectの第一引数には、
fdsetにセットしたfd(を整数値とみなしたときの)の最大値+1を入れる。
ちなみにwinsockでは無視されるから注意しよう。
>スレッドでわけても、writeでブロックされている時は、
>別のスレッドでもreadできないのでは?

ふつうのsocketの実装なら、writeとreadは並行して行えるはず。
「ふつう」がどこまで通用するかは微妙 ;-)
Solaris2.5なんかはバグってたらしい。
winsockでTCP非同期通信やってますが
データを送信するときはsendを使ってますが
FD_WRITEの使い方がよく分からないです。
データを送信するときはFD_WRITEを待たなければいけないんですか?
FD_WRITEは送信バッファに空きがあることを示すイベントと書いてありました。
>>149
MFCでクラスがあるくらいだから出来るんじゃない?
多分イベントオブジェクトを受け取ってwaitforsingleobjectかと。
151デフォルトの名無しさん:02/06/22 11:45
>>149
待たなくても構わないが、ブロックするかエラーになる
非同期とノンブロックを区別してほすい
153初心者:02/06/22 15:08
やっとselectの意味がわかったよ
名前が変なんだよな。WaitFor〜だとかpollだとかのほうがまだマシ
155デフォルトの名無しさん:02/06/23 20:08
recvfrom()しながら、sendto()するにはどうしたら
いいでしょうか?
非同期にしたらいいんでしょうか?
156149:02/06/23 22:03
>>151
じゃあFD_WRITEが発生するまで待ってからsendする方向だと、
一度sendするたびにFD_WRITEが発生したかどうかのフラグみたいなものを
用意しなくちゃいけないんですかね?
>154
もともとUnixのものだからね。UnixだとSocketに限らずすべての入出力は
ファイルと同じように扱える。つまりselectにSocket以外のファイルディスクリプタ
もセットしてデータの到着や書きこみ可能なタイミングを監視できるわけだ。
「どっから読んだり書いたりしようかな〜」と選択するってことでselectって
名前になっているのだと思う。
>>157
複数のファイル記述子からシグナル状態になった物を選択して返すからselectじゃないの?
なぜWinsockのselect()の第一引数は無視されるのでしょう?
というか、なぜ無視できるのでしょう?
>>159
fd_setの実装が、まるで違うから。マクロとかも覗いてみ。
Winsockの非同期TCPプログラムの参考になるHP教えてほしい。
>>161
www.nakka.comとか
163161:02/06/25 00:27
>>162
どうも〜、って思ったらすでに見てました^^;
ココ参考にTCPクライアント(非同期型)作ってるんですけど、
データ送信するときsend使ってるけどココのサンプルはFD_WRITEの中で呼んでますよね。
FD_WRITEってイベントだから任意のタイミングではsendは使えないんですか?
>161
WinSock FAQもおすすめ。
http://tangentsoft.net/wskfaq/

>FD_WRITEってイベントだから任意のタイミングではsendは使えないんですか?
FD_WRITEを待たないとTCPスタック内の送信バッファの状態によっては
WOULDBOCKエラーになるかもしれない。たとえば受信側の処理がすごく低速な場合とか。
まあ普通だいじょうぶだろうけど。
165ななーしさん@接続しっぱなし:02/06/25 14:00
>>164
シリアスなmulti-threadedなアプリでは、
逆のsendしてブロックされる場合もイヤだよね。
// ちなみにWOULDBOCK → WOULDBLOCK

>>161
任意のタイミングで要求出して、後はシステムにそこはかとなくやって欲しければ、
同期でprogrammingすればいいじゃない…
166デフォルトの名無しさん:02/06/25 19:23
以下のHTML(一部)のPOSTをJAVAのURLconnectionクラスと
writeを使って実現可能でしょうか?

<FORM METHOD="post" ACTION="../cgi-bin/test1.cgi">


167デフォルトの名無しさん:02/06/25 19:38
>>166
可能!
168デフォルトの名無しさん:02/06/25 22:01
>>167
でも試したのでですが、どうもwriteで送った値が送られていないようなのですが
何か考えられる原因はありますか?
>>168
どうしろと・・・。
>168
とりあえずな、自分の送ったデータと、それへのレスポンス
でも示して貰うか、ソースを晒してもらわないことには、
何も言えない。(というより、該当することが多すぎて列挙しきれない)
171デフォルトの名無しさん:02/06/25 23:46
>>166
URLconnection::setDoInput(true)って
やってみましたか?
::setDoOutput(true)だったかもしれない

これで、私はPostできましたよ
172デフォルトの名無しさん:02/06/26 01:21
winsockでスレッド使った同期式TCPなんだけど毎回recvするとバッファの最大値まで
データ蓄えてから受け取ってるんだけど。データがまとめられたり分割されるのは
わかるけど、毎回まとめられてるとなんか変な感じ。クライアントでsendを何回も
連続して発行してるけどそれってマズイのかな?
日本語が変だな。センター国語何点だった?
174デフォルトの名無しさん:02/06/26 02:02
>>156
send〜がWSA_EWOULDBLOCKで失敗した時だけFD_WRITEを待てばいいはず。

自動リセットイベントで待機する場合は、WSA_EWOULDBLOCKからWaitFor〜を
呼ぶ間にイベントがシグナル状態になるとデッドロックする可能性があるかも?

FD_WRITEは実装が複雑になるから、あまりやる必要はないんじゃないかな?
どうしてもしようと思うなら、WSAAsyncSelectを使わずに非同期(重複)I/Oを
使った方がいいかも。ロジックが大幅に変わるから直すのは大変だろうけど。
>>173
6〜7割取れてました、苦手な科目だったな・・・。
>>172
根本的にわかっていないようですね。
177166:02/06/26 10:45
プログラムは

HTML
<HTML>
<HEAD>
<TITLE>テストぺージ</TITLE>
</HEAD>
<BODY BGCOLOR=#a0d0ff>
<FORM METHOD="post" ACTION="test1.cgi">
<INPUT TYPE="text" NAME="fieldname" SIZE="50"><BR>
<INPUT TYPE="text" NAME="fieldname2" SIZE="50"><BR>
<INPUT TYPE="text" NAME="fieldname3" SIZE="50"><BR>
<INPUT TYPE="submit" VALUE="書き込み">
</FORM>
</BODY>
</HTML>

のFORMのPOST部分をJAVAでやりたくて、CGIプログラムは
#include <stdio.h>
#include <stdlib.h>

main()
{
int len;
char *clen;
char *data;
clen=getenv("CONTENT_LENGTH");
if(clen==NULL){
printf("no contents.\n");
exit(1);
}
len=atol(clen);
data=malloc(len+1);
scanf("%s",data);
data[len]='\0';
printf("Content-type: text/html\n\n");
printf("<HTML><HEAD></HEAD><BODY>\n");
printf("%s<BR>\n",data);
printf("</BODY></HTML>\n");
}
178166:02/06/26 10:45


で自分が作ったプログラムは


import java.net.*;
import java.io.*;

public class PasswordID{


public static void main (String [] args) {

try{
URL u = new URL("http://localhost/cgi-bin/test1.cgi");
URLConnection uc = u.openConnection();
uc.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter(uc.getOutputStream(), "ASCII");
InputStream in = uc.getInputStream();
InputStream buffer = new BufferedInputStream(in);
Reader r = new InputStreamReader(buffer);
out.write(fieldname=a&fieldname2=b&fieldname3=c);
out.write("\r\n");
out.flush();
out.close();
int c;
while((c = r.read()) != -1) {
System.out.print((char) c);
}
in.close();
}
catch (Exception e) {
System.err.println(e);
}
}
}

です。よろしくお願いします。
179デフォルトの名無しさん:02/06/26 11:04
(´_ゝ`)で?
180166:02/06/26 11:21
>>179
それでwriteしても、正確なデータが遅れないんですよぉ〜。
181じゃヴぁ:02/06/26 11:26
>>179 のソースは間違ってるますよ
正しいソースは…
お昼休みに書く予定です
182ごめんくさい:02/06/26 11:34
181です
さっきの発言はうそです ごめんなさい!!
書くきなんて全然ありません
だってお昼だもん俺も休みたいもん!!
183179:02/06/26 11:36
そう俺は間違っているんだ(;_;)
JAVAなんて知らないのに煽って悪かった。
つーか、connectしてないよーな……
185デフォルトの名無しさん:02/06/26 19:28
unixのソケットがらみのヤシをWindowsに移植しようとしてるんですが、
close(sd);
がないとか言われました(VC6)。
shutdown(sd);
close(sd);
の変わりになる関数がなんかあった気がするんですが、
教えてもらえませんか? たしか、一回呼べば済むようなヤシだったと思います。
closesocket
187185:02/06/26 19:29
closesocket(sd);
としたら素直にとおったんですが、これでいいんでしょうか?
188185:02/06/26 19:30
あ、いいみたいですね。
どうもです。 >>186
>>185
正解かと。
190185:02/06/26 20:00
連続ですみません。またご教授下さい。
socketのKEEPALIVEの設定をしたいのですが、
KEEPALIVEの可否自体はsetsockopt()でできるみたいですが、
そのintervalはどうやって指定するのでしょうか?
よろしくお願いします。
191185:02/06/26 20:18
ttp://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#peer_death
こんなドキュメントを見つけました。これって要するに、変えられないってことですよね。
要求ではコネクション毎にKeepAliveIntervalを指定したいみたいなんですが・・・。
まさかアプリケーションで作れってこともないと思うけど(相手がapacheなんで)。
困ったにゃ。
socketとHTTPをごっちゃにしてるような
193185:02/06/26 20:30
いえ、HTTPクライアント(っぽい簡易版)をつくるんですよ。
どうしてKeepAliveをしたいのかは仕様に書いてないんで分かりませんが。
194185:02/06/26 20:33
とりあえず、今日は帰ります。ありがとうございました。
あと>>191の口調はキモくてすんまそん。
TIME_WAITはsocket(特にlistenに影響)で
KeepAlive(のタイムアウト)はHTTPだと思うんだけど、違うかな
一枚レイヤーが違うと思われ。
SO_KEEPALIVEってのがあるけど、HTTPのKeepAliveとは別物。
そうなのか。ありがとう。
198185:02/06/27 10:50
はい、HTTPのKeepAliveでした。お騒がせしました。
199デフォルトの名無しさん:02/06/28 08:19
ちょっと質問があります。

・UDPで送られてくるデータはいかなる保証もされていない
・UDPで送られてくるデータはパケット長のみ保証されている

どっちが正しいんでしょうか?
>>199
そら、パケット自体の形式は保証されてるだろう。
届くかどうかは別として。
TCPも保証は無いんじゃなかたけ・・・
202名無資産@ヘタレ部:02/06/28 14:36
>>199
UDPパケット(データグラム)は、届いたパケットの中身は
ある程度(チェックサム程度)保証される。経路で分割されたデータグラムの破片を
ユーザランドで受け取ることはない。
ただし、データグラムは到達しないかもだろうし
(分割されたデータグラムの片割れが届かなかったら、そのうち全部捨てられる)
データグラムが多重に届くことすらありえる

っていうか教科書嫁

>>201
TCPにはパケットの概念はないだろ
>>199
パケットが届く順序が変わるかもしれない。
あと、1回しか送ってないパケットが2回(以上)届くかもしれない。1回も届かないかもしれない。
届いたなら、データの中身は恐らく正しいであろう。壊れて届いたパケットは何も言わずに勝手に捨てられます。
>>203
時間差で>>202と同じ事欠いても・・・
重複もありうるんだっけ?
こりゃまずいな...
俺パケットには通し番号とCRCを自分で付加してたよ
CRCは削っても良いのか
>データグラムが多重に届くことすらありえる

これ良くわからん
全く同じUDPパケットが2回以上届く事なんてあるの?
UDPが届かないのは良くわかるけど
あと順番が入れ替わる可能性があるってのもわかるんだが…
>>207
あるよ。

そのパケットが送信されて受信側に届く前にそのパケットの再送要求出したときとか。
UDPに再送信要求なんて無いんじゃないの?
>>210
ルータ間
>>203>>202のパケットが遅延して欠落して順番が入れ替わって多重に届いたのかな
promiscuous mode って何ですか?
>>213
宛先と無関係に流れてきたパケットをすべて取り込むモードです。
>>214
スニッファですな
promiscuousを辞書でひいてハァハァ
1. sexually indiscriminate: having many indiscriminate or casual sexual relationships(disapproving)
218デフォルトの名無しさん:02/07/04 17:51
n = socket(...);
...
select(n+1, ...);
のようなコードがあるのですがsocket()の戻り値は
その値自体に何かの意味があるのでしょうか?
socket discriptor
stdin stdout stderr
とかで検索しる
>>219
socket discriptor でググッたら 130件もバカが見つかったよ。
221デフォルトの名無しさん:02/07/04 19:12
>ごた混ぜの, 乱雑な; でたらめの; 乱交の.


(;´Д`)ハァハァ
すみません、質問させてください。
winsock2.0、BCCでネットゲーム開発しています。
バイナリデータの送受信にはどういった方法を用いるのですか?
yahoo・グーグルでここ二日ひたすら探したのですが
バイナリデータ送受信を解説しているものが見つからず立ち往生してます。

考えついて試してみたのは
ビットシフトで8ビットにずつに分解して1バイトの配列に格納してsend
なのですが、受信側で再び再構築すると格納してたデータがおかしくなっていました。
1バイトずつ再構築しているのでバイトオーダーの影響ではないと思うのですが

初歩的すぎる質問でしたらキーワードだけでも教えていただけると助かります。
よろしくお願いします。
223222:02/07/04 22:05
>>222付け足しです。
ファイルからバイナリデータを読み出してそれを送信する、というのではないです。

変数に格納してある値をテキストデータとして送らないで送受信する方法を
「バイナリデータの送受信」と書きました。紛らわしくてすみません。
なぜ立ち往生するのかわかりませぬ。
分解するところ/再構築するところにバグがあるんでねーの
htonl
htons
などを検索してみるとよいかも。けど「バイトオーダー」については
わかってるみたいなので、はずしてるかもー。
227222:02/07/05 10:19
>>224-226
アドバイスありがとうございます!解決しました。

225さんの仰る通り、再構築ルーチンを再度見直してみたんですが
受け取ったデータを解析するルーチンがマズかったです。
受け取ったデータはBYTE配列に入れていたんですが、ルーチンの引数を
LPSTRにしてました・・・(;´Д`) LPBYTEにしたところすんなりいきました

ただのcharは符号付で-128から128、byteは符号無しで0から256ですよね。

>>226
バイトオーダーはわかっていたつもりだったのですが、
それよりもっと初歩的な、変数の型についてのミスでした。。。

ありがとうございました!
228デフォルトの名無しさん:02/07/05 13:48
こんにちは。
Winsock超初心者です。
質問があります。

「極めるVisualC++」という本のP154から始まるAPIのWinsockの
サンプルプログラムを打ち込んで、動かそうとしているんですが、
うまく動きません。

具体的には、クライアントがsendするところでエラーが帰ってきます。
WSAGetLastErrorで調べたところ、エラーの内容は「WSAENOTCONN」とのことでソケットが接続されていないらしいのですが、どう対処
していいのか分からない状態です。
とりあえず、プログラムを追ってみたのですが、サーバー、クライアント
共に正しく動いている(ような気が)します。
本当に初歩の初歩の質問だと思うのですが、何かよきアドヴァイスが
ありましたらよろしくお願いします。
socket()やconnect()は成功してんの? エラー処理入ってる?
send()の直前でとめて、netstatやってみたら?
230228:02/07/05 14:52
>>229
お返事ありがとうございます。

>エラー処理入ってる?

エラー処理は入っています。
プログラムを確認したんですが、connectの部分がごっそり
抜けていました。恥ずかしいです。

それで、もう一度動かしてみたのですが、今度はconnect関数に
入ったところで、プログラムが反応しなくなってしまいました。
よって、connectのエラーコードも分かりません。
もちろん、サーバは動かしています。
また何かポカをやっていると思うのですが、よろしくお願いします。
sockaddr_in構造体にはなにを設定してんの?
232デフォルトの名無しさん:02/07/05 15:11
selectしてループまわしてFD_ISSETでチェックしてrecv, sendという処理は
acceptしたクライアント数が多くなると効率悪くないですか?
せめて受信の処理を検索せずにコールバックで処理するような関数はないのでしょうか?
環境はLinuxです。
233228:02/07/05 15:12
sockaddr_in構造体への代入は下のようにしています。

*サーバ
///////始め////////////
SOCKADDR_IN svAddress, clAddress;

memset(&svAddress, 0, sizeof(SOCKADDR_IN));
svAddress.sin_family = AF_INET;
svAddress.sin_port = htons(45678);
svAddress.sin_addr.s_addr=htonl(INADDR_ANY);
///////終わり////////////

*クライアント
///////始め////////////SOCKADDR_IN svAddress;

svAddress.sin_family = AF_INET;
svAddress.sin_port = htons(45678);
u_long svaddr=inet_addr("128.128.128.3");
memcpy(&svAddress.sin_addr, &svaddr, sizeof(u_long));
///////終わり////////////
select自体が重いからな
>>234
そうですね。プロファイルとってみたらselect(待ち時間は0)が50%近い値でした。
教科書どおりにacceptの度にforkするわけにもいきませんしどうしたものでしょう?
Winsockには非同期通知というのがあるらしいのでそちらを試してみようと思いますが・・・
スマン。unixはサッパリわからんのだよ。
WinならIOCPがあるんだが。
つか、待ち時間0でループ回すなよ
>>235
俺スレッド派だな。
memcpy(&svAddress.sin_addr, &svaddr, sizeof(u_long));
が怪しい。
struct hostent *he = gethostbyname( HostName or IP Address );
svAddress.sin_addr.s_addr = ( (struct in_addr*)( he->h_addr ) ) -> s_addr;

みたいなカンジで。
代入始めるsvAddressの初期化もよろしく。
242228:02/07/05 16:30
おさがわせしました。
解決しました。

u_long svaddr=inet_addr("128.128.128.3")

u_long svaddr=inet_addr("127.0.0.1")
にしたところ動くようになりました。
127.0.0.1がローカルのアドレスであるという知識も
無かったのが問題でした。
この参考書(極めるVisualC++)だけで、Winsock
を学ぶのは無理だと思いました。
何か他の参考書を買ってきたいと思います。

お答えしていただいた皆さん、ありがとうございました。
>232
http://ghost.math.sci.hokudai.ac.jp/esehttpd/
ここが役に立つと思う。
Linux2.4系ならPOSIX Realtime Signalsがあります。
*BSDなら、kqueueとか使うんだったかな?

>233
つか、128.128.128.3:45678では誰かちゃんと待っているんだろうな。
244228:02/07/05 16:39
>>243
>つか、128.128.128.3:45678では誰かちゃんと待っているんだろうな。

待っていませんでした(w
ちなみに、
u_long svaddr=inet_addr("128.128.128.3")
というのは、参考書のソースをそのまま写したものです。
また、それについての解説はありませんでした。
「極めるVisualC++」を買った初心者の方は注意してください。

>>244
つぅかTCP/IPの常識すら知らん奴がネットワークプログラミングなんぞするなよ・・・。
本は無実だと思われ。
246228:02/07/05 17:10
>>245
そうですか・・・。
失礼しました。
>>245
なんで? どうやって勉強すんのよ? 本は無実だが>>228にも罪はない。
>247
>どうやって勉強すんのよ?
マスタリングTCP/IP嫁よ

>本は無実だが>>228にも罪はない。
本は、128.128.128.3みたいな妙なアドレスを出す時点で有罪
228はそれに、まったく疑問をいだかなかった時点で有罪
じゃあサンプルではどんなIP使えばいい?
127.0.0.1とか?
210.150.253.198なんかいいよ。
7.7.4.3もいいよね。
>249
たとえばそれがhttp clientなら、kantei.go.jpとか有名な
あたりを指定しとけばいいし、俺様protocolで通信する
ServerとClientなら、localhostを指定しとけばいいと思う。
#名前を引くのは当然として
サンプルの場合、microsoft.comやらyahoo.comやらの有名どころ、
或いは出版社のサイトになってるのが多いんだけどな。
このスレ的にはwww.2ch.netだが、「無用な負荷をかけるな」と言われる諸刃の剣。
IP抜かれました。住所とか個人情報ばれますか?

とかふざけたことほざいてるうちはネットワークプログラミングなんぞ10000024年早いってこった。
サンプルはgoogleを指定してるよ。
あそこは素直だからな。
256デフォルトの名無しさん:02/07/06 18:43
うえーん(TДT)サバが立ち上がらないよお
というよりソケットが貰えないみたいれす・・・
>>249-253
どこを指定しても、ポート 45678 なんかで待っている奴なんかいないから、結局
エラーになると言う罠。
socket()がエラーになるのは、winsockでWSAStartup()してないと見たが、どうかな
260デフォルトの名無しさん:02/07/06 19:39
>>259 ありがとうございます、できました(^▽^)ノ

# 手元の本にそんなこと載ってなかった・・・。
Winsockの本なら例外なく最初のセクションにあると思うが
>>261
最悪でもソースに書いてある。
TCP/IPプログラミング徹底解説って本なんすけど・・
無いっぽいです(・・)
それはwinsockの本なのか?
winsockではないようですがwindowsとunix両方についてかいてあります
本を間違ったかな・・・(-д-)
いや、間違っては居ないと思うが。
WSAStartup()〜WSACleanup()を除けば
ほぼUnixと同じように書けるし。

Winsock2.0の本で良書があったと思うが、
題名忘れた。
>>266
Winsock 2.0 プログラミング?
268デフォルトの名無しさん:02/07/07 15:19
JAVAでSNTPの機能をつくりたいのだけど
なにか良い資料ない?
>>268
RFC
>>268 1件目のって、そのものズバリのような気がしますけど。
http://www.google.co.jp/search?hl=ja&inlang=ja&ie=Shift_JIS&q=Java+SNTP&lr=
271デフォルトの名無しさん:02/07/08 14:53
Winsockって最大でいくつsocket作れますか?
また、その最大数を変更することはできますか?
WSAStartupの第二引数に帰ってくる情報をたぐれ!
変更する方法はしらん。っつーかできんと思う。

参考サイト(delだけど)
http://www.asahi-net.or.jp/~nk2w-ishr/winsock2.htm
273おねがいします:02/07/09 00:10
Windows xp では、netstat に -o オプションが追加になりプロセスIDも見れる
ようになりましたが、これと同じことを Windows 2000 でもやりたいのですが、
プロトコル(TCP/UDP)とポート番号の組み合わせからプロセスIDを取得する方法
ってわかりますでしょうか?
パーソナルファイアーウォールなどでは、取得できているようなのですが。
お願いします。
xpからコピーしてくれば見れるから、実現できるだろ
275デフォルトの名無しさん:02/07/09 07:10
RTPやRTSPについて詳しいかた、、、参照ページなど教えてください。
お願いします。
276デフォルトの名無しさん:02/07/09 10:06
>>274
xp からコピーしても見れなかった。
iphlpapi や ws2_32 の dll もコピーしたがだめだった。
具体的には、-o オプションをつけると一覧が表示されない。-an ならOK。
xp では、非公開?の AllocateAndGetTcpExTableFromStack API を使って
表示しているのは知っていたのだが、ノートンのファイアウォールは、
Win 2000/98/Me でどうやって取得しているのかが知りたい。
できれば、GUIでそれらを表示したいと考えている。

netstat を 2000にコピーするだけで動けば、strace してなにやってるか
みれたのに。。。。
277名無しさん:02/07/09 11:26
>>276
ライセンス上リバースエンジニアリングは禁止されてますが何か?
278デフォルトの名無しさん:02/07/09 12:28
>>277
じゃ、リバースやめます。

どうやら、Transport Driver Interface (TDI)に手を出さないと無理らしい。
このへんの情報知ってましたらお願いします。
280デフォルトの名無しさん:02/07/09 17:42
WinSock 2.0  と言う本を買って、ネットで一対一で対戦できるゲームを作ろうとしたのですが
この内容が、ちょっとややこしいので、理解できません。

この板の過去ろぐも見せていただきましたが、
細かい部分の質問が多くて、結局、どうすれば接続を確立して、
お互いにメッセージをやりとりできるのかがわかりませんでした。
CHATTERと言うサンプルプログラムも何だかよくわからなかったです。

もしよろしければ、どのような手順で、接続を確立し、メッセージをやりとりすればいいのか、
教えて頂けませんでしょうか。

開発環境は VC++6.0 です。
MFCは、使っても使わなくてもかまわないです。
もしくは参考になるページや、本などでも結構です。お願い致します。
--------初期化
WSAStartup();
socket();

--------サーバ側
bind();
listen();
accept();

--------クライアント側
connect();

--------送受信
send();
select();
recv();

--------終了処理
closesocket();
>>281
CAsyncSocketが楽な罠。

sock.create(80);
sock.connect();
283デフォルトの名無しさん:02/07/10 12:17
>>281
WSACleanupも、作法でソ。
284280:02/07/10 13:14
ありがとうございました^^
だいたいの流れはわかりました。
早速やってみます。
また質問があるかも知れませんが、そのときはまたよろしくお願い致します
285280:02/07/10 14:44
申し訳ないっす;;
やっぱりやってみたんですけど、エラーがデマクリで。。。
サーバーとクライアント用にソケットを作ってみました。

CAnsySock Socket_serv,Socket client;

_________________________________________

Socket_serv.Create( 9000,
            SOCK_STREAM,
            FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
            "127.0.0.1" );
Socket_client.Create(9001,
            SOCK_STREAM,
            FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
            "127.0.0.1" );


Socket_serv.Bind(9000,NULL);
Socket_client.Bind(9001,NULL);


Socket_serv.Listen(2);

Socket_clientConnect.("127.0.0.1",9000);

______________________________________________________________________________________________________________________________

アドレスが使用中です、と言うエラーと、ソケットはブロック化処理を行いませんが、指定された処理はブロック化を行います。
と言うエラーがでてしまいます。。あと、こんなのもでます。。。When Connecting X.400 over TP4


どこがいけないか、もしよろしければ指摘お願いしたいです;;
また、これからも結構質問するかも知れませんが、よろしくお願い致します。
なにをやろうとしているのか全然わからん
入門でやりたいならどっかのページ(yahoo.co.jpとか)を
取得するテストでもやってみりゃいい
"socket bind"とかでググればサンプルいっぱいあるだろうに
CAsyncSocketは知らんけど、

・clientのポート番号を指定してるのはおかしい
・Createでポート番号指定してるのにbindしてるのはおかしい
指定ポートからの接続以外をはねる実装もあるので、
一概にクライアントでbindするのがおかしいと言い切るのはおかしい。
>>285は2重bindなどおかしいことは多々あるが。
290デフォルトの名無しさん:02/07/10 22:47
厨質デス
/*サーバ側*/
struct msgbuff {
mtype:
mtext;
}b; /*構造体テキトー*/

msgget ( msgid,............... ) /*キューゲト*/

msgrcv ( msgid,...b.mtext...... ) /*レシーブ*/
fprintf ( fp, %s, b.mtext ) /*ファイルニカキコ*/
         :
         :
この後にクライアソトに成功・失敗を伝えたいんすけど
再度b.mtextって使用可能なんすかね?
b.mtext使用してクライアソトに伝えようと思ったんすけど・・・
なんか他に(・∀・)イイ方法あるなら教えてください。

厨なんで質問の意図わかりにくいかとは思いますが
何卒オナガイシマス
漏れも厨なんで分からないんですが、環境はなんですか?
共有メモリを使ったIPCですk?
そして、よっぱらってぐらぐらします。
SystemV IPC のメッセージキューじゃなかったっけ?
UNIXプログラミング質問すれ
http://pc.2ch.net/test/read.cgi/tech/992057422/
の方がいいかも。
293デフォルトの名無しさん:02/07/12 14:15
winsockでAAsyncを使ったプログラムを組んでいます
コネクトが切れたらなにかしらアクションを起こすシステムを搭載しようと思ったので相談にきました

とりあえず切断が切られた場合。
相手がclosesocket()した場合は
Msg=DATA_PENDING, lParam = FD_CLOSE
が来るのでアクションを起こすのは楽です

でも、相手がLANケーブルを引っこ抜いた場合などはこのMSGが送られてこず、
ひたすらsend recvを失敗するだけになります
今のところ15秒に一度、相手に返事を要請するデータ(相手はこのデータを受け取ると返事用のデータを返します)を送って
コネクトの生存を確かめています

今のところこのシステムに不自由はないのですが、
sockの機能でこれを代理するものはないでしょうか?
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#ss2.8
みるところsocketの機能としてはなさそう。
さらにそこの上のほうを見ると多少対策法あるあもね
(#以降はきられるのでコピペでよろしく)
295デフォルトの名無しさん:02/07/12 16:18
>>293
そのやりかた(APレイヤーでkeep-aliveする)がTCP/IP的にはもっとも
正しい。WinsockならばSIO_KEEPALIVE_VALSを使えば、TCPレベルでの
細かいkeep-aliveが設定できるが、APプロトコルが自製のものなら
やはりAPレベルのkeep-aliveがベスト。
SolarisでWinSockのWSAAsyncSelectみたいなのありませんか?
select とか poll じゃないの?
298デフォルトの名無しさん:02/07/13 05:42
WININET.DLLで同期でプログラムを組んでいます。
InternetSetOption()でタイムアウトの設定をしていますが
InternetReadFile()では正しくタイムアウトされるのですが
InternetOpenUrl()ではタイムアウトが動かす固まってしまいます。

MSDNではAPIのバグだ、と書いてありますが
かかれているとおり、非同期で組みなおすしかないのでしょうか?
http://support.microsoft.com/default.aspx?scid=kb;JA;q176420
かかれているように、Another solution試せばいいやん。
>>294-295
ありがとうございます
やり方としては間違っていないようで安心しました
参考文献もおもしろかったです
301デフォルトの名無しさん:02/07/15 17:55
ソケットを再利用するにはどうしたらいいでしょう。
shutdown closesocketするだけではだめなようです。
OSはWindows2000で,MFCではなく素のAPIでやっています。
再利用は出来ない
ソケットって再利用するものなのか?
そして、この場合の再利用の意味とは?
304301:02/07/15 18:03
あ、スイマセン。再取得?したらできました。
いや、相手との接続が急に切断して、また、そのsocket
でconnectできるかとおもったのですが。
見当違いでした。どうも。
305デフォルトの名無しさん:02/07/16 04:04
IRCクライアント作りたいんすけど、どこかに簡単なCで書かれたソースありませんか?
とりあえず1チャンネルだけのクライアントは作れたんですけど、2複数のチャンネルを
どう処理したら良いか分かりません。
過去ログ嫁
307デフォルトの名無しさん:02/07/17 10:30
移転age
308デフォルトの名無しさん:02/07/19 23:05
age
309デフォルトの名無しさん:02/07/20 07:05
ユーザ認証のダイアログがでるページに自動でログインするためには
どんなメッセージを送れば良いんですか?

VCでCAsyncSocket使ってますが、単にSendしてReceiveだと
bufferには「正しいユーザ名とパスワード入れろやボケ」とかえってきます。
>>309
HTTPのBasic認証だったら
ヘッダにbase64エンコードしたusernameとpasswordを入れて送るのよん。
メッセージ、というか、単にヘッダが足らんだけ。
どのヘッダが足らんのかは、RFC嫁。
312309:02/07/20 11:51
>>310, >>311
レスありがとうございました。
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
ですね。

他にもHostも書かなきゃ駄目で、それに気がつくのに2時間かかりました…

>>312
このスレ最初から読むのには2時間もかからないよ…
ここの過去ログでいい本を紹介しているスレがあり
http://mentai.2ch.net/prog/kako/960/960830594.html
このスレの26-27がとても参考になりました。

「WinsockによるWindowsネットワークプログラミング」Arthur Dumas 海江田訳、アスキー出版 \3,980-
「Winsock2.0 プログラミング」Lewis 江村豊監修 ソフトバンク \5,800-
で、この2冊を買ってお勉強中です。

やっぱりネットに転がっている情報だけでは基礎が勉強できませんね。
315デフォルトの名無しさん:02/07/20 17:58
ども、質問させてください。
今PerlのIO::Socketを使用して、サーバプログラムの基礎実験をやってるんですが、
メッセージを送受信できるサンプルプログラムを拾ってきて、動作を確かめていてたんですが、
サーバ、クライアントがどちらもLANの内側にある場合問題なく動作するんですが、
クライアント側を、ダイアルアップ経由で接続しようとすると、うまくいきません。
httpや、smtpなどのサービスは普通にアクセスが可能なのですが・・・
サーバ側のFireWallの問題かとも思い調べてみたのですが、使用しているポート(5000)は、
iptables -A INPUT -p tcp --sport 5000 --dport 5000 -m state --state ESTABLISHED,RELATED -j ACCEPT
として、許可するようにはしているのですが・・・
もう、ダメポです・・・、誰か何か情報無いですか?
ちなみに、サーバのホストはVine Linux 2.5です。ルータもこいつです。
>>315
板違い
ここはプログラミング板です。さようなら
あれ?書けた。
DIONなのに。
318デフォルトの名無しさん:02/07/23 15:11
LinuxでHTTPで通信するにはどんなライブラリを使えばいいですか?
socket
言語くらい書け
wininet相当のものってlinuxにないんだっけ?
322318:02/07/23 15:58
>>320
Cです。
323デフォルトの名無しさん:02/07/23 16:40
http://www.amazon.co.jp/exec/obidos/ASIN/0735615799/249-6348885-6837141

この本の日本語版ってないのかな。
>>321
ありません。自分で一から書いてください。
OpenSSL相当のものまで一から書くのはさすがに辛いだろ…
326デフォルトの名無しさん:02/07/26 17:26
質問があります。
2台のPCをインターネットを介して、TCP/IPで接続させる実験を行っています。
片方のPCはWindows2000(SP2)で、もう片方のPCがWin98です。
ソフトの開発はVC++6.0,Winsockで行っています(MFC等は不使用です)。

二台のホストをそれぞれホストA、ホストBとしますと、
ホストAでconnect関数を呼んだとき(=SYNフラグをセットしたパケットを送ったとき)、
ホストBでaccept関数が呼ばれていれば、接続が行われますが
(=SYNとACKフラグがセットされたパケットが返りますが)
まだホストBでaccept()が呼ばれていない場合、
RSTとACKのフラグがセットされたパケットがホストBから返りますよね。

connect関数を一度呼ぶと、相手がaccept関数を呼ばない場合、この処理が3回行われて
最後にconnect関数からSOCKET_ERRORが戻りますが、ここで、
1回ないし2回だけRSTとACK付きのパケットがホストBから戻り、その直後に接続が確立
する場合があります。
今回僕が悩んでいるのは、この状態で接続が確立された場合に限って、接続が2分間で
切断されてしまう問題です。自家内LANのルータ等にそのような設定をした覚えが
ありませんし、外部のネットワークでそのように設定されている事があるのでしょうか?

どなたか、お気づきの事がありましたら、お教え頂ければと思います。
プロバイダは、Yahoo!BBとフレッツISDN(DION)を使用して実験しています。
327shige:02/07/26 17:30
>>321
libCURL
w3c-libwww
libghttp
お好きなものをどうぞ。
両方ともホストというとアレなんで一方をクライアントとしてホスィ。
そして単純にテストプログラムのミスだと思われ。
329326:02/07/26 18:44
>>328さん
ご返答ありがとうございます。
えっと、ホストAがクライアント、ホストBがサーバです。

>そして単純にテストプログラムのミスだと思われ。

それが、他の方が作成されたファイル送受信のフリーソフトを使ってみても、同様の
症状が出るのです。

症状を更に詳しく書きますと、この接続状態になってから2分間が経過した後に、
send関数を呼ぶと、WSAECONNRESET(10054)のエラーが返るのです。
2分間は通常の送受信が行えます。サーバとクライアント、どちらでもWSAECONNRESETが
返ります。2分経ってもsendを呼ばないとESTABLISHEDのままです。

どうかよろしくおながいします。
ネット環境が限りなく怪しい。
環境変えてみたら?
331326:02/07/26 18:59
>>330さん
なるほど、そうですね。
夜に知り合いに協力してもらって、実験してみます!
332326:02/07/27 10:50
スマソ、やっぱり環境依存の問題みたいですた。
YBBとケーブル会社のプロバイダを使った実験では、326の様な問題は
発生しませんでした。
…お騒がせしました…。
333デフォルトの名無しさん:02/07/27 15:10
質問です。
main()をつかった、Win32コンソールクライアントをつくっています。
CAsyncSocketから派生させたソケットクラスのOnConnectとか
OnReciveとかをオーバーライドして非同期通信を実現したいのですが、
オーバーライドした関数は呼ばれることがありません。
通知を受け取るためにはどうしたらよろしいのでしょうか?

VC++6.0でプロジェクトを作成する時に”Win32 Console Application” の
プロジェクトを選択して”MFCをサポートするアプリケーション”をチェックしています。
CAsyncSocketを使うためにafxsock.hをインクルードしています。
オーバーライドしてもビルドは問題なく出来ます。
なにか、根本的にわかってないようです。

同じような経験をした方はいらっしゃいませんか?
334 :02/07/27 16:09
n次元ベクトルの内積を求める関数
double inprod(doble a[],double b[],int c);
はどのように書けばいいのでしょうか?
ご教授おねがいします
335Rina ◆tI333vNE :02/07/27 16:12
>>334
http://pc3.2ch.net/test/read.cgi/tech/1026138039/l50
内積求めるのが「ネットワークプログラミング」でしょうか?
>>335
当たり前じゃん
337Rina ◆tI333vNE :02/07/27 16:33
…そうだったんだ(汗.
23になるこの年まで全然知らないでプログラミングしてきました.
欝駄子嚢.
>>326
ネットワーク機器の構成を書いてもらえると何かわかるかもしれんぞ
>>338
Socket programmingがネットワーク機器に依存しないように?
matrix programmingもネットワーク機器に依存しません。
>>339
ネタは余所でお願いします。
>>333
MFCスレの方がレスつきやすいと思うが。
C*Socketは不可視ウィンドウでメッセージを受けてるから
メッセージループがないとイベントを受け取れない。
342デフォルトの名無しさん:02/07/27 21:49
Winsock2.0のWSAIoctl()のつかい方を教えてクレー。
INもOUTもいらないはずのコマンドで10022エラーがかえってくる(エーン
343326:02/07/27 22:26
>>338さん
遅レス、ごめんなさい。
自家内LANと書きましたが、今手元には無く、月曜日にならないと
LAN環境に近づけません。月曜日以降に問題が解決できなければまた
書き込みさせてください。よろしくお願いします。
344デフォルトの名無しさん:02/07/28 19:53
CAsyncSocketを使ってHTTPでWEBページを取得し、取得し終わった後に
別の処理をしようと思うのですが、「取得し終わった」というのは
どのように検知したらよいのでしょうか?
>>344
closeを受信したらでいいんじゃなーい(適当
>>344
CAsyncSocket::OnCloseで受けれということでしょうか。
OnCloseはたしかに呼ばれるんですけど、呼ばれた後にも
OnReceiveで受信が続く場合があるんですが・・・
347346:02/07/28 21:11
失敬、>>345宛です。
>>346
うそこけ
349346:02/07/28 21:33
ほんとですがな
Receiveのバッファが1000バイトくらいだと最後にOnCloseが呼ばれる
んですが、100バイトくらいにするとOnReceiveの途中で
OnCloseが呼ばれてまたOnReceiveが呼ばれます。
>>350
じゃあcontent-lengthは?
>>351
今はそれでやっています。
まぁそれでできてるので「じゃあいいじゃん」かもしれないですが
できれば取得し終わったタイミングがわかった方がスマートかなぁと
思いまして。
>>352
いや、そっちが普通だと思うが
(゜Д゚) マジデスカ!?
>>354
closeは冗談のつもりだったのに
でもcloseが先に来るとは知らなかったよ
content-lengthの方が普通のようなので今のままにしておきます。
ありがとうございまつた。
VBのwinsockコントロールはcloseは最後に来るけどなー
359ななーしさん@接続しっぱなし:02/07/28 23:50
>>357
それって、
http://www.microsoft.com/japan/developer/library/vcmfc/_mfc_casyncsocket.3a3a.close.htm
http://home.postech.ac.kr/~ayo/winsock-faq/newbie.htmlの2.14
辺りの話と違いますの?
順序保証したいなら、後ろの奴みたいにハンドシェイクするんじゃない?
closeのあとにreceiveが来る可能性に備えとけって
MSDNに書いてあるぞ
http://msdn.microsoft.com/library/en-us/winsock/wsapiref_6jn6.asp
361333:02/07/30 02:06
>>341
レスありがとうございます。
マルチポスもあれですし、時間もかけるわけ行かないので、
select使って書くことにしました。ありがとうございました。
362ななーしさん@接続しっぱなし:02/07/30 04:02
>>359
最後の行余分だったな…

>>360
たぶん、CAsyncSocket::OnCloseは、
FINフラグの立ったTCP segmentを受けるとraiseするんだよね。
363デフォルトの名無しさん:02/07/31 10:12
どなたかVC++でwinldap.hを使用したLDAPのアプリの作り方を教えてください.
ldap_init()でInitしたあと、
ldap_set_option()でLDAP_OPT_PROTOCOL_VERSIONを
設定しようとしたらアクセスバイオレーションで落ちてしまいます。
まあ、そこは省略もできるのでコメントアウトしたとしても、
ldap_bind_s()も失敗します。
いろいろと検索したのですが解決になる答えをみつけられません。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netdir/ldap/initializing_a_session.asp
個々のサンプルソースを参考にしました。そのままでは、簡単なコンパイルエラーがでますが、
変数の2重宣言のような簡単なものなのでこの問題には直接関係ありません。
ネスケのSDKを使へとかいうのは無しの方向でおねがいします。

(スレ違いかなと思いつつwinsock.hをwinldap.hが呼んでいるのでここで質問しました。)
364デフォルトの名無しさん:02/07/31 11:36
WindowsとLinuxのsocket(UDP,TCP)のパフォーマンスを
比較したようなサイトってないですか?
BSD Socketベースのほぼ共通のソースを使ったものと、
それを基に各プラットフォームに最適化したものなどを
比較しているようなデータが欲しいのですが。
まず「socket(UDP,TCP)のパフォーマンス」を定義してくれ。
366364:02/07/31 13:19
>365
単位時間あたりのUDP,TCPの送受信サイズというか
同一ハードで動作するサーバが捌けるクライアント数でしょうか?
とりあえず比較してあるデータであればそれを見てみたいのです。
>>366
目的を教えてくれたら俺の持ってる資料を公開してやってもいいぞ
368デフォルトの名無しさん:02/07/31 22:35
MS-DOSまたはPC-DOSでWinsock APIとよく似た感じのインターフェースで
socketプログラミングできるライブラリは無いでしょうか? 市販のもので有名
なPC/TCPというものがありますが、販売終了だとか・・・。

開発言語はMS-CかTurboCです。例えばMSのLANMANで使えるsocketライ
ブラリとか、その他何か情報あれば教えてくださ〜い。
369363:02/08/01 00:01
自己レスれす。
結局解決になってないのですが、
ldap_open()でudpで接続する分にはうまく動作しました。
ldap_init()とldap_set_option()をとおして
ldap_bind_s()をうまく通す方法がありましたら引き続き情報ください。
レスがつきにくいのはスレ違いだから?
370デフォルトの名無しさん:02/08/01 00:27
>368
>MS-DOSまたはPC-DOSでWinsock APIとよく似た感じのインターフェースで

そんな感じの、オレも探したことあった。けど、無かった記憶。
多分、海外のプログラムマニア系のFTPとかにありそうな気が。または仕様書でも。
PC−DOSっていえば、以前、あれようのブラウザが売られてたから、
IBMに行けばなんとかなるな。無理だけど。
って、そんなん何に使うの?<368
371370:02/08/01 00:41
と、言い出したので、検索したら、あったみらい。
オレは使わんが。
ttp://www.asyncsystems.com/tcpip.htm
372ななーしさん@接続しっぱなし:02/08/01 01:56
>>366
> 単位時間あたりのUDP,TCPの送受信サイズというか

混みあってきたら譲り合う方式のネットワークで、
そんな性能追求しても仕方ないと思うぞ。専用のネットワークなのか?
いずれにせよ、

> 同一ハードで動作するサーバが捌けるクライアント数でしょうか?

多数のクライアントを相手にするサーバの性能は、
サーバの作りに強く依存して、network stackにはあまり依存しない。
>>368
 私自身は,ネットワークプログラミングの事は分からないので,
的外れかもしれませんが.
 DOS上でのネットワークプログラムとしては,以下のようなもの
があるのを知っています.

DOSVNC - a DOS Viewer for VNC
http://c0w.inode.at/mjy/dosvnc.html

 ソースコードもDLできます.
 全然的外れだったら,ごめんなさい・・・・ですが,もし参考に
なれば幸いです...
374368:02/08/03 02:50
>> 370
>> 371

ここ数日探し回ったのですが、見つからないですね。教えてくださった
URL、探していた物にかなり近いのですが、高いですね・・・。(T_T)

それにしても、プログラム技術よりも基礎知識がどうも足らないようで
す。DOSでSocket通信をやるにはPacketDriverってやつがいるんです
よね? これはLANカードに付いてくる物や、FTP鯖を探せば手に入る
物もあると・・・。LANMANってのはPacketDriverではないということなの
かな? この辺、もう少し勉強してきます。(やっぱ英語力要るなぁ)

> って、そんなん何に使うの?

仕事なんです・・・。MFCしか触ったことがない新人プログラマに、でき
るかどうか調べてこい、という上司はいかがなものかな・・・と。(藁 ま、
試練ですかね。

>> 373

このソースコード、プログラミングに入ったら役に立ちそうです。どうも
情報ありがとうございます。

しかし、検索エンジンで探し回ってもわからないとき、いつも2chに行き
着いてしまうのは気のせいだろうか・・・w
375373:02/08/03 03:52
>>368
 老婆心(ひょっとして甘すぎ ?)だけれど.
 参考書としては,
 「パソコンTCP/IP教科書」 アスキ− /刊
DOS上のTCP/IPにも触れられている.

 「FreeBSD ネットワーク管理ガイド」
 ピアソン・エデュケーション /刊
 UNIX系OSの FreeBSDの本だが, DOS上のTCP/IPの事にも
 触れられている.

 プログラミングには,直接関係ないが,2ch内だの
 ■★▲DOSはまだ現役! 
 http://pc.2ch.net/test/read.cgi/os/984154754/

 ■■●DOSでネットワーク●■■
 http://pc.2ch.net/test/read.cgi/os/999912322/


 あと, >>373で示したのは,
 Waterloo tcp/ip (WatTCP)
 と言われる DOS上で,TCP/IPを実装したものを含んでいる.
376ななーしさん@接続しっぱなし:02/08/03 09:45
>>374
仕事かよ! 高いなんて言ってないで、
http://www.allied-telesis.co.jp/products/product/software/index.html
とっととここで買え。マニュアルも必ず買え。高いも糞もねぇ。

// まさか、MorphyOne上にportする仕事じゃねえだろうな(プ
377名無しさん:02/08/03 13:18
チャットの自動応答プログラムを作りたいのですが
Javaでできますか?VBのほうがいいですか?
>>377
荒らしプログラムと正直に書け。
379デフォルトの名無しさん:02/08/03 17:33
>>377
どっちでも、OK.
380デフォルトの名無しさん:02/08/03 19:48
VC++でCAsyncSocketを使って、MSNメッセンジャーのように
メッセージをやり取りするソフトを作っています。

とりあえずメッセージ送信を、クライアント側からサーバ側へ
"MSG 送信文字列の長さ 送信先ID\r\n送信文字列"
という形式で送り、サーバ側から送信先クライアントへ
"MSG 送信元ID 送信文字列の長さ\r\n送信文字列"
というテキスト形式で送ることにしています。

受信部分は、まずOnReceive()でReceiveにMSG_PEEKフラグをつけて
256文字ほど一旦読み込み、\r\nを文字列検索してそこまでの長さを調べ、
再度\r\nまでをMSG_PEEKなしで読み込んでいます。
その後、読み込んだサイズ情報を元に、再度Receive文で
送信文字列部分を読み込む、という方法です。

しかしこの方法でテストをしているとと、メッセージをいくつかやりとりしているうちに、
急に何をsend()してもサーバに届かなくなってしまいます。
また、そうなるとサーバからのsend()も認識しなくなってしまいます。
上記のメッセージ送信以外の通信(たとえばオンライン・離席中の切替命令)
は何回繰り返してもこのような現象が起こらないため、おそらくこの
メッセージ送受信処理に問題があると思うのですが、どうにも原因がわかりません。
この現象が起こるのは本当にランダムで、同じ文字列を3回ぐらい
送信しただけで起こることもあれば、20回くらいまで耐えることもあり、
全く見当もつきません。

何が悪いのでしょうか・・・?
381 :02/08/04 12:30
Windowsで非同期通知を使ったプログラムを勉強しているのですが、
send()の引数を0バイトにして呼び出したら、FD_WRITEは発生するのでしょうか?

これができればデータ送信をFD_WRITEに全部書けるので便利な気がするのですが。
もし他に方法があれば教えてください。
>>381
発生しないよ
383 :02/08/04 13:47
>>>382
どうも。 残念(´・ω・`)・・・
384381:02/08/04 15:06
こんなんでいいのでしょうかね。
PostMessage(hWnd, SM_EVENT, server, WSAMAKESELECTREPLY(FD_WRITE, 0));
ちょっとお伺いしたいことがあるのですがよろしいですか?
とりあえず書いてみそ
387デフォルトの名無しさん:02/08/07 02:27
>>385よ、いいこと教えてやるから少し大人しくしてくれ。
旨いゆで卵の作り方だ。

まず、生卵を用意する。
普通は鮮度が良い程良いのだが、この調理法では古い卵でも旨くなるのであまり気にしなくて良い。
次に電子レンジに生卵を入れる。この時注意して欲しいのは
●皿を使わず、直にターンテーブルの上に置く。
●ラップ等で包まず裸のまま入れる。
●卵は1個より3〜4個置いたほうが旨くなる。

あとは、電子レンジを回して3分程チンするだけだ。(500W時)
実際に茹でてないので厳密には茹で卵とは言えないが、そこはご愛嬌。
今までの卵料理とは段違いの旨さ、ふわふわ感なので是非試してくれ。
因みに食すときは酢醤油をお勧めする。
>>387
 板違いというか.....
 それ実行したら・・・・・.
 以前,パソコン一般板にそういうスレが立ってたことが.
 で実行した奴が・・・・・XXXXXX(笑).
389380:02/08/08 16:43
解決しました。
「OnReceiveを受けて受信処理を行う場合、Receive()は1回しか使えない」
というのが原因でした...
390ななし:02/08/11 23:20
>>389 マジで?情報元きぼん
生のWinsockもAsyncモードではメッセージごとにrecvは1回しか使えないから
容易に類推できそうなものだが
ネットワークプログラミングとは全然関係ないが、スレタイトルを
よく見たら "Port3" になっていることに気がつき、感心した。
393390:02/08/13 00:46
>>389,391さん
Winsock2.0プログラミングから引用
第4章 非同期転送モードの使用方法 P94 FD_READの項
「大量のデータを受信するアプリケーションの場合は、一度のFD_READ
メッセージにつき何度かrecvまたはrecvfromを呼び出すことで
データスループットを大幅に増やす方法もあります。」
とあるのですが、これは間違っているということでしょうか?
>>393
そのためにはWSAASyncSelectでフラグを落とせって
その周辺に書いてないか?
CASyncSocketではそういう細かい制御が
できないんじゃないの?
395394:02/08/13 04:34
MSDNライブラリのWSAASyncSelectの説明から引用。
> With these semantics, an application need not read all available data
> in response to an FD_READ message--a single recv in response to
> each FD_READ message is appropriate. If an application issues
> multiple recv calls in response to a single FD_READ, it can receive
> multiple FD_READ messages. Such an application can need to disable
> FD_READ messages before starting the recv calls by calling
> WSAAsyncSelect with the FD_READ event not set.
ん?
最初にFD_READが来てrecvしたあと、まだバッファにデータが残ってたら
すぐに再びFD_READが来るでしょ?
で、連続してrecvすると、バッファが空なのにFD_READが
(最初のrecv直後の段階で)既に送られているので、
そのFD_READ時にrecvが失敗する(WSAEWOULDBLOCK)って話じゃないの?

2回recv出来ないとか、WSAAsyncSelectのモードとかじゃなくて、単に、
「recvが-1(BLOCK)を返しても正常に動作するように作ればいい」
ってことだと思うけど。
397390:02/08/14 00:22
>>394-395
本にそのような記述はありませんでした。

>>396
ということは、recv==-1を考慮していない場合にのみ
(そんな実装アリ?)、recvを2回以上呼んではいけない
といういう意味でしょうか。なら合点がいくのですが。
>>397
なら本がおかしいんだろ。MSDNライブラリよりどこの
馬の骨か知れない本のほうを信じるのか?
どっちにしろ389はCAsyncSocket限定の話っぽいから
たいした問題じゃないが
>>398
Hookの説明には多数の間違ったサンプルが付属してたけどね。
同じポートでデータの送受信をする場合、sendtoとrecv(or recvfrom)を同一ループで
回して実行すると、タイミングによっては片方のポートがconnection refuse の errno
で失敗するんですが、通常、同一ポートでデータの送受信をしたい場合ってどういう
風に実装するんでしょうか?
400

ちなみに通信はUDPです。
WinSockの動作はMS単独で策定しているものではない
もし規定に従ってなかったら、それはMSの実装がおかしいだけ

そもそも、Such an application can need to disable がどういう意味なのか、
よくわからんのだが、重要なのはcanとneedのどっちだ?
>>400
普通にconnectもしくはaceptしてsendもしくはrecvするだけだが?
connection refuseになるタイミングってどんなの?
400です。
>>403
すみません。その後、自己解決しました。
相手のポートをstruct sockaddr_in型のデータに設定する所でネットワーク
バイトオーダーに変換してませんでした。つまりバグでした。
正しく設定したらできました!
405デフォルトの名無しさん:02/08/17 17:39
いまさらだけど >>72 の

>255.255.255.255は全アドレスに対するブロードキャストだよね。WANも含む。

なんて大嘘に誰も突っ込まないのはなぜ??
つーか、>>74なんて、納得しちゃってるし(笑)

>実際にはルータが止めるだろうけど、

実際にはって....まるでルータの自主的な安全対策のように書くなよ。
止めなかったら、ルータじゃなくてブリッジになるだろーが(笑)
こいつ、ぜんぜんわかってなさそ・・・
255...をlimited broadcastって呼ぶのも知らんのだろうな。
知ってたら、WANを超えるなんて発想もないだろうから。
ちょっと調べればすぐに判ることをイチイチ指摘しても意味ないっしょ
winsock で、gethostbyname() のタイムアウト値って設定できるのでしょうか?
WSAAsyncGetHostByName() はなるべく使用したくありません。
>>407
無理
>>406
一連のスレッド読んでも、とてもそんな流れには見えんけどなぁ
410デフォルトの名無しさん:02/08/19 11:17
selectに渡すfd_setにセットするソケットの最大数っていくつでしょうか?
>>410
お好きなように。
412410:02/08/19 11:52
色々調べてみたんですが、FD_SETSIZEまでじゃないですか?
んで、それって256だったり1024だったりしませんか?
10万以上のソケットを監視したいんですが、一発じゃできないですかね?
できなかった場合selectでぐるぐる回そうかと思ってるんですが、
wait時間を0で指定するにはtimevalをNULLクリアして渡せばオケーですか?
>>412
>10万以上のソケットを監視したいんですが
下手なDoSですが。
何このスレ・・・・・・・?

             /ヽ       /ヽ
            / ヽ      / ヽ
  ______ /U  ヽ___ /  ヽ
  | ____  /   U    :::::::::::U:\
  | |       // ___   \  :::::::::::::|
  | |       |  |  |     U ::::::::::::|
  | |      .|U |  |       ::::::U::::|
  | |       | ├―-┤ U.....:::::::::::::::::::/
  | |____ ヽ     .....:::::::::::::::::::::::<
  └___/ ̄ ̄      :::::::::::::::::::::::::|
  |\    |           :::::::::::::::::::::::|
  \ \  \___      ::::::
>412
とりあえずな、
http://www.kegel.com/c10k.html
ここみろ。
>>412
10万って、既にTCPのポート数を超えてると思うんだが(^^;
>>416
ほんとだ・・・。
418410:02/08/19 12:52
>>413
DoSならselect()で待つ必要はないでしょう。

>>415
ありがとうございます。
ですが、standerd lilaryはリコンパイルできる環境ではないんです。
419410:02/08/19 12:54
TCPの接続はunsigned shortでしたっけ?
んじゃあ、サーバを分けるようにします。
なんにせよ、数万コネクションを処理したいんで、困ってます。
とりあえず、ループしながら100個くらいずつ調べることにします。
420デフォルトの名無しさん:02/08/19 12:57
ランアナライザを作りたいのですがどこから勉強をすればいいでしょうか
>>420
まず英語でランはどう書くかから。
>ですが、standerd lilaryはリコンパイルできる環境ではないんです。

ハァ? 意味がわからん。standard libraryって何さ?
selectを使うのが必要条件だってことか?
423410:02/08/19 13:03
>>422
そうです。
>>422
stdlib
>416
TCPのPORTは関係ないだろ。
問題は、ソケットハンドルだろ。
10万の同時接続で、selectは無謀やないやろか、、

あとは、10万/FD_SETSIZE 分forkするとかやな、、
>>425
コネクション張る以上、こちらのポートも消費されると思われ。
428デフォルトの名無しさん:02/08/19 13:15
>>423は俺じゃないんですが。
よく考えれば確かにselect()を使う必要はないです。
ていうか、一回acceptして読み込んだら、後はreplyするだけで良かったみたいです。
ソケットの配列でも作って憶えておきます。お騒がせしました。

>>426
それも無謀っぽいですけどね(^^;
staticのエリアが結構でかいんで。
429410:02/08/19 13:17
>>428は俺です。

>>427
いや、消費されませんよ。
コネクションは向こうのIP:PORTとこっちのIP:PORTなんで、向こうが違えば問題ないです。
TCPパケトの宛先は、SRC_IP:SRC_PORT:DST_IP:DST_PORTの4つで区別
されるから、SRC_PORTが被っても大丈夫じゃないかと思ったんだが、、
>>429
いや、だから65536以上のコネクションは・・・
432デフォルトの名無しさん:02/08/19 13:29
>>431
はい、Portではなくてソケットディスクリプタの制限ですね。
>425, >427 >429 >431 >432
あれれ、一回りしているよ、、?
>>426
それは更に上を逝く無謀さだとおもうが(笑)
apacheとかって10万とか同時接続できるの?
FD_SETSIZEが512やとすると、100K/0.5K = 200.
200 processか、、、たしかにきついな、、
>435
無理です。
そもそもselectだと数百ソケットでもかなりツライ。
kqueue等の別の手段を考えるべき。

http://www.kegel.com/dkftpbench/Poller_bench.html

kqueueは爆速なんだけど、FreeBSD限定なんで注意。
でも、一度このパフォーマンスを味わってしまうと
もうselectには戻れませぬ。
# NetBSDとかLinuxとかに移植しようとする動きはあるようだけど、
# まだ実用レベルじゃなさそう。
そんなん一個のマシンで裁こうとするのがソモソモ間違い。
財力にモノを言わせてスケールアウトすべし。
>438
415で既出
IPアドレス増やせばポート数問題はとりあえずないような。
clientに細工が要るけど、それくらいの接続数を確保する必要のある規模の
サービスなら最初はロビーに尋ねるんじゃなかろうか。
ずっと気になってるんだが、誰も設計については突っ込まないんだな。
10万以上のソケット…って時点で誰もがシステムの設計が怪しいって感じると
思うんだけど。もちろん、シェイプアップして10万以上が限界ってなら分かるけど。

結論からいうと1台のマシンじゃ無理。>>415,>>438の方法でも1台で10万近い
ソケットを捌くのは難しい。俺は>>439に一票。そもそも1台でやる仕事じゃない。
443439:02/08/19 22:20
「10マソ同時アクセス」じゃなくて「ユーザが10万人」だったら可能だね(笑)
444デフォルトの名無しさん:02/08/19 22:32
>10万以上のソケットを監視したいんですが、一発じゃできないですかね?
…「監視」ってんだから同時アクセスじゃねーの? >>410のしたいことが分からんから
何とも言えないが.
ごめん、sage忘れた….
446410:02/08/19 22:38
うぃ。16kコネクション程で分散する方針で話はつきました。
10万コネクションは最大数ですが、同時です。
ソケットの監視はメンドイんで、定期的に直接眺めることにしました。
select()によるタイムアウト処理はしません。
で、結局SRC_PORTはダブってもいいの? よくないの?
SRCはダメだってば
>>447
マスタリングTCP/IP・入門編でも読め. 基礎がなってない.
誰か限界について試した人いる?
パケットがすげえたまにしか来ないんなら10万ぐらいできそうな気がする
>>451
パケットじゃなくてソケット監視なのよね。

今考えると激しく意味不明。
つうかデータの流量抜きに設計できるわけないわな。
マルチスレッドじゃだめなの?
スレッドを10万も起動するの?
>>455
無理なの?
>>456
って言うかそれになんの意味が・・・。
>>457
スレッドならselectする必要ないんじゃない?
そもそも、1proc で 10万も file や socket を開けるもの?
>>459
できるよ。unix方面ではカーネルコンフィグやrlimitの設定が必要だったりするけど。
Javaならスレッドで実現するのが美しいですね。
最近はパフォーマンスも上がってきたことだし、
Javaで10万本スレッド立てれば余裕なんじゃないかな。
>>461
どの道、>>460は必要だろ。
「たった」4GBじゃ10万もスレッド作ったら
スタックのための空間が枯渇しませんか?
4000M/100K=40K...

javaならjava.nio使え。
>>464
同感。

スレッドを無限に生やしても負荷が低いなんて夢見るなよ。>>461
10万なんてオーダなら、やっぱ、負荷分散装置使って、
複数のマシンに処理を振り分けるのが普通だよね。

大規模なwebサービスやってるところのほとんどはそんな感じでしょ。
467デフォルトの名無しさん:02/08/21 18:42
Irvineなどでは分割ダウンロードをサポートしてますが、
非分割DLよりも分割DLのほうが転送量を稼げるのは何故なんですか?
サーバの1コネクションに対する転送量かな
たとえば、10Mbpsの口をもってて、フルスピードだせる鯖があるとしよう。
ここに、100の高速なクライアントが同時接続するとする。おっと、QoSは無しだぜ。

素直に計算すると、一接続あたり100Kbpsだわな。

で、ここで、分割DLと称して、同時接続数を101に増やすクライアントが
1つあるとしようか。 このとき、合計200接続で、1接続あたり50Kbpsだ。
101個の同時接続を果たしたクライアントは、十分時間がたつと、
5050Kbpsの帯域を得ることができる。

本当はもっと多くの要素が絡んでくるが、つまりはそういうことだ。
470467:02/08/21 19:15
>>468-469
早速のレス、ありがとうございます。

キーポイントは「1コネクションあたりの転送量」だと思うのですが、
これは、どのように決定されるのでしょうか?

「1コネクションあたりの転送量」を計算で求めることが可能であれば、
例えば、2台のPC間で、100MBのデータを T秒で転送したいときに
必要なコネクションの数を計算することが出来ますよね?
あくまでも理論値かもしれませんが。

(私にとって)多少内容が難しくても構わないので、
文献等があれば教えていただけませんか?

ずっとぐぐってるんですが、キーワードが絞れなくて
ファイル共有やレンタル鯖情報ばかり引っかかってます・・。
とりあえず、さっき見つけた↓の論文を見つけたので読んでみます。
ttp://www.internetconference.org/ic99/papers/s02p03.pdf
>>470
文献も何も簡単な計算で求められるだろうが。ちょっとは考えれ。
2台のPC間に何も無ければ、コネクション結ぶだけオーバーヘッド食って遅くなる。
オーバーヘッドを除けば、何本張ってもあまり変わらない。
転送時間を制御したいなら、コネクションの数で行うのはナンセンス。
単に送り側がタイマで制御すればよい。
473467:02/08/21 19:59
>>471
すみません、考えます。

>>472
転送量を絞る制御ならタイマで行えますが、
「1コネクションの最大転送量」を超える量を転送したい場合も
コネクション数を増やさずに、タイマで行えるのですか??
# 私は、大きなデータを短時間で転送したいんです…。

ちょっと頭冷やして考えてきます・・・。
ありがとうございました。
ソケットバッファをなるべく広げて、大きな単位で send/recv すればかなり速くなるよ。
それから、diskI/O が入るなら、スレッド使って、ダブルバッファリングでの転送も有効。

あと、TCPがなんとかオプション(わすれた)ってのをサポートしてれば、パケットロスで
差分転送だけで済む。Solarisなら、7ぐらいからサポートはじめたやつ。
nioとか言ってるバカがいるのか
nioそんなにひどいですか?
いくらなんでもスレッド10万とかいうアイデアよりは
マシだと思いますが
nio以前はスレッド10万しかありませんでした...
ところでnioはバグバグだったようですが安定したんですかね
478デフォルトの名無しさん:02/08/22 17:12
rs232c通信からwinsock2でのtcpic通信に変えようとしてるんだけど
rs232cだとPurgeCommで入力バッファをクリアできたけど
winsockだとどうするのん?
>>478
TCPが勝手にやるベ
スレッド10万って何?
スレッドを10万個作るってこと?
>>480
何を今更・・・。

482デフォルトの名無しさん:02/08/22 22:31
以前あったスレだが、recvfromしつつsendtoって
できるものなのか?
マルチスレッド使わなくても。
>>482
フォンノイマン型コンピュータの性質。

それは置いといて非同期IOってできるの?
>>482
非同期IOすればできるんでない?やったことないけど。
485482:02/08/23 00:09
>>484
やっぱ非同期IOとかでないと無理なんかねぇ?
それってwinsock2.0だろ?
知識ないっす。
recvfromとsendtoを交互で呼び出しても、sendtoしてる間は
recvfromが実行されてないわけだからなぁ。
なんかうまいアンド簡単な解決策はないものだろうか・・・。
> 知識ないっす。

調べたり、身に付けたりする能力がないなら手を引いたほうがいいと思うよ。
>>485
>それってwinsock2.0だろ?

知るかボケ。と。
488C ◆7j4tWa.I :02/08/23 02:44
すいませんC#のTcpClient & NetworkStreamクラスを利用した場合の
質問なのですが、どなたか、下記の一連のレスについて分かる方が
いましたら、ご教授願いたいのですが。。。
http://pc3.2ch.net/test/read.cgi/tech/1027531796/586-594

よろしくお願いします。
>>485
> それってwinsock2.0だろ?
> 知識ないっす。(略)
> なんかうまいアンド簡単な解決策はないものだろうか・・・。

お前の使うOSをここに晒せ。
窓の方にメッセージが送られてくるAsyncSocketは
WinSock1.xの時代からあるんでは?
#だって、スレッドのないWin3.1の解決策だったから。
491デフォルトの名無しさん:02/08/24 02:21
スレッド10万age
492デフォルトの名無しさん:02/08/26 19:27
パケットキャプチャプログラムってJavaで
かけますか?
>>492
自分に飛んでくるのはもちろん受け取れるぞ。よかったな。
>>485
下手は考えるまえに適当なソースでも読め。

select して書き込み可能状態なら sendto は block しないで即かえってくる。
select して読み出し可能な状態なら、recvfrom は block しないで即かえってくる。
そゆことになってるからあまり心配すな。

下手に winsock の非同期 API なんか使うと将来 linux にポートするとき困る。
495494:02/08/26 19:35
失礼しました m(_ _)m
UDP の話だったんですか?
なら thread 使うのが良いと思う。
496デフォルトの名無しさん:02/08/26 23:56
ちょっと質問です。
UDPでパケットを送信する際に一定の間隔を空けなければいけない
なんていう状態ってありますでしょうか?

簡単な送信&受信プログラム(指定サイズのパケットを送信&受信)を作成して
パケットが正しく届くか確認したんですがどうもパケットがロストしてしまうんですよね。

最初はノーウェイトでぶん回してたのが原因かと思い、20パケット送ったら10msスリープ
するとかしてみたんですが、それでもロストパケットが発生するんです。
512バイトのパケットを送ったとしても上記の設定では実質4Mbps程度なので問題ないとは
思うのですが…ドライバとかカードの性能なのか、はたまた他に原因があるのか。

こういった現象について何か知ってる方がいらっしゃったら解決策等を教えていただけませんか?
497496:02/08/26 23:58
なんかえらい長文になってた…すみません
UDPパケットを落とすかどうかの判断は双方のOSがそれぞれやってっから
しんどいぞえ
499496:02/08/27 00:37
>498
う〜ん、OSとかになるとプログラムの作りでは無理やり回避させるしかないのかなぁ。

ちなみに、1パケット毎に1msなら問題なしなんで、やはりノーウェイトで
の送信にある程度の限界があるのかも…いや、そんなはずは…でもなぁ。

500ななーしさん@接続しっぱなし:02/08/27 01:07
>>496,497,499
つーか、お前はTCP/IPを一から勉強し直せ。
早めにやっておくと、programがこんがらがる前に取り返しがつく。

packet lossを防ぐのは、TCP moduleの方が君よりずーと得意だと思うぞ。
>>499
ノーウエイトで送れば、送信側より受信側のほうの処理が遅ければ
ロストするかもよ?もしくは間に入ってるルーターの速度とかは大丈夫?
つうか、いくらUDPだからってそう頻繁にロストするとは考えにくいんだがなぁ。
その回線やPC、他にイロイロ動いてんの?
503496:02/08/27 01:18
>500
いや、TCPの送出モジュールは既にあって今UDPの送出モジュールを作らなければ
いけないのですよ。

>501
受信側ですか…なるほど、送信側ばかり気にしていた感があるので
受信側の受け方も少し見てみます。
504496:02/08/27 01:21
>502
他に動いているものはウィルスバスターくらいかと。
回線は完全にローカル環境(PC-HUB-PC)で試験してます。
>>504ウイルスバスターは思いと重います。
506デフォルトの名無しさん:02/08/27 01:33
特定のアプリのソケット通信の内容を傍受するには、どのようにすれば良いのでしょうか?
誰かご存知の方はおられませんか。

デバッグモードで立ち上げてsockの関数エントリを書き換えるといったものではなく、ただ
単に何を受信し、何を送ったかわかれば良いのですが。
507505:02/08/27 01:36
最近ウイルスバスターつかってないのでわかりませんが、
受信データをチェックする機能を簡単にoffできたと思います。
それによってPCが相当軽くなった記憶があります。
ethrealとか使えよ。
プログラム側の話なら、WinPCap。
509ななーしさん@接続しっぱなし:02/08/27 08:23
>>502
> つうか、いくらUDPだからってそう頻繁にロストするとは考えにくいんだがなぁ。

そういう仮定自体、全くインターネット的ではないのだが…

>>503
> 受信側ですか…なるほど、送信側ばかり気にしていた感があるので
> 受信側の受け方も少し見てみます。

特定の環境だけで(快適に)動くsoftwareを作っているわけ?
511496:02/08/27 10:24
>509
特定環境というわけではないですが、まずは他に影響のないような環境で
動作を確認してからと考えています。
>>511
実装で確認する前に勉強した方がいいよ。

> 特定環境というわけではないですが、

なら無駄な試行錯誤になることが確実だから。

頭がネットワークプログラミングに切り替わってない。
513デフォルトの名無しさん:02/08/27 10:43
>>508
いや、解析ダンプしたいわけではなくて、MMORPGの地図ナビゲートツールを作りたい
ので、サーバーから送られてくる現在の座標を得たいのです。
514ななーしさん@接続しっぱなし:02/08/27 11:11
>>513
それやりたきゃ>>508のWinpcapでしょ。
「特定のアプリの」はsource port番号指定で出来ない?
515デフォルトの名無しさん:02/08/27 12:42
>>514
Winpcapを使いますと、Winpcapをインストールしないといけなくなるので
一般配布する事を考慮して独自にキャプチャしたいと考えています。

あとrawモードでキャプチャする方式だとすると、ネットワークカードが入
っていない環境では問題があるのではないかと。
>>515
VBスレにいた厨房だな。
Windows自体がそういうAPIを提供していない以上
自分でデバドラ書くかWinpcapとかいうの使うしかないでしょ。
あとネットワークカードが入っていない環境でなんの問題があるの?
素直にWinsock2.2を使えよ
>516
ダイヤルアップのことを想定しているのでわ?
>>517
Winsock2.2はダイアルアップのも取れるよ
519デフォルトの名無しさん:02/08/27 14:50
>>516
そのVBスレの厨房は誰だか知りませんが、もちろんSockのAPIでどうにかするという
発想では無理でしょう。またネットワーク全体をワッチしたいわけではないので、デバ
ドラを書く必要は無いでしょう。

現にデバドラどころかDLLも使わず、後から起動して自由に特定アプりのパケットを
監視、フィルタリングできるツールというのが出回っているので、本質的には可能な
のでしょうが、考えていたらこれはソケットの知識じゃなく、別の知識が無ければ書
けないような気がしてきました。


>>517
その通りです。
>>519
理路整然としているが結局のところは何も語っていないというのがおもしろい。
>現にデバドラどころかDLLも使わず、後から起動して自由に特定アプりのパケットを
>監視、フィルタリングできるツールというのが出回っている

ツール名教えれ。
522デフォルトの名無しさん:02/08/27 14:59
>>520
詰まっているんですよ。結局、大体の方向性はこれだろうなというのが分かっていま
すが、突破口が見つからないという。しかし他の人がすんなりやっているからには、
何か知らない出口があるのかも知れないと。それで相談をと。

下にあったVBのスレを探してみますと、似たような事をしたい人が質問をしていました。
すると653で

Winsock2.2を使えばCでちゃちゃっとできるが
VBでもAPIさえ定義すればちゃちゃっとできると思う。

というアンサーが。本当にちゃちゃっと出来る事でしょうか。
523デフォルトの名無しさん:02/08/27 15:02
Linuxのソケットで質問です。
acceptしたソケットに応答するためsendするときに、すでにクライアント側でshutdown/closeされている場合、
sendすると例外が発生してプログラムが終了してしまいます。
これを回避するには

・応答するためのsocketがすでに閉じられていないか判定する
・sendで例外が発生しても終了しないようにする

のどちらかだと思うのですが、どちらでもいいので対処法を教えて下さい。
524デフォルトの名無しさん:02/08/27 15:03
>>521
例えばWPEです。他にはhttp://treds.co.uk/ragfiles/あたりなどからも何か手に入る
かと思います。
525505:02/08/27 15:05
>>523例外をcatchすればいいだけでは・・・・・・。
>512
Windows Packet Editor 1.3なるものを落としてみたが、
"WSKGSPY.VXD" なるファイルがついてるし、
>This tool work under w95 and w98 only.
ってかいてあって、WindowsXPでは起動しねーし。

つか、vxdの役割はわかっているのか?>524
527デフォルトの名無しさん:02/08/27 15:24
>>526
WPEは確かにVXDがついていますが、これで組んだ実行形式のフィルタはVXD無し
で動くようです。
NT系でやるには、WPE Proの方を使います。これにはDLLがついていますが。
>>522
Winsock2.2でぐぐってみろ、そのまんまが見つかるから
>>523,525
SIGPIPE喰らってんじゃないの?
signal(SIGPIPE, SIG_IGN)しときな。
>>525
すんまそん、素のCなんです。
>>529
あ、PIPEですか。やってみます。
532496:02/08/27 16:06
え〜と、パケットロストの件ですが解決できました。
直接の原因なんですが、socketの受信バッファが足りてませんでした。

WinPCapにて送信側、受信側のパケットを監視したところパケットはロストせずに
届いてたので、その辺から510のページ見て受信バッファの設定して…
って感じでした。

皆さんありがとうございました。ほんと、助かりました。
>>529
できますた。ありがとうございます。
534デフォルトの名無しさん:02/08/27 16:50
>>528
もしこれの事でしたら、もう何ヶ月か前に見たのですが、ちょっと違うのです。
というのは、パケットを見るだけなら良いのですが、フィルタができないものでして。

http://homepage2.nifty.com/spw/hint/PacketDump.html
IPアドレスなりPortなりで、自分でフィルタリングすればいいんじゃねぇの?
>>534
おいおい。フィルタってIPやポートでするんだろ。
だったら受信したパケットにIPやポート番号が入ってるんだから
それを見るってことだよ。
君はCOBOLerか?
すにっふぁーな文脈で使われるフィルタとは、たとえば
TCPの**番ポートだけをキャプチャし、それ以外は捨てる、
と言うような意味。

おそらく、どこかの板の方言で、横取ったパケットを、ルールに従い
書き換えて元々の通信しているホストにつかますことを、
「フィルタ」と呼ぶのではないでしょうか。

いずれにしても、506はコテハンにして、用語を慎重に選択すべきだとおもふ。
>>537
混乱させないでくれよ。
>>506の言ってるのは前者でいいだろ
539漏れはコテハソ:02/08/27 17:21
>>537
これは失礼しました。
おっしゃる通り、この場合のフィルタとはチート用語の意味のフィルタでして。
一般用語のフィルタリングとは全く意味が違います。
用語には気を付けます。

>>538
後者なのです。
どうして>>537が後者だとわかったのか不思議だ
手がかりは>>513なのか?
MMORPGっての知らないからわからないのかな。うーん。
不思議だね。後者をフィルタと呼ぶなんて初めて知ったよ。考えもしなかった。
でも、>>513の要求は、普通に監視すればよいと思うのだが。
>>543
そうだよねー。そう、思うよね。
545漏れはコテハソ:02/08/27 17:45
>>540
場合によっては余計な刺激となる部分を隠している事に気付かれたのでしょう。

>>542
チーターの世界の隠語だと思います。


何でフィルタもとい、パケットの編集を要するかと言うと、いや別に編集はできな
くても良く、送信できる必要があるだけですが、こちらからコマンドを送ると座標
が返ってきたり、周囲にある障害物の情報が返ったりするので、ナビツールとし
て成り立たせるためにはパケットを送信する必要があるためです。
546(・∀・):02/08/27 23:12
質問します。UDPでソケット作って送受信をおこなうクライアントおよびサーバ
のPGやってるんですが、UDPソケットでクライアントがconnectして、readおよび
writeを使った送受信ってどうやるんですか。

サーバ→read
クライアント→write

ではじめのやり取りはできるのですが、そのあと

サーバ→write
クライアント→read

とやっても、サーバ側に、相手がわからんというエラーで
落ちちゃいます。

UDPでサーバ側のwriteはできないのでしょうか?
もしできるのなら、例をみたいのですが。

環境はRH7.2のLinux環境です。
>>546
UDPでConnectはしませんが、何か?
>サーバ→read
>クライアント→write
>ではじめのやり取りはできるのですが、

マジですか!?
>>546
UDPとTCPの違いを勉強しなおしてから出直してください。
なぜTCPの前にUDPをやりたがるのかが正直分らん
551(・∀・):02/08/27 23:39
しゃーないんです。UDPでconnectしないことぐらいしってますし。
テストしてるんですが、どうしてもUDPでwrite、readの送受信が
やりたいんです。
しゃーないんです。UDPでconnectしないことぐらいしってますか。
テストしてるんですか?どうしてもUDPでwrite、readの送受信は
できないんです。
しゃーないんです。UDPでconnectしないことぐらいしってますか。
テストしてるんですか?どうしてもUDPでwrite、readの送受信は
できないんです。
 
しゃーないんです。UDPでconnectしないことぐらいしってますか。
テストしてるんですか?どうしてもUDPでwrite、readの送受信は
できないんです。
>>551
なんか、ここで聞くやつは、わかってないくせに生意気な態度のやつが多いな。
connectしないってことは、送信するときは相手を指定して送らないといけないんだぞ
要はクライアントもサーバーにしなきゃいかんのだぞ
接続って概念がないんだぞ
ただ送るだけなんだぞ、ただ来たパケットを受信するだけなんだぞ
557(・∀・):02/08/28 00:08
しらないんだったら、しらないっていえば?
ばかみたい。

ちなみに、UDPでもクライアントがconnectすればサーバ側のreadにたいして
writeでデータおくれます。

逆ができなくてこまっていたんですけど。聞いてもむだみたい。
>>557
そうですね。無駄です。さようなら。
>>557
ソース晒してみろ。オレが添削してやるよ。
>>557
なんで、sendto や recvfrom 使わないの?
561学生:02/08/28 17:59
gethostbynameからhostentの構造体のポインタをとってきて、そのメンバの
h_addr_list[0]をに格納されているアドレスを10進数方式で表示するプログラ
ムをつくっているんですけど、アドレスがうまく表示されません。

ちなみに環境はRedHat7.3+gcc2.96です。

#include <netdb.h>
#include <stdio.h>

main() {

struct hostent *ht;
char *host = "www.2ch.net";

if (ht = gethostbyname(host))
printf("The address of %s is %s\n", host, inet_ntoa(ht->h_addr_list[0]));
else
printf("error\n");

exit(0);
}
> inet_ntoa(ht->h_addr_list[0])
が文字列へのポインタとはとても思えない。
それにたいして、%sを使用しているところ。
563デフォルトの名無しさん:02/08/28 18:58
IPプロトコルの仕組み全然知らないんですが、
UDPでsendtoしてパケットを送信すると、いちいちIPアドレスから
相手のMACアドレスを引いて送信することになるんですよね?
かなりのタイムロスになる気がするんですが、コネクションを張れば解消されるのでしょうか?
564学生:02/08/28 18:59
>562
>> inet_ntoa(ht->h_addr_list[0])
>が文字列へのポインタとはとても思えない。

manで調べたら、
char *inet_ntoa(struct in_addr in);
と出ましたが、これって文字列のポインタじゃないんですか?


あと関係ないかもしれませんが、ht->h_addr_list[0]をstruct in_addrのポイ
ンタにキャストしてみたんですけど、結果は同じでした。。。

ちなみに実行結果は
The address of www.2ch.net is 24.152.4.8
となります。(本当は64.71.145.43)
>>563
一度IPアドレス→MACアドレス変換をした結果はarpキャッシュに入るから、
毎回MACアドレスを引きにいったりはしないよ。

「コネクションを張れば」って、UDPにそんなものはないです。
UDPに対してconnect()ができるのは、sendto()で毎回宛先アドレスを指定
するかわりにあらかじめ宛先を決めておける、程度の意味しかない。
connect()してプロトコル上何か違いがあるわけじゃないです。
566デフォルトの名無しさん:02/08/28 19:52
>>562

inet_ntoa()は文字列へのポインタを返す。だからそれに対しての %s
は間違ってはいない。

=== freebsd の man より ===
The routine inet_ntoa() takes an Internet address and returns
an ASCII string representing the address in `.' notation.
  ^^^^^^^^^^^^
===========================

問題なのは、inet_ntoa()渡している引数の方だろう。

>>564
struct in_addr tmp;
memcpy(&tmp, ht->h_addr_list[0], sizeof(tmp));
printf("%s\n", inet_ntoa(tmp));

やってみ。
>>561
h_addr_list[0]はアドレスそのものが格納されてるわけじゃなくて、
アドレスへのポインタが入ってる。

inet_ntoa()にはstruct in_addrへのポインタじゃなくて実体を渡すように
なってるので、inet_ntoa(*(struct in_addr *)ht->h_addr_list[0])
にするとちゃんと表示されたよ。
568 :02/08/28 23:44
細かい事ですが、ポートやソケットディスクリプタ用に用意した変数の
初期化(無効な初期値の設定)は何を代入すべきでしょうか?

int port = 0;
int sockfd = 0;

とかでいいのかな?
socket()の戻り値は-1でエラーだから-1がいいだろうね
いわゆるunixでは、0は少なくともfdとして有効な値だから避けたほうがいい

portは0は使われないという保証があったっけ?
570デフォルトの名無しさん:02/08/29 00:07
sockfd は俺は -1 にしてるな。
port は別に初期化しておく必要はあまりないな。
作るソフト次第でデフォルトポートを設定する。
571 :02/08/29 00:24
ということは、一応 port も-1にしておく方がいいのかな
port0はウェルノウンポートとして予約済み。
573学生:02/08/29 10:29
>>566,>>567
うまくいきました!ありがとうございます。

ポインタでつっかかるなんて、まだまだ厨房ですね...
厨房もいいとこだ。
>>571しかしportを入れる変数をshortにしてしまい、-1を入れたらport 65535と間違える罠。
576デフォルトの名無しさん:02/08/29 12:26
>>575 の言う通りの間違いをやらかしそうだな。

>>568 はいったいどんなプログラムを作りたいのよ?
>>575
shortがデフォルトてunsignedな処理系って見たことないぞ
>>546
ちゃんとサーバ側でもconnect(2)しているの?

UDPのconnect(2)って、kernel内のsocket構造体に、
「このUDP socketの宛先はここなのよん」と書き込むだけ。

>>546
> サーバ→write
> クライアント→read
>
> とやっても、サーバ側に、相手がわからんというエラーで
> 落ちちゃいます。

やってないから、「サーバ側『で』」エラーが起きちゃうんじゃねーの?
>>577
そりゃchar以外の無印整数型がunsignedだったら規格違反だし
アナログ回線だとノイズが乗ってしまうのですが、
HTTP等のプロトコルでノイズの対処はどのようにすればいいのでしょうか。
下層でやってくれる
>>580みたいなのを諺でなんていうんだっけ?
583 :02/08/31 01:57
灯台モト冬樹
捕らぬ狸の皮算用?
正直者が馬鹿を見る?
旅は道連れ世は情け
泣いて馬謖を斬る?
 
氏して屍拾うものなし?
渡る世間は兎ばかり 
ウサギばっかり! ステキ! 萌え!
 
多分>>590が考えてるような兎はいない
>582
石橋を叩きて渡る?
羮に懲りて膾を吹く?
馬鹿に付ける薬なし
振り向くとしょーえい
振り向けばショーエイ 
596 :02/08/31 13:32
振り向けば孫の禿げ
  
あの、、、そろそろスレにもどりませぬか?(w
ネットにダイヤルアップでつながっているか否かを調べる方法はありますか?
杞憂?
>>599
win32環境?
>>599
リンクの種類を知りたいのなら OS 依存。
IP reachability を知りたいのなら適当なホストへの到達性を調べる。
603599:02/08/31 22:22
すいません、Win32環境です。
>>603
だったらwininetでMSDL調べるべし。
605599:02/08/31 22:38
わかりました。
RasEnumConnectionsで出来ました。
でもこれってADSLなどの環境でもRASPPPoE使われたら、ダイヤルアップと判断しちゃいますよね。
それはどうしようもないか・・・。
>>605
Ras系のAPIで接続に使われてる回線の種類を取得できない?
具体的にはRASENTRY構造体のszDeviceTypeメンバー
RASDT_PPPoEになるのはXPのPPPoEを使った場合だけみたいだけど
RASPPPoEではどうなるのかむしろ報告きぼんぬ
おまいらスレ違いなのでwin32APIスレ等に行きたまへ
移動したので以後はあっちで。
http://pc3.2ch.net/test/read.cgi/tech/1028580373/530-
すびばせん、ちょっとすれ違いかも知れませんが、たっているスレの中で一番近い内容だったので、質問させてください。
現在、OpenSSLを実装して、通信しようとしていますが、SSL_connectでこけます。開発は、C言語でWinsockです。
SSL_library_init()
SSL_load_error_strings()
SSL_CTX_new()
     connect()
SSL_new()
SSL_set_fd()
SSL_connect()
の順序にて、関数を実行していますが、他に必要なイニシャル(SSL_connect前にすべき事)はありますか?
本もWebも調べたのですが、ほとんどのサンプルは、これと同じように書いてあります。
(もちろんconnect()は完了してから、後の処理を行ってます)
611610:02/09/03 09:42
sageちっち。もちろんAGE
あー、なんか記憶あるなー、なんだったっけ
よくわからんから手元にあるソースを貼り付け

int sd;
SSL_CTX *ctx;
SSL *ssl;

sd = socket(AF_INET, SOCK_STREAM, 0);
connect(sd, (struct sockaddr*)&server, sizeof(server));

SSL_load_error_strings();
SSL_library_init();
ctx = SSL_CTX_new(SSLv2_client_method());
ssl = SSL_new(ctx);
SSL_set_fd(ssl, sd);
SSL_connect(ssl);
614610:02/09/04 04:08
>>613
サンクス。
んんー。同じ事やっているんですが動かないです。
なんでだろう?
動かない、ってだけでは殆ど何もわからん。
どこそこの部分でXXなエラーがでるとかなんとか言えよ。
それと通信相手のこともな。(HTTPS鯖か?)
616610:02/09/05 22:22
>>615
>>610のSSL_connectの戻り値が、0で終わります。
それ以前の関数は、全て正常に実行されますので、他にイニシャルが足りないのかなとか思っちゃいました。
相手先は、HTTPS鯖です。
SSL_get_error()で原因をば
linuxのTCP/IPのソケットで、setsockoptでLINGERを指定しています。
l_onoff=1;
l_linger=0;
この設定でshutdwon/closeをしてもTIME_WAITになるときとならないときがあるんですが、
原因と対処方法が分かる方がいれば、教えて下さい。
619デフォルトの名無しさん:02/09/06 20:06
VBでwininet.dllを使ってプログラムを組んでいます。
httpでユーザー名とパスワードを設定したいのですがどうすればいいでしょうか?
今のところInternetSetOptionを使うのだと言う事はわかっているんですがうまくいっていません。

InternetOpen->InternetOpenUrl->InternetSetOption->InternetReadFile
の順でやってみていますが今のところ
401 Authorization Required
です。

620デフォルトの名無しさん:02/09/06 21:10
JavaでURLクラスとHttpURLConnectionクラスで接続すると
User_AgentがJava1.3.1_02になるんですが、
これを変更するにはどうしたらいいですか?
621デフォルトの名無しさん:02/09/06 21:33
VBなんですけど、IPアドレスを指定してそのネットワークカードのMACアドレスを取得する方法や関数は、ありませんか?
622デフォルトの名無しさん:02/09/06 22:05
>>621
パケットを解析すれば良いのでは?と思うんですけど。
間違ってたらごめん。
自PCの?それとも他の?
625621:02/09/07 09:44
>>622 え、どうやるんですか?厨な質問すいません。。これでも専門学校生です
>>623 他のマシンのMACアドレスです
626デフォルトの名無しさん:02/09/07 09:51
>>624
とりあえず調べたことある。そのときに
HttpURLConnection.setRequestProperty( "User_Agent","agent");
ってあったんだが、そうすると
User_Agent: Java1.3.1_02
User_Agent: agent
の二つ出てくるんですが
>>626
1.4.1で試した?
>>626
というよりも自分の環境を列挙しないと
誰も答えてくれないよ。
629デフォルトの名無しさん:02/09/07 11:34
>>621
VBにはねーだろ。arpコマンドの出力を加工すれば?
同じサブネットのやつしか取れないけどな。
>>621
API 呼ぶしかない。Windows98 以降 or WindowsNT 4.0 (SP4) 以降な
ら...
http://www.mitene.or.jp/~sugisita/family/papa/vb/index.html
を参照すればいいらしい。
631621:02/09/07 12:50
>>629-630
ありがとうございます!ありそうな感じです。いろいろと調べてみます。
632デフォルトの名無しさん:02/09/08 08:22
Winsockで非同期でスレッドを使ったマルチクライアントに対応した
サーバープログラムのサンプルってないですか?
青い背表紙のゴツい本があったきがする
win32 ネットワークプログラミング
みたいな
samples\netds\WinSock\iocp
とかではいかんのか?
635デフォルトの名無しさん:02/09/09 16:09
WindowsPCにLANカード二枚さしてローカルルータにしたいのですが
どのようなソフトがあるでしょうか?
このスレ的には
「そういうソフトをつくれ」
になるわけだが。
>>636
そこのところを、なにとぞよろしゅうお願いします。
ttp://msyk.locus.co.jp/cabletv/win98/win_router.html
よくワカランが、多分似たようなモン。
でも本当に板違いなんで、回線切って首吊って氏んでね☆
>>638
さすがです。さんくす。氏ぬのはかんべんしてね☆
640デフォルトの名無しさん:02/09/13 02:00
netstatに加えてアプリケーション名まで表示するプログラムを作ろうとしています。
(TCPViewのようなもの:http://www.sysinternals.com/ntw2k/source/tcpview.shtml)
LocalAddress/Port、RemoteAddress/Portまで取得できています。
このコネクションを確保しているアプリケーションを特定する方法はあるでしょうか?
ターゲットはWindows2000です。
(WindowsXPのAllocateAndGetTcpExTableFromStackみたいなのが欲しいのですが……)
641デフォルトの名無しさん:02/09/14 06:26
Winsockで、あるスレッドがgethosybyname()を呼び出しているとします。
この呼び出しをほかのスレッドから強制終了させることはできないでしょうか?

やはり、TerminateThreadとか使わないといけないんでしょうか?
ありませぬ
gethosybyname
そんな関数はありませぬぞ
おたわむれを
644641:02/09/14 07:22
gethostbynameが正しいです
よいでわないかよいでわないか

あの、長ったらしい非同期の方をつかいなはれ
WSAなんとかの方。
WSAAsyncGetHostByNameぞなもし?
UNIX ネットワークプログラミング Vol.3はもう出ないんですかね
Richard Stevens死んだよ。だからVol.3は出ないし、改訂もされない。
http://www.kohala.com/start
http://www.hackcanada.com/hackcanada/media/hnn090899.html
せめて遺稿だけでも
だめ?
649デフォルトの名無しさん:02/09/16 03:56
自分のホスト(ADSL)のグローバルIPアドレスを取得したいんですが、
簡単な方法ありませんか?
(正攻法だとローカルIPアドレス(192.168.〜とか)しか取得できないみたいなんで)
TAの設定見に行くしかないでしょうか?
そんなん、つながったIP返してもらうような鯖に
つないでみて、教えてもらうしなないでしょう。
651649:02/09/16 06:57
>>650
ありがとうございます。
検索してもその方法か、TAの設定ページ見に行く方法しかありませんでした。
(後者は機種限定の様で。)
どっちにしてもプログラムで扱える様に加工しないといけない様です。
めんどっちいのでまたの機会にします。
>>649
# traceroute -m 2 www.2ch.net
の結果を加工。
653デフォルトの名無しさん:02/09/16 18:27
win上でC言語でTCPを使ってデータの受け渡しをしたいんですが
send()やrecv()って文字列で送受信するように決められてるらしいのですが
それ以外はintとかおくるにはどうすればいいのでしょうか?
intでしていてcharでキャストとかやってみたんですがどうもできないみたいで・・
> send()やrecv()って文字列で送受信するように決められてるらしいのですが

歴史的事情からchar*になってるけど、実際はバイト列と思ったほうがいいです
実際の値を指定しているに
656デフォルトの名無しさん:02/09/16 18:34
>>653
文字列じゃねぇよ。バイト列だ。
int value=123;
send(socket, (char*)&value, sizeof(value), 0);

でやれ。
657656:02/09/16 18:35
被ったスマソ
htonl等、ネットワークバイトオーダーの考慮も忘れずに。
>>658
ホストバイトオーダーが同じホスト同士だったらいらんよね?(一応確認
660653:02/09/16 18:40
>>654-659
みなさんレスありがとう!!

int brf[100]

send(socket, (char*)&buf, sizeof(value), 0);

でいけるでしょうか?ためす環境がなくて・・・。前このようなかんじでやってできなかったもので




661653:02/09/16 18:42
int brf[100]じゃなくて
int buf[100]でした;;

超ド級初心者でごめんなさい・・・
受け取る方がちゃんとしてれば多分いける。
つっかsizeof(value)じゃなくてsizeof(buf)だな
>>660
&が余分なんじゃない?
664653:02/09/16 18:47
受け取る方も

int buf[100]

send(socket, (char*)&buf, sizeof(buf)0);

みたいなのでいいんでしょうか?

かなりばかなしつもんかもしれないんですがcharは8バイトでintは32バイトぐらいで違うと思うんですが
大丈夫なんでしょうか?
まず、アドレスやポインタの概念を勉強したほうが良いと思われ
>>664
あ,>>663も見れ。

>charは8バイトでintは32バイトぐらいで
?????????????????????????
>>665
>>664は単位の勉強も必要と思われ
解説

int a[2] があったら,内部では
______________
|0123|0123|
~~~~~~~~~~~
↑a[0] ↑a[1]
となっていると考えれ。そんで, (char*) aとすると,
__________________
|0|1|2|3|0|1|2|3|
~~~~~~~~~~~~~~~
となると考えよ。
669653:02/09/16 18:57
>>662-668
みなさんこんな僕にレスありがとう!!

668さん丁寧な説明ありがとう、じゃーデータの損失とかはなく、気にしなくていいってことですね!
勉強してるんですがおいつかなくて;;;
670デフォルトの名無しさん:02/09/16 18:59
>>669
ネタにマジレスカコイイ
>>669
>データの損失とかはなく、気にしなくていいってことですね
そうだ。値のキャストとポインタのキャストは違うと思え。

値のキャスト: キャスト先のバイト数に合わせられる
ポインタのキャスト: キャスト先のポインタ型であると”見なす”
>>668
その図は・・・ネタ?
>>672
初心者に教えるには最適だと思うが,何か?
-
>>669
TCP ならデータの損失 (欠落が正しい) は無いと思っていいが、送信元が
10バイト送っても、受信側で 9バイトしか受信できない時があるから気をつけて
ね。残りの1バイトは、もう一回受信すると読める。当然逆 (送信元が 10バイト
2回送ってるのに、受信側で 20バイト読める) もあるからね。

昔、ちょっとはまった事あり。
>>675
たぶん>>669で言ってるのは話の流れからしてキャストによるデータ損失のことだと思われ。
あ,でも>>675の言ってることは大事なことなので言うのは良い。
>>669へのレスではなく653さんへのレスなら正しいのだとおもう
678653:02/09/16 22:13
本をみてたのですが送受信のサイズのところで
send()ではstrlen()
をつかっていて
recv()ではsizeof()
をつかってるみたいなんですがこれってどういうことなんでしょう?
>>675
そうゆう場合はMSG_WAITALLを指定するというのも有なのでは?
ブロックしていいなら
>>678
単に受信データのサイズが可変長だからバッファのサイズを指定してる
だけなのでは?
どうもこうも。通信仕様で決めたオフセットにあるデータサイズを受信しないとだめだよ。
その本のsizeof()は恐らくC/Sが完全に同期をとってやりとりしてんだろうけど。
682653:02/09/16 22:25
両方sizeof()じゃーだめなんでしょうか?
strlen()だと \0 までのサイズだろう?
バイナリデータだと途中に \0 が入ってるかもしれないだろう?
そういうこった。
send()は送信データのサイズを指定
でrecv()は受信データを書き込むメモリのサイズを指定
だからrecv()のとこでオーバーフローしなければいいんで
ないかな?
でもなんでsizeof()にこだわる必要があるのですか
sendにstrlenを使うのは、実際に送る長さを求めるため。
recvにsizeofを使うのは、受け取れる最大長を指定するため。

freadやfwrite使った事ある?
>>682
char str[1000];
strcpy(str,"12345");
の時,
send(socket,str,strlen(str),0) // 5バイト送る
send(socket,str,sizeof(str),0) // 1000バイト送る
だ。
sendにsizeof()使ったでも構わんが,それは意図した動作かどうか良く考え。
687686:02/09/16 22:44
何か最後日本語めちゃくちゃでスマソ
結局send()には実際に何バイト送りたいかを指定するのだ。
>>686の例で,実はstrがバイナリデータで,1000バイト送りたいのならsizeof(str)だ。
だからさー。
char str[1000];
strcpy(str,"12345");
int len = strlen(str);
send( sd, &len, sizeof(int), 0 );
send( sd, str, strlen(str), 0 );
だってばさー。ウケ側は
recv( sd, &len, sizeof(int), 0 );
recv( sd, str, len, 0 );
だっつーの。
>>688
送られてくるサイズ分かってたらいいでしょ?
653を混乱させたいわけ?
いや、別に混乱させたいワケじゃなくって。
送信時にstrlenっつーことは固定長じゃないでしょ?
それに
send( sd, str1, strlen(str1), 0 );
send( sd, str2, strlen(str2), 0 );
ってやられたらどーすんの?
653さんはなんとなくrecv()の方で混乱しているのでは?
692653:02/09/16 22:56
>>683-688
みなさんありがとうございます。おかげで理解できました。
たとえば
int buf[1000]

で1から1000まで順番にいれてそれをおくりたいんですが
send(socket, (char*)&buf, strlen((char*)buf),0);

受信側では

int buf[1000]

recv(socket, (char*)&buf, sizeof(buf)0);


でいけるんでしょうか?今ためせなくて・・・
まちがってるところあるでしょうか?

693653:02/09/16 22:58
あ、すいません&は抜きでおねがいします
バイナリでintの値を送るなら全部(sizeof(buf)分)sendしろ。
intの値に256とかが含まれてたらstrlenじゃだめ

だから、write/readとおなじなの。
695653:02/09/16 23:01
本では文字列を打ち込んで送るというプログラムでした。
それを計算して数値を送るというのに変えたいと思っています。

本では文字列を打ち込むので長さがわからないということでstrlenをつかってたみたいですね。

数値を送る場合はstrlenは使わないほうがいいでしょうか?strlenはNULLまでのサイズということなら。
日本語おかしくてすいません;;;


んー、まぁ、今の練習(だと思う)の場合はソレでもいいよ。
でも、>>690で書いたように連続でなんか送ってきたり、
一回のrecvで到達/受信しきれないデータがきたりするんで、
早いトコ慣れて、通信仕様(今の場合先頭のsizeof(int)に電文長が収まってる)を決めて
やり取りすることを憶えた方がいいよ、絶対。
もっとさ、基本的なファイル入出力とかそういうの、わかってる?
ネットワークの送受信もその応用なんだけど、そこまでいってないような。
うお。>>696>>692へのレスですよ。
>>695は当然バイナリを送るんだからstrlenなんて*使ったらダメ*。
send()したデータが一回のrecv()コールで読み出せないこともある
>>675さんがもういってるけど
>>690
あ,マジレスだったのね。スマソ。
>send( sd, str1, strlen(str1), 0 );
>send( sd, str2, strlen(str2), 0 );
>ってやられたらどーすんの?
いや,十分分かってますよ。
でも,プロトコルが区切りを含んでいるやつなら別に構わんでしょう?
例えばHTTP。
701653:02/09/16 23:10
>>694-700
ありがとうございます。ほんと助かります。今周りに聞く人がいなくて;;;

通信仕様覚えた方がいいですね。一回で送れたりできたないってのが僕にとってはかなり壁になりそう;;;
がんばってみます。ありがとうございました
>>690
> send( sd, str1, strlen(str1), 0 );
> send( sd, str2, strlen(str2), 0 );
> ってやられたらどーすんの?
どーすんのって、どうしようもないよ。
HTTPでもContentLengthまでは無理矢理読んで、
\n\n以降はContentLength長読む、ってカンジだよね。
もちろん、プロトコルが区切りってのも分かる。
一回で送れないとか、まとめて読み出してしまうとかは
まだ気にしなくてもいいかもしれない
>>705
そうだね。
多分そのうち653から
「○○バイト送ったはずなのに届いたデータが足りないんですぅぅぅ!!」
という質問が来るに1000パケット。
意味がわからない
意味がわからない
「意味がわからない」と泣き出すのに10000トランザクション
漏れの方が泣きたいです
結局ネットワークプログラミングの話題ってこればっかりなんだよなー
奥が浅いよなー
スレッドの同期も絡めた話まで発展させりゃいいんだろうけど、
マルチスレッドのスレッドが別にある罠
低層の技術としてはこんなもん。
重要なのはセッション層より上の手順。
OSIモデルって違和感あるんですけど
>>713
OSIは忘れていいです。
TCP_KEEPLIVEオプションがインプリしてあるシステムってあります?
相手からのcloseではなく途中の障害で切断された場合の検出に
SO_KEEPALIVE使用するんですけど、検出に2時間っていうのが

一般的にTCPのコネクション切断を知る手段って?
自分で勝手に「2分間応答がなければ切断されたものと
見なす」みたいなルール決める。
TCP_KEEPALIVEの間違いですた
tcp_keepidleの値を変更すると、システム全部に影響が出るんで
それは避けたいなっと
718名無しさん@接続しっぱなし:02/09/17 14:34
>>701
> 一回で送れたりできたないってのが僕にとってはかなり壁になりそう;;;

んな奴がTCPでsend/recv使うんじゃね─よ。
シングルタスク、同期通信なら、fwrite/freadで十分だろ。

> 通信仕様覚えた方がいいですね。

全世界共通規格としてのプロトコルと、
あんたのアプリ間通信の局所的取り決めを区別出来るようになりな。

>>713
TCP/IPプロトコル群のレイヤー構成にピッタリマッチしなくても、
>>653は一度レイヤーに付いて学んでおく必要があると思うけど、どない?
つか通信プログラムに手をつけるのが早いような気がする・・・
外出だが,通信より先にI/O関係を覚えたほうがいいね。
#っていうか通信って結局I/Oだし。ソケット使えばファイル操作とほとんど同じだし
>>718さんのいうことは>>653さんに限らずという気がします。

それとは別の話としてまずUDP使ったサンプルとか、
エコークライアントとかでTCPダンプしたほうが理解が早い。
きっと。
一度のwriteで全部書けない、というのが現実にバンバン起こるのは
socketが初めての人が多いきがする。
writeは全部書けるっつーの。
相手がファイルでも、書ける事は保証されてないでしょ。
相手がソケットなら確実に保証されてない。(Win系はWriteFileね)
ま、つまり>>722は「>>723みたいな人が多い」と言いたかったんだろうな
正直write()で指定したサイズ以下の書き込みができないのは
FIONBIO指定&ネットワーク上に負荷かけたとき位なのでは?
sendもwriteも送るっつーの。
エラーのことをいってんのか?
・・・サイズ以下の書き込みしかできないのは・・・

ですた
ディスクフルとかの時は一度限界まで書き込んで(指定以下のサイズを書きこんで)
次のwriteでエラー(-1)が返るんじゃないの?知らんけど。
ソケットに割り当てられているバッファが限界になると起こります。
send()において「全部は書きこめなかった」が起こるのは間違いない。
でも、write()は動作が違うのかね?
-1が返る
当然write()でも全部書き込めるとは限りません。
指定サイズがかけなくても1byteでも書き込めた場合は-1にはならない
です。
結局、>>722-の流れで、653を笑えない奴等がいかに多いか分かったよ。
いつからこんなにレベルの低いスレに(w
>>716
できるなら、障害によるものか単にデータの送受信が無いだけなのか
で処理を分けたいのです。
かといってアプリケーションが周期的にデータを送信してみるというのも
ちょっと違う気がしています。

4096byte以上を書き込むと発生する気がします
>>736
select()で調べないのかい?

select()==-1 通信エラー
FD_ISSET(sd)==false 届いてない
FD_ISSET(sd)==true 届いてる
→recv() == -1 なにがしかのエラー
→recv() == 0 切断された
→recv() > 0 正常読みこみ
初心者が見るとわけが分からないだろうから書いておく。

>>723,>>727はアフォ
>>722は言いたいことが良く分からない。programmingに依ると言いたいのか?
>>731の二行目の文は曖昧。
>>731はどういう時に起きると言っているのか不明。それについて>>733は正しい。

ちなみに>>726のようなシステム仕様を勝手に想定するのも良くない。
もちろんマニュアルにそう書いてあれば良い。
>>737
相手のプロセスが異常終了した場合はTCPがFINを投げてくれるので
select()で判断できます。
ネットワークの障害でデータが送られてこないのか、クライアントが
ぼけっとしてるだけなのか分けて処理したいのです。
ネットワークの障害ならコネクションの切断とサーバのリソース開放に
もっていって、それ以外ならつなぎっぱなし。
それをアプリケーションが監視しないで済ませようと。
>>739
それはちょと無理じゃないか?
普通はタイムアウトで検出じゃない?
>>740
そのタイムアウトというのが問題でして、SO_KEEPALIVEオプションで設定
すると、2時間かかるのです。
この2時間を短くするのは可能なんですけど、システム全ソケットに影響が出て
しまうという。
で、これをソケット単位で設定するTCP_KEEPALIVEというオプションをサポート
している処理系を探しているのです。
>>740
すみません。
いってること勘違いしました。
アプリでタイマを持つのではなくTCPのレイヤでってことで。
http://developer.apple.com/ja/qa/nw/nw62.html
こういうやつ?(これは林檎さんだけど)
http://search.luky.org/linux-users.3/msg01165.html
このあたりのスレッドで役に立つのない?
>>743さん
そゆうのです。

>>744さん
役に立ちました。
なぜかlinuxは実装してないと思い込んでました。

取り敢えず良かったです。
Winsock(Windows)には実装されてないですねぇ。
>>746
winsockって使ったこと無いんですが、大きく違うものなのですか?
>>747
いや,基本的にBerkeleySocketそのまま。
だけどオプションとか関数とか色々削減されてる。
まあ普通(?)に使う分には大丈夫。

で,WSA*()っていうWindows独自の関数がたっぷり。
別にSO_KEEPALIVE使わなくてもselectでタイムアウト判定すればいいじゃん
>>640わかる人いる?
なんか最近公開されたAPIでできたようなできなかったような…記憶が微妙。
751名無しさん@接続しっぱなし:02/09/18 06:25
>>748
いや、SO_RCVTIMEOとかWinとSolarisくらいしかない(当時w)のもある。
2000+Winsock2だと、PC-UNIXよりも非同期等が豊富。

>>741は、KEEPALIVEってどういうものか分かってるのかなぁ?
>>749のやり方との違い…説明できるだろうか…

>>739
> ネットワークの障害でデータが送られてこないのか、クライアントが
> ぼけっとしてるだけなのか分けて処理したいのです。

超能力があるのなら、ネットワークもコンピュータもいらないじゃん。
752名無しさん@接続しっぱなし:02/09/18 07:01
>>750
そもそもAllocateAndGetTcpExTableFromStack自体がUndocumented APIでしょ。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iphlp/iphlp/ip_helper_start_page.asp
にも載ってないしねぇ。

2000のiphlpapi.dllに実装されるのを待つしかないのでは? (想像 ハート)
AllocateAndGetTcpTableFromStack→GetTcpTable
AllocateAndGetTcpExTableFromStack→GetExTcpTable
な感じになるかなぁ
>>751
>いや、SO_RCVTIMEOとかWinとSolarisくらいしかない(当時w)のもある。
>2000+Winsock2だと、PC-UNIXよりも非同期等が豊富。
あ,そうだったのか。知ったかぶりしてスマソ(恥
>>753
いや、95+Winsock1だと>>748のような感じだからいい(w
Winsockといってもピンキリな状況。

しかしより問題なのは、
同じ関数でもWinとWinsockの組合わせで振る舞いの仕様が違うこと!
互換ライブラリなし。アプリごと、マイミドルウェアごとに互換部実装!
version upごとに単調に機能が増えるだけならいいのだが…非連続性が…
755722:02/09/18 19:24
この話題は理解度を知るのに便利だね〜
「ソケットへのwriteは送信バッファへの書き込み」
ということに気づけばそんなに難しい話じゃないんだけども。

733の言うようにwriteの戻り値は書き込んだバイト数になります
これはファイルでも同じなんですがね・・・

ただし、Javaとかいうタワケた環境では取得不可能(1.4から可能らしい)
Javaでネットワークプログラミングを覚えました、なんてもう見てらんない。
>>752
けど、TcpViewや多くのFireWallSoftwareは実現してるから何か方法があるはず……
>>756
んじゃあ、Win2k持ってる奴は、GetProcAddress(LoadLibrary("iphlpapi.dll"),
"AllocateAndGetTcpExTableFromStack" )してみれ
長い名前だなぁ
>>755
>ただし、Javaとかいうタワケた環境では取得不可能(1.4から可能らしい)

単に取得不可能なんじゃなくて、全部書き込むか失敗するまで復帰しない。
普通はJavaの仕様の方が扱いやすいが、シビアな状況では困るかもね。
760デフォルトの名無しさん:02/09/19 11:32
> 1.4から可能らしい
NIO
http://java.sun.com/j2se/1.4/docs/guide/nio/index.html
* A multiplexed, non-blocking I/O facility for writing scalable servers ね。
http://jcp.org/jsr/detail/051.jsp に必要な理由は書いてある。

「シビアな状況」な人は、
http://www.cs.berkeley.edu/~mdw/proj/java-nbio/
http://www.cs.berkeley.edu/~mdw/proj/sandstorm/iocore-bench/
http://www.javaperformancetuning.com/tips/nio.shtml
辺りが面白い。底辺プログラマには今後一切関係ない話だけど。
>>757
Win2kのiphlpapi.dllがexportしてる関数くらい調べてから書いてるさ
Javaのタワケっぷりに笑った
センス悪すぎ
763デフォルトの名無しさん:02/09/19 23:27
あげあげ
>>751
>>741は、KEEPALIVEってどういうものか分かってるのかなぁ?
>>749のやり方との違い…説明できるだろうか…

わかっていないのは、あんたの方。要は、データのやり取りが非常にまれにしか
ない状況で、例えばケーブルが切れたことを即座に検出したいんだと思う。
>>749 の方法だと、例えば1日一回しかデータのやり取りがないと最悪丸一日
そう言う障害に気付かない。そう言うのが困るって言う状況もあるよ。

>>739
>> ネットワークの障害でデータが送られてこないのか、クライアントが
>> ぼけっとしてるだけなのか分けて処理したいのです。
>超能力があるのなら、ネットワークもコンピュータもいらないじゃん。
相手マシンでプロセスがバンバン動いている時なんかは、クライアントはあまり
動けないけど、TCP スタックは動けることが多い。(もちろん実装によるけどね。)
だから、超能力なんか使わなくても回線が切れているか、クライアントの応答が
ない事ぐらいはわかることが多い。
... ぐらいのことは、普通のサーバー管理者なら常識。サーバーの負荷が結構高く
ても、ping には応答すれば TCP層までははまず大丈夫と判断できる。
と、言うことでプログラムで、繋いでいる相手に ICMP Echo パケットでも投げる
のがいいかと...。
765not 751:02/09/20 00:09
>>764
は?
わかってないだろ。
そもそもKEEPALIVEはアプリケーションのTIMEOUT用に使うものではないし。
アプリケーションは好き勝手にポーリングシレ

ちなみに後半の管理者の常識とやら始めて知りました。
世の中便利になりましたね。(w
766751:02/09/20 01:36
都合良くトラブルの原因が分かる場合ばかり考えるのではなく、
何の音沙汰もなく何が何やら分からないって状況が起きる可能性が
ネットワークでは常にあり、それに対する対処方法(*1)が、
個別にやっていた「都合の良い場合」ほとんど全てを
同時に解決してしまうことに気づくことが、
ネットワークプログラマへの第一歩です。頭の転回が必要になります。

また*1)を行なわないのは、どんなに「特別な場合に」良い振る舞いであっても、
最悪の時が酷すぎるという意味で、『糞』ネットワークアプリケーションです。

局面ごとに適当なtimeoutを用意すること、socketのEOF, errorを見張ること、
application layer heartbeat packetを撃つこと、などなどが肝要で、
また基本中の基本です。
ICMP PacketはFirewallでdropされてしまいますた。
HTTPがコネクションレスなおかげか、そのへんのノウハウは失われつつあるなー
HTTPでもKEEPALIVEあるよ
あ、コネクションレスじゃなくてステートレスだった
ごめん
とりあえず後始末しときます。
SO_KEEPALIVEで全部が救えるわけではない。
ハーフオープンコネクションが残るのを避けることができるだけが
正解なので>>739の発言は間違い。
また、クライアントのポーリングをアプリでやるか、KEEPALIVEを
使うかは好みの問題とかそんなレベル。
>>739はTCPのコネクションの監視はTCPでやりたいだけ。

ただ、>>764
>そもそもKEEPALIVEはアプリケーションのTIMEOUT用に使うもの
>ではないし。
に関しては意味不明
> また、クライアントのポーリングをアプリでやるか、KEEPALIVEを
> 使うかは好みの問題とかそんなレベル。

うーむ、そうなんですか。時代は変わった…

> >そもそもKEEPALIVEはアプリケーションのTIMEOUT用に使うもの
> >ではないし。
> に関しては意味不明

意味不明も何もそのままの意味では。
keepalive がアプリケーションの timeout に使えるようになったのは
timeout 時間が変更可能、しかもコネクションごとに設定できるようになってからでそ。
773751:02/09/21 03:42
TCP Keep-Aliveだけじゃあ、peerのアプリケーションが、
socketを捕まえたままハングアップしているのを、検知できないです。
対応できる状況が「より包括的」で、健全な仕様を設計できるのは、
アプリケーション層でのタイムアウトやハートビートです。
実際シリアスなプロトコルは良くNULL requestを用います。(e.g. NFS等)

TCP Keep-Alive方式は、poorな分コーディングも楽ですが、(特に決め打ち時)
局面ごとに違う後始末が必要なアプリケーションで、
SIGPIPEのhandlerの設計が難しくなります。(マルチスレッドだと悲惨)
# Winsockでは、直後のsocket操作でWSAENETRESETが返ります。
# このインターフェースもよりpoorな分だけ、コーディングが楽ですね。

また、Keep-aliveはTCPに必須ではありませんし、有害という議論もあります。
(RFC 1122[HR RFC], RFC 1127)

最初からアプリケーション層でやれば、
socket FAQ, Stevens本、RFC 1122,1127のややこしい議論を読まずに済みます。
結局TCP Keep-Aliveは銀の弾じゃない、初級者にはそう見えるようですが。
リモートの様子は全然分からないけどタイムアウト起きちゃった、
この事態と考えを「完全に」受け入れましょう。それが近道です。
> 結局TCP Keep-Aliveは銀の弾じゃない

keepalive/timeoutに依存するコードは書かないなあ
OSによっては変更不可能だったりするし
775デフォルトの名無しさん:02/09/21 10:57
>>760
おれ、そろそろ「シビア」なことを理解しなきゃならんかも。
Publish/SubscribeなC/SをJavaで設計することになるかもしれない。

大規模になったときに発生しやすい障害とか、そういう勘所がぜんぜん予想できない。
Pub/Subの管理なりパケットの設計なんてのはいいとして、
例外のクラス構成や障害対策をどのように考えておけばよいかがサパーリ。

基本として最低限対応しておくべき事項って何だろう。
>>772
> keepalive がアプリケーションの timeout に使えるようになったのは
> timeout 時間が変更可能、しかもコネクションごとに設定できるようになって
> からでそ。

アフォですか ? 相手アプリケーションが無限ループなんかでハングアップしてて
も、Keepalive はタイムアウトしないことは知ってるのか ? そもそも、Keepalive
って誰が返すかも知らんのか ?
アプリケーションのタイムアウト監視と Keepalive じゃ目的が違うぞ。
>>775
http://www.shoeisha.com/book/Detail.asp?bid=9
はヘビーマルチスレッドなサーバを設計する前に必ず読んでおくべきだと思う。

使うフレームワーク選択の話はJavaスレの方がいいかも。
778775:02/09/21 15:20
>>777
『Javaマルチスレッドプログラミング』は既読なんですが、読めばまた発見ありそうですね。
もいちど読んでみます。
>>775
> Publish/SubscribeなC/SをJavaで設計することになるかもしれない。

冗談だろ?やめとけ
承知の上で、キープアライブ機能はTCPに属すると考えてる派なので
KEEPALIVEを使用します。
当然、アプリでも処理してます。
ご意見どうもでした。
たしかFreeBSDではKEEPALIVEの設定が無視されるよね
設定するとエラーが返ってくる?
>>781
あんた誰?
>>739(=736=715)じゃないよね?
>>781
指定に関わらず常にKeepAliveはONだよ
785デフォルトの名無しさん:02/09/22 22:51
>>784
本当? それ、RFC1122に違反してるね。
FreeBSD、インターネットに繋げないや…
結論:FreeBSDはゴミ
>>784
> 指定に関わらず常にKeepAliveはONだよ

情報ソースは ?
788デフォルトの名無しさん:02/09/23 00:49
Winsockの質問です。

Winsockを使って、インターネットからHTMLファイルをダウンロードするソフトを作っています。
全体的に実装の方法は分かりました。
で、実際、作って動かした所、自宅のネットからは動くようになりましたが、
会社のLANを伝って、インターネットに接続する場合は、最初の方でGetHostByNameで失敗します。
LAN内のサーバにあるページをダウンロードはできるのですが、どうしてもインターネットからは
できません。

おそらく、LAN内にあるProxyサーバが原因だと思いますが、Winsockを使う場合、どうしたらいいのでしょうか?
また、何が原因なのでしょうか?

(Wininetも使って実験してみた所、こちらの方では、LAN内でも動くことが分かりましたが、
後のことを考えて、どうしてもWinsockを使いたいのです。)





>>788
Proxy通すんだったら,
まず目的URIに接続するのではなく,Proxyに接続する。
で,Proxyに対して

GET 目的URI HTTP…

を送信する。のだ。
790788:02/09/23 01:55
>789
レス、ありがとうございます。

概要としては分かりましたが、実際の方法としては、?という感じです。

一応、流れとしては、今、

WSAStartUp()->Socket()->Connect()->Send()...
という感じなのですが、
Connect()の前に、Host名をIPアドレスに変換する必要があるわけですが、
その時に失敗するのです。
仰ることは、Host名→IPアドレスの時に、Host名にProxy名を入れればよいということ
なのでしょうか?
そして、Send()の時にGETすればいいということなのでしょうか?

参考となるページを教えてくだされば光栄なのですが。。。
>>790
>Host名にProxy名を入れればよいということ なのでしょうか?
そういうことです。
結局,目的地のことは何も知らなくていいです。
ProxyServerにさえ接続できればあとは丸投げです。

参考になるページは・・
http://www.google.co.jp
この辺で適当に・・(苦笑
792788:02/09/23 02:07
なるほど。
なんとなく、わかりました。

適当に探してみます。(ワラ

ありがとうございました。
793デフォルトの名無しさん:02/09/23 02:29
便乗で質問。
socketで多段串で送信したいんだけど、どうやるの?
ちょっと遅くなりましたが

ttp://x68000.startshop.co.jp/~68user/net/http-3.html
「Proxy に対応する」
ってのがあるんで,それを見ればなんとなく分かるかと思います。

ちなみにこのサイトはぼくがネットワークプログラミングを初めて触るときにお世話になりました。
>>793
多段プロキシに対応したプロキシサーバに向かって
それ用の記述でリクエストを送りつければいいのでは
delegateだったら
http://ほげほげ1/-_-http://ほげほげ2
かな。
予想1
次に「delegate以外のproxyでも通じるやり方ってある?」という質問が来る。
>>797
その質問が来たら

http://www.google.com

と答える。
しかし、delegateの連結キャラクタがウンザリしてる顔文字に見えるのは俺だけですか
>>799
おれもだ。

間にutuが入り込んでおる
資格板に以下の質問がありました。PGの方ならわかるかなと
思い質問します。これって可能でしょうか?

843 名前:名無し検定1級さん 投稿日:02/09/22 02:47
またこんなこと聞いたら絶対合格無理とか言われそうですが・・・
もし自分のIPを偽れるようなブラウザを自作してfusianasanで2chにアクセスすれば偽のIP表示できたりするんでしょうか?

847 名前:名無し検定1級さん 投稿日:02/09/22 10:46
>>845
いいえ、自分のPCから送信されるIPデータグラムの送信元IPアドレスを偽るようなソフトです。ついでに送信元MACアドレスも。
まだTCP/IP仕組みを完全に理解して無いので、そんな単純なことじゃないかもしれませんが。
TCPは双方向に通信しているので、IPアドレス自体を偽装すると応答パケットが届かなくなり、
その結果connectに失敗して書きこめません。
半年程前にはやったSYN-flood攻撃ツールは実際にこれを行っています。

で、fusianasanで表示されるのはIPアドレスではなくリモートホストなので、
DNSの逆引きに対して(サーバーを自分でたてて)リモホを騙れば出来ないこともないでしょうが、
簡単ではないし、マナー的にもやってはいけないことではないでしょうかね。
>>802
なるほどです。
素人考えですが、Connectだけ正常なIPアドレスで行って
書き込み時のみ偽装IPアドレスで行うなんてことは
できるのでしょうか?
>>802 (802かよ!)
しかも、IPアドレスは保存されてるでしょうから、
問題になった時に追跡できますね。
>>803
出来ないです。つーか勉強足りなさ過ぎ。10年早い。帰れ
>>805
私もできないと思っているのですが資格板にできるって人がいるので
詳しい人がいそうなのでここにきました。
ここの894とかの言ってることがわからないんです
http://school.2ch.net/test/read.cgi/lic/1030209098/

>>807
> ここの894とかの言ってることがわからないんです
> http://school.2ch.net/test/read.cgi/lic/1030209098/

> TCP/IPのオプションでIPアドレス偽って通信することはできるぞ。

まあ、できるといえばできる。つーか、IP アドレスなんてソフト的に割り当ててあるもんだから、いくらでも変えられる。更に言うと、複数の IP アドレスをひとつの NIC に割り振ることもできる。(WindowsNT系なら5個まで標準でサポートしている。)
MAC アドレスについてもドライバさえ (書け or Hack でき) ればいくらでも偽造は可能。技術的には、複数の MAC アドレスを割り振ることもできる。(ごく一部の NIC を除く。)

ただ上記の TCP/IP のオプションと言うのは意味不明。

また、同一ネットワーク内であれば上記のように偽って通信することはできるが、間にルーターが入っているとネットアドレスの所を変更してしまうとルーターが指定したところにパケットを送ってしまうので、通信はできない。
>>808
それはわかります。自分もクラスタ組んだマシンでIPアドレス書き換えた
通信したことありますから。
でも、今回のは2ちゃんに書き込む話なので間にルータが入るのは
当然といっても過言ではないわけで。
やっぱりできないって結論でよいですよね。
>>809
> やっぱりできないって結論でよいですよね。

そりゃ知らんよ。そいつが、2ch の鯖管かも知れんしね。

ただ、http://school.2ch.net/test/read.cgi/lic/1030209098/894 は...

> ここにいる香具師はFW立てないのか?
> そういう怪しいパケットをはじくのは基本だから2chもはじいてると思うが。

なんて言ってるぐらいだから、信用できるかどうかぐらいすぐわかると思うけど...。
>>810
>そりゃ知らんよ。そいつが、2ch の鯖管かも知れんしね。
むぅ。確かに。

>なんて言ってるぐらいだから、信用できるかどうかぐらいすぐわかると思うけど...。
まだネスペ取得できていない素人なので自信がないのです。
901 名前:894 投稿日:02/09/23 14:04
>>896 >>898 >>899 >>900
偽りたいIPアドレスをAとする
自分のIPアドレスをBとする
相手のIPアドレスをCとする

Bが「Aが送出したパケットをルータBを経由してCに届く」ように設定したパケットをCに送出。
CにとってはAからきたパケットだと認識し、「CからルータBを経由してAに届く」ようなパケットをA宛に出す。
が、実際はルータBを経由しているのでルータBに届く。

これでBがAを装うことができる。
ただし、この機能を使ったパケットは弾かれるのが常識。悪用したくても無理だと思われ。
813793:02/09/24 08:35
ありがとうございました。
調べたら-_-はdelegateというサーバでしか機能しない様でした。
>812
ttp://isweb16.infoseek.co.jp/diary/hedge/ipspoof.htm
のSource Routingの項目をみろ。

大抵ISPのルータでSource Routing付きIPは破棄される
ようになっていると思うので、事実上使えないわけだが。
ネットワーキングプログラム
ネットワーキングプログラミング
ネッティングワーキングプログラミング
818デフォルトの名無しさん:02/09/24 17:10
ネットワークゴキブリw
819デフォルトの名無しさん:02/09/24 17:16
やっぱりダメか・・
>>814
すごいっす。さんくす。資格板に張ってくるっす。
821デフォルトの名無しさん:02/09/26 10:41
FTP サーバにあるファイルの日付を秒単位で取得するにはどうすれば
いいんですか。

普通にコマンド打って取ってくるだけでは、分までしか出てこない。(たまに、時まで。リモート側のファイルの年が今年でなかった場合)
ンなもんサーバーの実装による
823名無しさん@接続しっぱなし:02/09/26 11:15
>>821
> 普通に

とは? modtime(protocol的にはMDTM)使ってるの?
ふと疑問に思ったんだが、処理速度より受信速度が上回ったとき、
溢れたデータってどうなるの?
C言語やJAVAだと、入出力系はライブラリがバッファを作るみたいだけど
バッファに入る程度ならいい感じに受信してくれるのでしょうか?
>>824
> ふと疑問に思ったんだが、処理速度より受信速度が上回ったとき、
> 溢れたデータってどうなるの?

捨てるしかない。普通は、そうならないように...

1. バッファリングする。
2. 処理速度を向上させる。
3. あふれそうになったら相手にちょっと待て、というような仕組み (プロトコル) をもつ。

のどれかで、対処する。もちろん、1. は、一時的な対処だから、全体的に「処理速度より受信速度が上回る」状況では、結局バッファーがオーバーフローてしまう。
> 溢れたデータってどうなるの?

TCPと仮定して:
送り側から見ると、送信キューが詰まる。
そのときselectはwritableを返さない。
あるいは非ブロックソケットならsendが0バイト送信しますたと返す。

だからあふれることはないよ。

Javaのjava.net.Socketは仕様がバグってるからうまく処理するのは
難しいかも。

825はアプリの作り方の話?
だったらそのとおりだあね
827825:02/09/28 13:08
>>826
> 825はアプリの作り方の話?
> だったらそのとおりだあね

はぁ ? TCP/IP は、>>825 の 3. で処理してますが...。俺には、>>826 の方がずっとアプリ寄りの話に見えるが...。(select/send なんて、もろソケットを仮定してるみたいだし..。)
825がアプリでのフロー制御の話に見えるか、
UDPでTCPのエミュレートとかいう痛い話に見えるか、
そこの違いか?
829824:02/09/28 13:37
ごめんね質問が曖昧で。
TCP/IPの話なんだけど、>>825>>826
とりあえずイメージが掴めました。さんくす
とにかく>>824に言えるのは、
・TCPの仕組みの勉強をしろ。
・IPネットワークの最大努力配送について勉強をしろ。
それがイヤなら、UDPを使ったプログラムを書かないと誓って
ただTCP&socketを信じろ。「いい感じ」にやってくれるから。

ただし古いWinsockでSO_RCVTIMEOを使う時はsocketを信じてはいけない。
831653:02/10/02 19:19
以前しつもんさせてもらった者です。

みなさんの指摘どおりつまずいてしまいまして;;;
恥じを承知で質問させていただきます。

クライアントからint型で2000送ろうとしたのですが、一回ではおくれないみたいで
1000ぐらいでとまってしまいます。
以前指摘してもらったことから、もう一度送ればいいとやってみたのですがうまくいかず、どうすればいいのか
困ってます。



send()やrecv()のリターンはどうなってんの?
-1の場合、errorはいくつになってんの?
>>831
意味不明。もう少し詳しく書かないと答えようが無い。
・・・多分こんなんでいいんだろうけど。

int sendall(int sock, void *buf, int len)
{
 int sent = 0;
 while (sent < len) {
  int cur = send(sock, (char *)buf + sent, len - sent, 0);
  if (cur <= 0) {
   return (sent > 0) ? sent : -1;
  }
  sent += cur;
 }
 return sent;
}
っと、それ以前の基本的な問題な気がしてきた。
もう一度送ればって、intのバッファを先頭から再送してたりしないよね?
ぐーるぐる。同じ話を何度も何度も。ぐーるぐる。
836653:02/10/02 23:12
>>832-834
詳しく書かなくて申し訳ないです;;
833さんのでずばり解決できそうです。recvでも同じようにすればいいんですよね?
一度やってみます。
それから返事遅くなってすいません;;
えーと、最近仕事で出た問題なんだけど、send()の直後にclose()すると、
送りきる前に電文が欠けたりするよ。
>>833で上手く逝かなかったらその辺も疑ってくだちぃ。
> えーと、最近仕事で出た問題なんだけど、send()の直後にclose()すると、
> 送りきる前に電文が欠けたりするよ。

Apacheは返事のsendの後、相手がcloseするまで30秒ぐらい放置してますね
ところで参考までにOSなんか教えてもらえるとうれしいッス
Linux。細かいビルドは忘れた。
相手のcloseをselectなりrecvなりで待つってのが正しいとは思います。
ただ、その仕事での問題として、ソケットライブラリでは、
そーゆーアプリケーション側の問題までは関知してなかったんで、
困ったなぁ、となりました。
ApacheがcloseしないのはHTTP/1.1 or HTTP/1.0+KeepAliveだからだと思うのだけど。

send直後にcloseすべきじゃないってのはそうだと思うけど、
そのためにshutdownがあるのでは。
shutdownしてもダメだったんだよねぇ、そのときは。
む、そうか、すまん。
というか、close時にflushしてくれないってのはやっぱおかしいな。
俺も「そういうこと(環境)もある」とだけは覚えておこう。
そういう環境があるから、Apacheはそれを考慮してるわけだ。
844デフォルトの名無しさん:02/10/03 04:24
>>843
お前さん、>>840の一行目読んでも意味分からないの?
>>842
> というか、close時にflushしてくれないってのはやっぱおかしいな。

そりゃおかしいよ。
SOCK_STREAMのセマンティクスを守るために、
TCP socketにはTIME_WAITって状態があるんだから。だから、

>>840
> send直後にcloseすべきじゃないってのはそうだと思うけど、

なんてことはない。引き続く送受がなければいきなりcloseしてよい。

> そのためにshutdownがあるのでは。

違う。> 「そのために」
Socket FAQを読むべし。いじょ
846デフォルトの名無しさん:02/10/05 03:01
今windowsでC言語でTCPプログラミングしています。

接続できたあと、スレッドをつくり、一つのソケットで送信、受信を同時にしても大丈夫なのでしょうか?
やっぱりまずいんでしょうか?
847デフォルトの名無しさん:02/10/05 03:05
まずい
>>846
ファイルハンドルやコンソール出力に同じことをしたらどうなるか
想像してみれ。
ファイルハンドルへの読み書きは問題ないだろ…
コンソール出力からの受信って何だろう…

>>846
とくに問題は無い。
が、ノンブロックモードにする必要があるから、
別のソケットにしたほうが楽だと思う。
あとサーバーから送信する先のポートの問題とかもあるかも。
>>844
>>840の一行目はウソ。
>>846
スレッド1が受信専用でスレッド2が送信専用ならおそらく問題ない
852デフォルトの名無しさん:02/10/05 10:52
ちょっと聞きたいことがあるのですが、
winMXってP2Pですよね。でも最初検索するときの、
「誰がどのファイル持ってる」という情報だけは、一箇所に集めてて、
最初にそこを参照して、持ってる人見つけて、あとはP2Pでやる、
って感じでいいですか?
なんかP2Pで通信する仕組みを考える時って、それが一番問題な気がします
名簿なし、手探りで不特定多数の相手を見つける、って無理な気が
>>852
新手のWinMXを作るんですか?
854デフォルトの名無しさん:02/10/05 11:49
>>853
いやオンラインゲームに使えないかなと思って。
自分にはサーバ立てるのは負担なので、P2Pだけでネットワーク対戦
できたらいいなと。
LAN環境とかでやるなら、ブロードキャストで
全部当たればいいと思うんだけど、
大規模、不特定多数になるとそれだと無理じゃないかと思ったので
winmxっつーかOpenNapプロトコルはそんな感じだが。
winmxのWPNとかはそういう仕組みじゃないぞ。
856デフォルトの名無しさん:02/10/05 13:18
>>848>>849>>851
レスありがとうございます。
送信と受信をまったく同時にしたらソケットの中で衝突がおきるのかなー?と初心者ながら思ってました。

ソケット2つ作ってそれを同じ相手につなげて送信と受信分けたほうがいいのかなー?
857デフォルトの名無しさん:02/10/05 13:37
recv関数って、相手がsendするまでずっとまってるんでしょうか?
>>857
うん。
ノンブロッキングにしたらすぐ返ってくるけど。
859857:02/10/05 14:26
>>858
ありがとう!感謝感謝です
860デフォルトの名無しさん:02/10/05 14:45
>>856
つーか、君勉強足りなすぎ。ちゃんと本読みなさい。

SOCK_STREAMは双方向全二重の信頼性のある通信を提供します。
同じ方向に利用するスレッド間の同期/排他は忘れないでください。

以上の言葉の意味が分かるまでは勉強しないと先でつまずきます。
>>850
じゃあ、>>843のコードがどこか示してくれや。
どんな時にそうなっているんだ? その状況は>>843の主張と整合するか?
>>847-848

お前等、まともなネットワークプログラミングなんかしたことないだろ ?

> ノンブロックモードにする必要があるから

馬鹿、そんなことしたくないから「マルチスレッド」にするんだよ。

> あとサーバーから送信する先のポートの問題とかもあるかも。

意味不明だ。具体的に書いてみれ。
ゲーム製作技術板の「ネットゲー作る技術持ってるやついる?」スレ
で暴れてたアフォか?

> 馬鹿、そんなことしたくないから「マルチスレッド」にするんだよ。

馬鹿、そんな理由でマルチスレッドなんか使わないんだよ。
素人ほどスレッドを使いたがるのはホントだな。

まさか java.net.Socket とかいう欠陥クラス使ってないだろうな。
864856:02/10/05 15:06
>>SOCK_STREAMは双方向全二重の信頼性のある通信を提供します。
回線は全二重というのはわかるのですが、送信や受信するときいったんソケットにためてるのかなー?とおもっていまして、
それだと送信パケットと受信パケットが混ざるとだめかなー?と思ってました。
もし一つのソケットでできる場合2つのソケットで送信と受信をする場合と比べてスピードは遅くなるのでしょうか?

>>同じ方向に利用するスレッド間の同期/排他は忘れないでください。
これはクリティカルセクションとか、親スレッドが終了するまで子スレッドは終了させないようにするとかということでしょうか?

質問ばかりですいません

>>863
> 馬鹿、そんな理由でマルチスレッドなんか使わないんだよ。

送受信がほとんど絡まないような場合だと、スレッドの方が全然楽。
ノンブロックでポーリングしまくる方がよほど素人だよ。

スレッドもまともに使えねー奴と言うオチか ?
>>864
> もし一つのソケットでできる場合2つのソケットで送信と受信をする場合と比べてスピードは遅くなるのでしょうか?

もちろん状況によるが、普通は物理層がネックになるだろうからあまり変わらないと思う。(Gbit ぐらいになるとよくわからんけどね。)

>>同じ方向に利用するスレッド間の同期/排他は忘れないでください。
> これはクリティカルセクションとか、親スレッドが終了するまで子スレッドは終了させないようにするとかということでしょうか?

クリティカルセクションと言う言葉は関連するけど、「親スレッドが終了するまで子スレッドは終了させないようにする」とか言うのは、全然関係ない。

要は、2つのスレッドが同時に両方とも書き込んだりしないようにしないとダメってこと。これは、別にソケットだからと言うわけじゃなくてファイルだろうがプリンタだろうが同じ。
ああ、やっぱりあっちで暴れてたアフォだったのか。
お願いだから素人はスレッドなんか使うのやめてくれ。
ややこしくなるから。
>>867
> ややこしくなるから。

心配するな、ややこしいと思ってるのはお前だけだから。

ぐちゃぐちゃ書くなら、「何がおかしい」かぐらい書いたらどう ? (まあ、書・け・た・ら の話だけどね)
869856:02/10/05 16:54
>>866
>>要は、2つのスレッドが同時に両方とも書き込んだりしないようにしないとダメってこと。これは、別にソケットだからと言うわけじゃなくて・・・

え?これは別々のスレッドで同じメモリへ同時に書き込みはだめってことですよね?それさえ気をつければソケットにはまったく同時に送信、受信できるんですよね?
>>869
> え?これは別々のスレッドで同じメモリへ同時に書き込みはだめってことですよね?それさえ気をつければソケットにはまったく同時に送信、受信できるんですよね?

う〜〜〜ん、なんか微妙に違ってる気がするなぁ。
複数スレッドが同じメモリーを同時に読み出すのは OK だけど、だからと言ってソケットから同時に受信できるわけじゃない。
例えば、2つのスレッドが同時にソケットから読み出す時に、ネットワークら "ABCD" と来たら、
"A", "BCD" とスレッドに渡るかもしれないし、"AC", "BD" と渡るかもしれない。
と言うような話だよ。

送信と受信を同時に行うのは特に問題はない。(ヴァカな、>>867 には、ややこしいらしいから勧めないけどね。)
>>869
ソケットの送信と受信は別々のものと考えて差し支えないよ。
たいがいのTCPスタックの実装は内部できちんと排他処理してくれてる。
とはいえ実装依存だから、ドキュメントで確認したほうがいい。

あるスレッドが受信待ちしてるときに、
別のスレッドがそのソケットの受信関連のフラグを操作したときの動作は
未定義かもしれない。

普通そんなことしないけど、素人はやりかねないね。
小さい犬ほど良く吠える
>>864
> 送信や受信するときいったんソケットにためてるのかなー?とおもっていまして、
> それだと送信パケットと受信パケットが混ざるとだめかなー?と思ってました。

そんな、わけのわからんことには、なりません。送信バッファと受信バッファは別になってるんで、1つのソケットでちゃんと送信も受信も出来ます。

ただ、ブロッキングモードだと、受信するとき相手から何か送られて来るまで recv で止まってしまうから、止まってしまってたら送信出来ないだろ? だからノンブロッキングモードにするか、送信用のスレッドと受信用のスレッドを分けるか。

って話なんだと思うけど。・・・なんで2つのスレッドが同時に書き込む話になってるので?
874856:02/10/05 17:29
>>870>>871>>873
レスありがとうございます。ソケット内部で送信バッファと受信バッファが別になっているとは勉強になりました。

今回あるスレッドで送信、あるスレッドで受信というようにしようと思ってました。一つのソケットでいけそうだということがわかりました。

あと、ソケットが一つでする送信、受信場合と2つで別々に送信受信する場合スピードはかわらないのでしょうか?変わっても気にしなくていい程度なのでしょうか?
ソケット内部での送信バッファと受信バッファが可変の場合変わるかなーと・・・かなり想像でしゃべってもうしわけないです。

あとsendで送るとき一定以上の量になると何回かに分けて送らなければいけないと思うのですが、この一回の容量というのはパケットのサイズなのでしょうか?
それともソケットのバッファがいっぱいになったからなのでしょうか?


>>873
> ただ、ブロッキングモードだと、受信するとき相手から何か送られて来るまで recv で止まってしまうから、止まってしまってたら送信出来ないだろ?

こんな知識で、「素人ほどスレッドを使いたがるのはホントだな。」とか言ってたのか、あきれて物も言えんわ。
> 素人ほどスレッドを使いたがるのはホントだな

ソケットに限らずこれはあってる。

ソケット方面で言うと、ノンブロッキングモードを知らない奴(Java厨)とか
select/pollを使ったイベントドリブンなプログラミングに慣れてない奴とかが
こぞって使いたがるんだよね。
Javaのrecvとかって、ノンブロッキングモードないの? ホント?
>>877
ない。マルチスレッドマンセーなので不要、という思想だそうだ。
さすがにその愚かさに気づいたのか、JDK1.4からはnioというのが付いてる。
頭悪いよね。
頭悪いっつーか、正直信じられん。騙そうとしてたりする?
880873:02/10/05 18:24
>>875
>こんな知識で、「素人ほどスレッドを使いたがるのはホントだな。」とか言ってたのか、あきれて物も言えんわ。

いや・・・私はそんなこと言ってませんけど。勝手に結びつけないで頂戴って言っても無駄かな。
とりあえずこんな知識で発言してごめんよ。
でも間違ってたら指摘してくれると勉強になって有り難い。

>>877

なかった気がする。でも調べ足りないだけかもしんない。nioは見てないし。

>>874

> あとsendで送るとき一定以上の量になると何回かに分けて送らなければいけないと思うのですが、この一回の容量というのはパケットのサイズなのでしょうか?
> それともソケットのバッファがいっぱいになったからなのでしょうか?

バッファ。
でもブロッキングモードだったら、指定したバイト数を全部バッファに入れるまでブロッキングするから大丈夫。
いや、ブロッキングされるとマズイ場合も多々あるけど。そゆときはノンブロッキングにするかスレッド分ける。
>>874
> あと、ソケットが一つでする送信、受信場合と
> 2つで別々に送信受信する場合スピードはかわらないのでしょうか?
> 変わっても気にしなくていい程度なのでしょうか?

送受信のバッファはそれぞれ別個のものとして扱われるから、
速度の差はないんじゃないかなあ。
最終的にはTCPスタックの実装で決まることだけど、
送受信のバッファの扱いはOSごとに激しく異なってたきがする。

ところで素人素人連呼してるヴァカが一匹居るけど、
いろいろ試すことに価値はあると思うから気にしないでね。
>>879
当然だがselectもpollもないぞ。理由は878と同じらしい。
すべてはnio様の登場でチャラになったことになってる。
>>876
> > 素人ほどスレッドを使いたがるのはホントだな
> ソケットに限らずこれはあってる。

スレッドが適しているところにはスレッド使えばいいし、そうでないところには select とかでいいと思うよ。

もしかして、スレッド使えない方ですか ?
>>883
「使いたがる」と「適材適所」は激しく異なると思われ
>>879
いちおう、ブロックせずに読めるバイト数を返す available() ってのがあるから、(試したことないけど)入力に関してはノンブロッキングもどきが出来るのかもしんない。
>>883
真性アフォ発見!
887デフォルトの名無しさん:02/10/05 19:36
>>864
> >>SOCK_STREAMは双方向全二重の信頼性のある通信を提供します。
>
> 回線は全二重というのはわかるのですが、
> 送信や受信するときいったんソケットにためてるのかなー?とおもっていまして、

socketと標準入出力ライブラリのハンドルは別です。
前者は全二重だけど、後者は仕様上半二重で構わないです。

そこのところを気をつけてください。(fdopenなどする場合)
888デフォルトの名無しさん:02/10/05 19:44
>>863
> 素人ほどスレッドを使いたがるのはホントだな。

ちょっと分かってきた時に、無駄にpollingや非同期使いたがる奴もいるね。
どれを使うかはバランス感覚の問題だから、人に教えるのは難しいね。

しかし、一昔前に比べると、systemが成熟してきたので、
multi threadによる解決が自然な場合が多い。
初めからthreadの増大が問題になる事が分かっている場合以外は、
multi threadから始めるという方針も悪くないと思う。
> ちょっと分かってきた時に、無駄にpollingや非同期使いたがる奴もいるね。

うんうん、スレッドは本質的には非同期処理だからねえ。無駄だよねえ。
非同期ソケットとノンブロックソケットはまったく別物だから注意しようね。

> 初めからthreadの増大が問題になる事が分かっている場合以外は、
> multi threadから始めるという方針も悪くないと思う。

少なくとも、IOのためだけにthreadを使うのは間違ってるね。
Javaしか知らない困った人は解らないかもしれないが・・・
>>884
>「使いたがる」と「適材適所」は激しく異なると思われ

この発言はあってるけど、それがどうかしましたか ?
俺は、>>876 がやけにマルチスレッドを気にしてるみたいだから、マルチスレッドの方が書きやすいこともあるよって言ってるだけだよ。

>>886
どこが「アフォ」か書いてみな。あんた見てると、>>872 が正しいこと言ってるのがよくわかるよ。

>>887
> socketと標準入出力ライブラリのハンドルは別です。
> 前者は全二重だけど、後者は仕様上半二重で構わないです。

正確には、ファイル入出力は半二重 (ファイルポインタは1個しかないからね) だけど、COM ポートなんかだと全二重のシステムもあるよ。

>>888
ほぼ同意。

>>889
意味不明。
>>880
> いや・・・私はそんなこと言ってませんけど。勝手に結びつけないで頂戴って言っても無駄かな。

人違いか ? なら、ごめんよ。ただ、

> ブロッキングモードだと、受信するとき相手から何か送られて来るまで recv で止まってしまうから、止まってしまってたら送信出来ないだろ? だからノンブロッキングモードにするか、送信用のスレッドと受信用のスレッドを分けるか。

の文章は完全に誤解してると思うから、もう少し勉強してね。
必死な奴だなあ
Win2k VC6.0で、
CSocketクラスを使用してサーバアプリを作成しています。

accept後に一定時間通信がない場合、そのSocketをcloseしたいのですが
どのようにtimeout等を考えればよいのでしょうか?
スレッドを使いなさい
そうすれば救われます
>>892
> 必死な奴だなあ

それしか書けないなら、書かない方がいいよ。アフォみたいだからね。

>>893
> accept後に一定時間通信がない場合

クライアント/サーバー間のプロトコルがわからない (TCP/IP とか言うなよ、そうじゃなくてアプリケーションレイヤーの話だからね) のでなんとも言え。
まあ、普通のクライアントのコマンドに対してサーバーから応答を返すような場合だったら、サーバーが Receive() で待ってる時にタイマー掛けといてタイムアウトしたら切断しちゃえばいいんじゃないの ?
>>895
>まあ、普通のクライアントのコマンドに対してサーバーから応答を返すような
>場合だったら、サーバーが Receive() で待ってる時にタイマー掛けといて
>タイムアウトしたら切断しちゃえばいいんじゃないの ?
レスありがとうございます。
まさにそのとおりです。
accept→Recieve→Sendといくのですが、
acceptしたあとどうタイマーをかけていいのかわからなかったもので。
やっぱりCSocketよりWinSock直でやったほうがいいんですかね
>>896
> accept→Recieve→Sendといくのですが、
> acceptしたあとどうタイマーをかけていいのかわからなかったもので。

もっとちゃんと状態遷移を理解してないとダメだよ。

1. Listen
2.     ← Connect
3. Accept
4. Receive
5.     ← Send
6.       Receive
7. Send  →
8. 4. へ戻る...

クライアントのから待ちになるのは、4〜5 だから 4 (=Receive 開始時) にタイマー掛けて、5. (=クライアントからのデータ到着) がタイムアウトしないかみるだけだよ。

> やっぱりCSocketよりWinSock直でやったほうがいいんですかね

ここら辺の話は、CSocket とか WinSock に依存した話じゃないよ。
普通にselectなりpollなりで待てばいいと思うのだが。
>>897
状態繊維まで書いていただいてすいません…。
たしかにそのとおりだとは思います。

CSocketではacceptしたあと、受信可能状態になればOnRecieve()がよばれると思っています。

ですので、OnRecieve()がよばれるまえ(acceptした直後)にタイマーかけておいて
OnReceive()/OnSend()が呼ばれたらそれぞれ処理してタイマーかけなおし
すればよいのでしょうか?
>>899
> CSocketではacceptしたあと、受信可能状態になればOnRecieve()がよばれると思っています。
> ですので、OnRecieve()がよばれるまえ(acceptした直後)にタイマーかけておいて
> OnReceive()/OnSend()が呼ばれたらそれぞれ処理してタイマーかけなおし
> すればよいのでしょうか?

そう言う意味では、MFC 固有だな。スマソ。
とりあえず、接続されたら OnAccept() が呼ばれるから、タイマー掛けて、OnReceive() 毎に再設定でいいと思うよ。
>>900
>そう言う意味では、MFC 固有だな。スマソ。
やっぱそうなんですね。
>接続されたら OnAccept() が呼ばれるから、タイマー掛けて、OnReceive() 毎に再設定
本当にいろいろとありがとうございます。
とりあえずこれでやってみます。

>>895
自分のことだって分かってるんですね(プ
903デフォルトの名無しさん:02/10/06 02:28
>>901
正直、>>898のやり方の方が、
非同期イベント処理の健全性を考えないで済むから楽。

非同期型のプログラムを書くには根本的な頭の切り替えが必要。
特に例外処理や後始末やハンドラの登録/抹消において。
最悪なのは手なりの同期/非同期混合型プログラム。地獄を見ることになる。

これはMFCのCSocket or CAsyncSocketとは直接関係ない話な。
904903:02/10/06 02:31
>>903
あ、イベント駆動型プログラム、って書いた方が良かったかな。
Windowsに毒されてる痛いヤシがいるようだが、WindwosCE2.12ではマルチスレッドで
書くしかないわな。(もちろんVC++でだけど)
>>905
わけわからん
907903:02/10/06 03:26
>>906
語りたい年頃なんでしょう
>>902
> 自分のことだって分かってるんですね(プ

やっぱりこの程度のことしか書けないのね。まあ、2ch だからいいけどさ。

マ板に逝けば、仲間がイパーイいるよ。ププッ。

>>903
お説ごもっともだけど、全然有用な情報がないよ。
知識もってるってひけらかしたいだけ ?

こんなことしてはまったとか、具体的に書いてもらえればいいけどさ。
909 ◆4I/Yf.lDws :02/10/06 22:28
Winsockを使用して、sendで、次のような送信を試みたのですが、少しおかしくなってしまいます。
for(i=0; i<100; i++) {
sprintf(toSendText,"%d",i);
send(dstSocket, toSendText, strlen(toSendText)+1, 0);
Sleep(100);
}
それぞれのパケットに1組の数字(文字列)のみを入れて送信したいのですが、
受信したものは、「1\02\03\04\0」というように何個かがくっついてしまったのです。
どうすれば、1パケットに1つの数字を送信できるのでしょうか。
どなたか教えてください。
新キャラ登場だね。コテハンにすればいいのに。
何か一人で熱くなってる痛い奴がいるな。
煽りはほっとけよ。

>>909
普通にやるとくっついたり分断されたりします。
for(i=0; i<100; i++) {
  sprintf(toSendText,"%d",i);
  len = strlen(toSendText);
  send(dstSocket, &len, sizeof(len), 0);
  send(dstSocket, toSendText, len, 0);
  Sleep(100);
}
でどうよ?
そもそも i を文字列に変換する意味はあるのか?特にないのなら

  send(dstSocket, i, sizeof(i), 0);
でどうよ?
>>909
> どうすれば、1パケットに1つの数字を送信できるのでしょうか。

無理。自分で、'\0' 見つけて分解するしかない。
逆に、1 と '\0' が2回に分けて送られることもありうるので注意すること。

あと、
> 受信したものは、「1\02\03\04\0」というように
と書くな、0x31, 0x02, 0x03, 0x04, 0x00 と誤解されるぞ。(と言うか、コンパイラはそう言う風に解釈する。)
ちゃんと、1 \0 2 \0 3 \0 4 \0 のように書け。
913デフォルトの名無しさん:02/10/06 22:59
>>909
TCPなんですよね?
if (TCPです) {
 出来ません。
 TCPはバイトストリームです。
 だからパケットを扱えません。// TCPではセグメントと呼びます。
}
それから、sendの返り値をちゃんと見なさいな。
>>911
最後のは
  send(dstSocket, &i, sizeof(i), 0);
でつ…。
>>914
「バイトオーダに注意(MSB or LSB)」は追加しないでいいの?
>>909はカナーリ初心者プログラマだぞ。
>>915
俺もカナーリ初心者プログラマなのですが…。
バイトオーダーは送信元と受信元が同じエンディアンなら
気にしなくてもいいというのは誤った認識でしょうか?
#初心者なら送信元と受信元は同じ環境だと思ったので…。

バイトオーダーを考慮するなら
long hoge = htonl((long)i);
send(dstSocket, &hoge, sizeof(hoge), 0);
ですかね。
バイトオーダーの遥か以前の段階だし、いいんでねぇの?

【方法1】
電文サイズと電文の実体を送信し、受信側でサイズ分受信する
【方法2】
受信側で\0をデリミタとする

以外に方法ってあるかな? つなげなおすとかでなくて。
918909 ◆4I/Yf.lDws :02/10/06 23:54
やはり無理ですか。
やろうとしているモノは、送信側ソフトのスクロールバーを動かすと、
受信側ソフトのスクロールバーがそれにつられて動くという実験をやろうとしていたのです。
実際に動かしてみると、カクカクするので、909で書いたものを実行してみたところ、
値がくっついてしまっていることが分かったのです。

送られてきたモノを分解したら一応はできるのですが、カクカクするんです。
ちなみに、ローカルエリア内です。

VNCという遠隔操作ソフトをご存知でしょうか?
あのソフトもTCPを使用しているようなのですが、
上と同じ環境でマウスは非常に滑らかに動きます。
なにか違うのでしょうか。
勘違いなどしているかもしれませんが、教えていただけないでしょうか。
>>917
\0をデリミタにすると,数値そのまま送った時はまずいよね?
0の時デリミタになっちゃう。
>>911のようにテキストに変換するならいいけど。
分解しないでも分解してもカクカクするなら、別の原因じゃねぇの?
まぁ、前者は明らかにマズイんだが。
>>918
明示的にフラッシュすればいいんでないの?
>>919
そらもちろんテキストが前提です。
バイナリ可変長ならサイズ指定が必須でしょう。
>>922
すいません。あなたを侮ってました。
すんません。すんません。(ぺこぺこ
いやそんなあやまられても困るんでばっくれて下さい
アレでないの。
TCP_NODELAY
TCP_NODELAYとrecvでまとめて受信するのはあまり関係ないと思うけど。
DELAYしようがしまいが、受信ソケットには電文は溜まっていく。

>送られてきたモノを分解したら一応はできるのですが、カクカクするんです。
>ちなみに、ローカルエリア内です。
これの話だけど。
>>916
> #初心者なら送信元と受信元は同じ環境だと思ったので…。

ビクーリな推測に基づく仮定だな。
君の書くプログラムは大丈夫なのか?
っていうかバイトオーダはなるべくネットワークバイトオーダにするのが
理想なんじゃないかな。
>>929
NDRやCDRみたいなのもあるから、それが理想とは限らんだろ。
>>928
なんでやねん。x86Windoesで送信したら受信する方はx86Windowsやないか。
>>930
何それ?
933909 ◆4I/Yf.lDws :02/10/07 20:22
>>925
そうです!
TCP_NODELAYがミソでした!
無事解決しました。
皆さんどうもありがとうございます。
>>931
eで送信して、wで受信するんですね。
936デフォルトの名無しさん:02/10/08 04:21
シリアル通信用の
便利なライブラリご存じないでしょうか?
>>933
ミソじゃねえよ。偶然くっつかなくなっただけだ。
少しは過去ログ見ろぼけ。
もう◆4I/Yf.lDwsが来てもレスする気がなくなった
939◇4I/Yf.lDws:02/10/08 17:43
>>937
コンピュータの世界に偶然なんてあるのかい?

そもそも、スクロールを実現すんなら、全データの信頼性よりもパフォーマンスが上がればいいんだろ
NODELAYつかって、パフォーマンスが上がったって事は、成功といってイイんじゃない?
ネトゲでデータの信頼性よりもパフォーマンスを重視するのと同じだよ

それにこの場合は送信元も受信元も同じって決まってるんだしさ
>>939
UDPのがいいんじゃない?
>>939
「パフォーマンス」???
>>940-941
もうほっといたら ? 本人満足してんだしさ。
そのうち痛い目見りゃわかるだろ。
なんか、このスレ、あほうが2人でとんちんかんなこと言ってる感じだな。
944デフォルトの名無しさん:02/10/08 21:46
なぜ本人だと?
>>939はトリップじゃないから、たぶん第三者の煽りだよね。
この文章に騙される人は、健全性と完全性の区別が出来ない人だね。

>>943
とりあえず、しばらく放置じゃないかな?
947デフォルトの名無しさん:02/10/09 03:08
UNIX板のapacheスレで質問したらこっちの方が良いんじゃないのって言われたのでここで質問します。

SSLの通信をProxyに通す場合の手順がいまいち分かりません。
現在以下までは分かっています。

1.クライアントが、プロクシーサーバにCONNECTメソッドでリクエスト
2.プロクシーサーバは、200をクライアントに返す
3.プロクシーサーバは、1.で送られてきたリモートサーバにコネクションを張る

この後が分かりません・・・。
クライアントが何か出力しているのは分かるのですが、
それが合計何バイト出力してるのかが分からず、どこの時点でリモートサーバにデータを
送ればいいのかが分からないとか、そういうところで困ってます。

何か分かる方がいましたらひとつ願います。

RFC2616読んだのですが、これに関してあまり書いてなかった・・・。
HTTPプロクシーのRFCは2616じゃないのでしょうか。
proxyを作ってるのか?
クライアント作ってるのか>>948なのかワカラン。
950947:02/10/09 15:02
情報不足ですんません。
Proxyつくってます。
select等で、ClientからとServerからの書き込みをまって、
書き込みがきたら、その分だけ転送すればいいんでわ?
じゃあ。
SSLで送信されてるなら、それを受信して解析しないと。
それに、その後再びエンコードしてHTTPサーバにリクエスト。
SSL crypto HTTPあたりでググってみれ。
>>947
CONNECTでコネクションが確立したら、あとは
クライアントが送信してきた内容をそのままサーバに垂れ流す。
サーバが送ってきた内容も同様にそのままクライアントに転送。
どっちがいつ送ってくるかは分からないからいつ送ってきても
いいように待つ。
ようするにsocksと同じで汎用のポートフォワーディングの
手段として使えるからちゃんとアクセス制限しないと
セキュリティホールになる。

>>952
SSL Proxyは通信内容に一切関知しない。
Proxyが暗号化を解除できたらSSLの意味がないだろ。
954947:02/10/09 15:26
>>951

すんません。
もう少し詳しくと言うかなんか参考文献あったら教えてください。
955947:02/10/09 15:28
>>953

あぁ、やっぱいつ送ってきても良いように待つのですか。
一般的なやり方ってどんなのがあるんでしょうか?
スレッドを使うとか?
956デフォルトの名無しさん:02/10/09 16:30
だからー >>951 が言ってるとおりselect等で待つ。
ソケットの使い方はUNIXネットワークプログラミングVol.1でも読めや。
>>926 TCP_NODELAY を使いつつ、send() 側も recv() 側も、バッファ(第 3 引数)を 1 byte にすりゃいいだろ。 いまさらだけど。
>>926
TCP_NODELAY を使いつつ、send() 側も recv() 側も、バッファ(第 3 引数)を
1 byte にすりゃいいだろ。

いまさらだけど。
959デフォルトの名無しさん:02/10/09 17:29
>>956

Javaで、selectするにはどうすれば良いんでしょうか。

スレッドとTCPのソケット通信について…

TCP/IPがマルチスレッドで動いてくれるとでも思っているヤツはバカ!
>>960 OS によっては、ちゃんとカーネル内でパラレルに動作するようになってます けど、バカですか?
947はJavaで作ってるの?
963デフォルトの名無しさん:02/10/10 02:11
>>947にはJavaなんて一言も書いてなかったな。
まあそれはともかくJavaのJDK 1.3まではスレッド使うしかない。
JDK 1.4ならnio使え。
964デフォルトの名無しさん:02/10/10 06:04
SSL Proxyを通してアクセス制限を回避して任意のホストに
接続できるという話
http://www.kb.cert.org/vuls/id/150227
SSL Proxyを作る人は同じ轍を踏まないように。
おい >>960>>961 に応えろよ。 カーネルのソースも読めねー厨房。
WindowsのTCP/IPドライバのソースを
屏風から追い出してくれたら答えます
そういえば、winsock って、WSAAsyncSelect()を使うと、勝手にスレッドを作るね。
タスクマネージャで確認した程度だから、間違ってるかもしれないけれど。
968デフォルトの名無しさん:02/10/10 15:52
>>963

いや、Javaではないんですが、selectが無い場合はどうやるのかと思って質問しました。

実際は、C#でやっています。
C#では、Selectというメソッドはあるのですが、いまいち使い方が分かりません。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemnetsocketssocketclassselecttopic.asp

要は、ポートフォワーディングをすれば良いんだとは思いますが
どうやって実装すればいいのかに悩んでいたり。
>>968

> ポートフォワーディングすれば

間違えた。

> ポートフォワーディングみたいなこと

に訂正。
ポートフォワーディングって言うよりはトンネリングって言う方が正しいのかな。
そろそろ新スレ建てようかと思うけど、こんな感じでいい?

主にソケットに関しての質疑応答スレです。

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

Winsock Programmer's FAQ
http://tangentsoft.net/wskfaq/

過去スレ:
ネットワークプログラミング相談室
  http://pc.2ch.net/tech/kako/970/970344582.html
ネットワークプログラミング相談室 Port2
  http://pc.2ch.net/tech/kako/1006/10062/1006258198.html
ネットワークプログラミング相談室 Port3
  http://pc3.2ch.net/test/read.cgi/tech/1023359282/
OK。Go!
>>968
使い方が分からんってそのまんまじゃん。
もしかしてCのselectの使い方も分からない?
だったらFAQでも読め。URLはちょうどテンプレが
貼られてる。
建てますた。

ネットワークプログラミング相談室 Port4
http://pc3.2ch.net/test/read.cgi/tech/1034236536/
>>961
へぇプロトコルがマルチスレッドに対応しているのか…どこの世界の話かよかったら聞かせろ。

おまえは、複数の人間がしゃべっているのを同時に聞ける天才か?
>>961,960,974
プロトコルとOS話が…は別だわな…
>>974
実装の話だよ。>>960 も「動く」って書いてる。
>>974

961はOS の TCP/IPプロトコルスタック部分が並列動作するってことを
簡略な表現で言っただけでしょ。

その程度の省略が自動補完できない時点で、知識レベルが論外って気がするが...
並列動作する実装もありうると想像はできるけど、
実際のとこどうなんだろ。

linuxとか*BSDとかの実装を見た人います?
>>978
IP→TCPのDeMultiplexingを担っているところが、
TCPプロトコルスタック部分の(接続単位から見た)並列動作を実現しているところ。

と言われただけで、かなり具体的なイメージが湧かないと、
ソースの場所示されても分からないと思う。イベント駆動型だし。

ちなみに接続単位から見た並列動作が実現できてないのが、
一昔前のいわゆるパソコン通信です。(接続の多重化が行なわれてない)
いや、実際に複数のコンテキストが"同時に"TCP/IPスタックをまわせる
ようになってるのかなあ、と。
実際は排他制御されてたりしない?
>>980
君が書いたら、大域変数バリバリでそうなるのかもしれないけど、
tcp_input.c(の関数群)は、「接続単位」に対してパラメタライズされてます。

> 実際は排他制御されてたりしない?
tcp_input.cの#ifdef CONFIG_SMP調べればすぐ分かるでしょ?
ジャイアントロックないでしょ?

そもそも多重化って意味分かりますか?
全然意味分からないならport 4の図書コーナーにGO!
>>981
どこの実装?CONFIG_SMPってことはlinuxかな。
何にせよ読んでる人がいることに驚いた...

接続単位ってことですが、送受信は分かれますか?
もし分かれるなら、
TCPの送受信で共有しているパラメータ(ブロッキングモードなど)
へのアクセスは正しく排他されますか?
>>982
> 接続単位ってことですが、送受信は分かれますか?

送受がパラに動くようコンテキストが分かれてる、って意味?
TCPは全二重だから、送受で干渉ないように作ってあるわな。
しかもイベント駆動だから、素直にハンドラ書けば並列に動く。
もちろん必要最小限の排他は行なってるわね。

> どこの実装?CONFIG_SMPってことはlinuxかな。

BSDなんかでもnetwork関係は#ifdef SMP全くないでしょ。
NET4自体が、i386がメインじゃない大昔からSMPを考慮してるからね。
(386BSD自体はSMP駄目だったけど)

つーか、読め。人に聞いたsurveyは身に付かん。
http://pc3.2ch.net/test/read.cgi/tech/1034236536/6
The Implementation (TCP/IP Illustrated, Volume 2)
http://www.amazon.co.jp/exec/obidos/ASIN/020163354X/ref=pd_sim_dp_4/249-2677107-1089124

いじょしゅうりょ 1000取り合戦どうぞ→
1000Get!!
> もちろん必要最小限の排他は行なってるわね。

そのへんは送受信で共有されてるパラメータによっては
複雑な処理になりそうですね。バグも入りそうだけど、
まあ腕の見せ所なんでしょう。

ところで本当に並列に動作していることを確認した人はいますか?
だれも「すると思う」レベルの話しかしてませんし。
難しいのかな。
986次スレ案内:02/10/12 12:34
ネットワークプログラミング相談室 Port4
http://pc3.2ch.net/test/read.cgi/tech/1034236536/l50
>>985
> ところで本当に並列に動作していることを確認した人はいますか?

あなたが説明聞いても分からないだけだよ?
本当に並列に動作しているもの。
>>987
> 本当に並列に動作しているもの。

確認方法は ?
横槍ですまんが,並列に動作していないことについての確認方法は?
|  |ノノハ
|_| 。‘人
|文|⊂)
| ̄|∧|
 ̄ ̄ ̄ ̄ ̄

|  |
|_|
|文| ノノ  サッ
| ̄|
 ̄ ̄ ̄ ̄ ̄
|  |
|_|
|文| ノノ  サッ
| ̄|
 ̄ ̄ ̄ ̄
992fang:02/10/13 06:45
993fang:02/10/13 06:49
ume
994fang:02/10/13 06:56
ume
995fang:02/10/13 06:57
ume
996fang:02/10/13 06:59
ume
997fang:02/10/13 07:00
ume
      __     
     l⊆⊇`ヽ ≡  ヤホーイ
     (´D`Lノ ≡
    m=○=mノ) ≡
    _/_/(「_ノニコ ≡
     ( (0)=(__)0) ≡(´⌒(´⌒;;
      〜oノハヽo〜 ミ _ ドスッ
       ( ^▽^) ─┴┴─┐
       /   つ.  1000 │    
      /_____|└─┬┬─┘
        ∪ ∪    ││ _ε3
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。