5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :名無しさん@接続しっぱい。:02/06/06 19:28
前スレに引き続き、主にソケットに関しての質疑応答スレです。

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

ネットワークプログラミング相談室 Port2
http://pc.2ch.net/test/read.cgi/tech/1006258198/

2 :デフォルトの名無しさん:02/06/06 19:31
乙!

3 :デフォルトの名無しさん:02/06/06 19:46
さっそく質問なのですが、MFCのCSocketをワーカースレッドで使っています。
このCSocketのConnectなどで処理が止まっている(ように見える)とき、
処理を中止させるには普通、どのような方法をとるのでしょうか?
CancelBlockingCallを呼べばよいのかと思うのですが、
メインスレッドからワーカースレッドのCSocketに対してどのように
CancelBlockingCall呼び出せばよいのかがわかりません。


4 :デフォルトの名無しさん:02/06/06 20:19
普通にメソッドをcallすればよし。
プロセスが同じだからメモリ空間も共有される

5 :デフォルトの名無しさん:02/06/06 22:40
>>4
メインスレッドからCancelBlockingCallを呼ぶという方向性でよかったのですね。
ですがその呼び方がわかりません。
// ワーカースレッド
UINT ThreadFunc(LPVOID pParam)
{
 CSocket socket;
  :
  :
 socket.Connect(strAddress, nPort);
  :
 return 0;
}
のようにやっているのですが、このsocketにはメインスレッドから
どうやってアクセスすればよいのでしょうか。

6 :デフォルトの名無しさん:02/06/06 23:01
>>5
一番簡単なのがグローバルにすること。
後は、スレッドのクラス化をして、オブジェクトの参照を返すなりお好きなように。

7 :デフォルトの名無しさん:02/06/06 23:06
>>6
あ、なるほど・・・
一所懸命外からアクセスすることを考えてました。
socketの方を外にだしてやればいいんですね。

8 :デフォルトの名無しさん:02/06/07 00:17
つーかCSocketは糞だから使うなと前スレに

9 :デフォルトの名無しさん:02/06/07 00:30
用途によるんじゃないの

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. <?????.??????????@hogehoge.ne.jp>

+OK Supported SASL mechanisms:

X-NONE-SO-USE-APOP-OR-STLS
.

11 :デフォルトの名無しさん:02/06/07 09:36
>>10
お前が嫌いだから答えない

12 :前スレ977:02/06/07 17:40
>>前スレ984
受信したデータを調べてみたら、今までどっかに消えてた部分が見つかりました。
というのも、受信したデータのなかにおそらく'\0'のような文字があり、
データ確認のためにメッセージボックスを使ったりサイズ取得にstrlen()を使っていたため、
保存するサイズ等の計算をミスしていたものと思われます。
ルーチンを組みなおしてやってみたら成功しました。
本当にありがとうございました。

13 :デフォルトの名無しさん:02/06/07 17:43
バイナリデータにstrlen()かよ!!

14 :デフォルトの名無しさん:02/06/07 19:17
センス無いな・・・<バイナリデータにstrlen()

15 :デフォルトの名無しさん:02/06/08 01:55
文字列をつかったインターフェースはunix文化からの伝統ですが何か?

16 :デフォルトの名無しさん:02/06/08 02:23
自分が扱っているデータの種類(バイナリ)や関数の機能(strlen)も理解せずに
プログラミングすのもunix文化からの伝統ですか?

17 :デフォルトの名無しさん:02/06/08 02:38
ネットワークプロトコルに不定長文字列をふんだんに盛り込むとunix的。
buffer overflowはunix文化の象徴と言えましょう。

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

インターネットの発達はunixによって支えられてきました。
全てのレイヤ5以上のプロトコルは文字列志向に置き換えるべき。

18 :デフォルトの名無しさん:02/06/08 03:00
ネトゲのプロトコルが文字列だったらゲームに並んだろうな

19 :デフォルトの名無しさん:02/06/08 03:01
もしかして、 char型の配列の事を全て「文字列」って呼んじゃう人ですか?

20 :デフォルトの名無しさん:02/06/08 03:31
DNSもPOP3もSMTPもHTTPもFTPも文字列志向だな

21 :デフォルトの名無しさん:02/06/08 03:48
バイナリデータの受信に関する部分を、
プロトコルとして議論しているのは何故ですか?

FTPで、
ftp> binary
200 Type set to I.
ftp> get hoge.tar.gz
したあとも文字列志向ですか?

22 :10:02/06/08 04:09
どうして嫌われたのでしょうか?

23 :デフォルトの名無しさん:02/06/08 04:55
  ∧ ∧     ┌─────────
  ( ´ー`)   < シラネーヨ
   \ <     └───/|────
    \.\______//
      \       /
       ∪∪ ̄∪∪

24 :デフォルトの名無しさん:02/06/08 05:11
もうテメーらの質問には答えないから覚えておけよ!

25 :デフォルトの名無しさん:02/06/08 10:02
不定長文字列と固定長バイナリが混ざってるプロトコルなんてサイアク

26 :デフォルトの名無しさん:02/06/08 11:29
>>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 :デフォルトの名無しさん:02/06/08 13:33
過去スレ読むと
トーシローの輩が回答してるね
クサレプログラマの憩いの場か(藁

31 :デフォルトの名無しさん:02/06/08 13:46
>>30
間違った回答があるってこと?
たとえばどれ?

32 :デフォルトの名無しさん:02/06/08 13:46
unix文化を軽視する奴は許さん。
蛇足かもしれないがTCP/IPのsocket APIはBSD文化と言っていい。
だからお前等はBSDを勉強すべきであってwindowsやlinuxなどという
劣化コピー品を参考にすべきではない。

33 :デフォルトの名無しさん:02/06/08 14:01
バクとウィはおんなし奴が作ったんだから中身はおなしやで

リヌはハナデカがつくたけどさ

34 :デフォルトの名無しさん:02/06/08 14:08
winsock2はそうでもないような・・・
linuxの微妙な違いはイライラする

35 :デフォルトの名無しさん:02/06/08 14:18
uni文化はもう止まっとる(藁

リヌは、、、、(ププ

ウィはブッチギリでしょう

36 :デフォルトの名無しさん:02/06/08 14:22
たしかにバカがいるな

37 :デフォルトの名無しさん:02/06/09 14:06
ソケット通信で構造体のデータを丸々投げたり受け取ったりって
出来ないんですか?今はデータを文字列として送受信してます。

38 :デフォルトの名無しさん:02/06/09 14:10
>>37
できるけど、やるとトラブルの種。

39 :デフォルトの名無しさん:02/06/09 15:07
>>38
そうなんですか、結構データの量が多くて文字列に直して送受信するのが面倒で。
データを工夫して量を減らさないとだめかなぁ・・・。


40 :デフォルトの名無しさん:02/06/09 15:13
構造体だとメモリ上の隙間ができたりするしねー
後、バイトオーダも気をつけないといかんしねー

41 :デフォルトの名無しさん:02/06/09 15:15
>>39
文字列にしなくても、バイトオーダーを決めて(ビッグエンディアンが「ネットワークバイトオーダー」)、
バイナリで送ってもいいっしょ。

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

そのあたりを意識してればいいんでは。

42 :デフォルトの名無しさん:02/06/09 18:07
>>41
難しそうですね^^;。もうちょっと勉強してきます〜。

43 :デフォルトの名無しさん:02/06/09 22:20
バイトオーダーってなんですか?

44 :デフォルトの名無しさん:02/06/09 22:39
エンディアンとも言う

45 :デフォルトの名無しさん:02/06/10 01:47
ぐぐれ。
http://www.google.com/search?num=50&hl=ja&q=%83o%83C%83g%83I%81%5B%83_%81%5B&lr=lang_en%7Clang_ja

46 :デフォルトの名無しさん:02/06/11 00:31
winsockでサーバー、クライアントのプログラムを作っています。
プロトコルはUDPで同期通信方式とマルチスレッドを使っています。
クライアントからサーバにデータを送信した後にサーバーから
データを送信しているのですが、頻繁にsendtoでエラーが起こります。
WSAGetLastError()でエラーを調べてみると「10047 WSAEAFNOSUPPORT」らしいのですが、
ずっとlocalhostで通信を行っているので途中で変ったりしないはずなんですが。
エラーも最初の送受信で発生したり、数回送受信をした後に発生したりとランダムに起こります。
クライアントからサーバへのデータは届いていることは確認できます。
考えられる原因があれば教えていただきたいです。

47 :デフォルトの名無しさん:02/06/11 01:19
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で質問です。
任意のタイミングで、データを受信せずにコネクションが
切断されたことを検出する方法はありませんか?


55 :デフォルトの名無しさん:02/06/12 15:00
任意のタイミングでと書いたのは、
シグナルやメッセージではなく、自分から関数を呼び出して取得したいと言うことです。

56 :デフォルトの名無しさん:02/06/12 15:17
recvのMSG_PEEKフラグを利用しろ。

57 :デフォルトの名無しさん:02/06/12 15:25
>>56
ありがとうございました、すっかり忘れてました。

58 :デフォルトの名無しさん:02/06/12 17:38
>>56
それは何ですか?

59 :デフォルトの名無しさん:02/06/13 12:14
windowsでチャットプログラムを作っています
telnetでテストをしたいのですが、win版telnetには「一行を送る」という方法はないのでしょうか?
オプションを見た限り見当たらないのですが・・・
TELNETver1.0です
もしできないのなら、何かフリーのtelnet接続ができるスタンダードツールを教えていただければ幸いです
(検索したけどWindowsCE用テ…)

60 :デフォルトの名無しさん:02/06/13 12:41
>>59
teraterm pro

61 :デフォルトの名無しさん:02/06/14 11:52
teratermに1行送るってあったか?
久々に起動してみたがみあたらん・・・

62 :デフォルトの名無しさん:02/06/14 16:33
Winsock1.1の制限について解説しているサイトありませんか?
Winsock2.0ばかり使用していて、1.1について覚えてないので、
互換性の問題が出てる可能性があるので、調べたいんです。

win95上でテストすると言う方法も勿論あるのですが、
違いの概要程度は把握していたいので。

63 :デフォルトの名無しさん:02/06/14 16:53
IPメッセンジャーって、LAN内で立ち上げると自動でユーザーリストが追加されていくけど、どうやって実現してるの?
TCPやUDPだけじゃ出来ないよね?

64 :デフォルトの名無しさん:02/06/14 17:28
>>63
UDPでブロードキャスト送信だよ

65 :デフォルトの名無しさん:02/06/14 18:42
>>63
UDPにはブロードキャストという機能がある
LAN内の全てのアドレスが対象になるアドレス
255.255.255.255にsendtoする


66 :デフォルトの名無しさん:02/06/14 20:42
LunixとWindowsで使えるC++用のクラスライブラリってありますか?

67 :デフォルトの名無しさん:02/06/14 21:03
http://sourceforge.net/projects/iplib/
トカ?

68 :デフォルトの名無しさん:02/06/14 21:18
>>65
255.255.255.255とはかぎらんのでは?

69 :デフォルトの名無しさん:02/06/14 21:23
IPADDR | ~NETMASK ダロ

70 :デフォルトの名無しさん:02/06/14 23:04
>>68
自分の居るLANのブロードキャストアドレスは、
INADDR_BROADCAST=255.255.255.255から取得するんじゃないの?
localhostを取得するのに127.0.0.1を使うようなもんで。


71 :66:02/06/14 23:34
>>67
サンクス。 使ってみます。

72 :デフォルトの名無しさん:02/06/15 01:25
>>70
255.255.255.255は全アドレスに対するブロードキャストだよね。WANも含む。
実際にはルータが止めるだろうけど、
複数のネットワークインターフェイスがある場合、そのすべてが対象になってしまうよね。

基本的には目的のネットワークインターフェイスの情報からbroadcast addressを得て
そこ宛に送信するのが行儀がいい方法。

73 :デフォルトの名無しさん:02/06/15 01:37
TCPでのサーバ、クライアント作ってますが
クライアントがサーバへconnect処理を行うときに
サーバがまだ起動していないときにconnectを行っても
エラーが出ません。普通ですか?

74 :デフォルトの名無しさん:02/06/15 01:50
>>72
知らなかった・・・
ブロードキャストフラグ立ててINADDR_BROADCASTにsendtoしてたよ・・・
IPメッセンジャクローンのどれかを参考にしたから、
その参考にしたやつもそうなってた。あんまりお行儀よくなかったのね(´・ω・`)

>目的のネットワークインターフェイスの情報からbroadcast addressを得て
これどうやるの?gccでのやりかた教えてください

75 :ななーしさん@接続しっぱなし:02/06/15 12:21
>>62
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/ovrvw1_2xv6.asp

読みやがれ! このWinsock2野郎めが!

76 :デフォルトの名無しさん:02/06/15 12:41
>>74
IPアドレスとサブネットマスクから計算できるんでないの?

77 :デフォルトの名無しさん:02/06/15 14:08
こにちわー
ひとつ教えてください。
WINDOWSでsetsockopt関数の第3引数に2をセットしているのですが
エラーが帰ってきてしまいます。
OSの仕様でしょうか?

78 :デフォルトの名無しさん:02/06/15 14:10
過去ログ見たんですが
・非同期ソケット
・非ブロックソケット
って別物ですよね?

79 :デフォルトの名無しさん:02/06/15 14:31
MSDNミロ。

>BSD options not supported for setsockopt are shown in the following table.
>SO_ACCEPTCONN, BOOL, Socket is listening

80 :デフォルトの名無しさん:02/06/15 14:54
>79
ありがとー、2日間の悩み解決です。
これで、心置きなく次の課題に移れます。

81 :デフォルトの名無しさん:02/06/15 15:31
>>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は取得できました。

83 :デフォルトの名無しさん:02/06/16 13:42
それはhttpを通したとは言わないな
ヘッダの作り方なんてここの過去スレでも何度も出てるし
それからsendの第三引数もアレだ

84 :デフォルトの名無しさん:02/06/16 14:17
高速DLのftpソフトを作りたい質問です

100倍速ぐらいのをつくりたいんですけど
VCのサンプルおちてないですか?

85 :デフォルトの名無しさん:02/06/16 14:24
>>83
適当にやってたらあかんのですね。
ヘッダと第3引数しっかり設定したら上手くいきました。感謝。

86 :デフォルトの名無しさん:02/06/16 16:37
82って場合によってはAccessViolationじゃないの?

87 :デフォルトの名無しさん:02/06/16 16:38
>>84
適当なソースからコピペするんじゃなくて、仕様書や規格書を頭の中にたたき込んでからにしろ。
何でRFC読まないでインターネット関連のプログラムを作ろうとする人間がいるのか和下欄。

88 :デフォルトの名無しさん:02/06/16 16:54
RFC読んでも意味わかんないYO!

89 :デフォルトの名無しさん:02/06/16 16:55
そういう奴は中学生からやり直すか、
作るのをあきらめてください。

90 :デフォルトの名無しさん:02/06/16 17:00
HTTP1.1のRFCでかすぎ

91 :デフォルトの名無しさん:02/06/16 17:05
HTTP/1.1のRFCはでかいけどよくまとまってるから良い。
たとえばメール関連のRFCは、ここのテキストは小さいが
記述が分散していてあちこち読まにゃならん。

92 :デフォルトの名無しさん:02/06/16 17:25
通信は相手あってのものだし、"交通ルール"(RFC)の無知は罪。

93 :デフォルトの名無しさん:02/06/16 22:18
RFC信者ハケーン
RFCがルールだなんて誰が言ったのかしら、ねえ?

94 :デフォルトの名無しさん:02/06/16 22:25
>>93
IETFが・・・

95 :デフォルトの名無しさん:02/06/16 22:25
RFCはルールですが、何か?

96 :デフォルトの名無しさん:02/06/17 00:00
ルールだったら「RFC」という名前じゃないでしょ。

97 :デフォルトの名無しさん:02/06/17 00:24
デファクトスタンダードってやつだ


98 :85: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);

99 :ななーしさん@接続しっぱなし:02/06/17 09:00
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
違う。公式のルール。

100 :デフォルトの名無しさん:02/06/17 17:53
>>98
Host: supporter.s1.xrea.com

101 :デフォルトの名無しさん:02/06/17 17:58
85は次に、Chunked-encodeされたbodyについて
「変な文字が混入して困っています」と言うぅっッッ!

102 :デフォルトの名無しさん:02/06/17 18:01
>>101
ここは85にゼロからhttpプロトコルを教えるスレになったと言うことでファイナルアンサー?

103 :デフォルトの名無しさん:02/06/17 20:55
.

104 :デフォルトの名無しさん:02/06/17 21:48
>>102
ftpプロトコルかもしれないし、scsiインタフェースかもしれないし、usbバスかもしれない。
しかし、telnetプロトコルじゃなければ、IEEE1394インターフェースでもないし、pciバスでもないだろうね。


105 :デフォルトの名無しさん:02/06/17 22:00
>>104
デムパ?

106 :デフォルトの名無しさん:02/06/17 22:19
プログラムでフレームを立てて、そのフレームで書いた文を
このスレに書き込めるようなプログラムはどのように書けばいいのでしょうか?

107 :デフォルトの名無しさん:02/06/17 22:31
は?

108 :デフォルトの名無しさん:02/06/17 22:38
>106
最初の「プログラムで」は余計でした。

109 :デフォルトの名無しさん:02/06/17 22:43
フレームって何だよ

110 :デフォルトの名無しさん:02/06/17 22:46
<FRAME> - <FRAMESET> - </FRAME>
を自動生成したいのだと思われ

111 :デフォルトの名無しさん:02/06/17 22:50
webprog板だろ

112 :デフォルトの名無しさん:02/06/17 23:37
>>104
ワラタ

113 :ななーしさん@接続しっぱなし:02/06/18 00:30
>>104
> telnetプロトコルじゃなければ、

じゃなければ、て(w


114 :デフォルトの名無しさん:02/06/18 14:04
パケットからパケットの到着時刻を知るには、どうしたら
いいでしょうか?

115 :デフォルトの名無しさん:02/06/18 20:30
udp/ipなら、recvしたとき、time()でも、gettimeofday()でも
好きなのを発行すればいいとおもう。

116 :デフォルトの名無しさん:02/06/18 21:29
今ごろ104の言いたいことが分ったよ!
カフェオレ牛乳でも飲むよ!

117 :デフォルトの名無しさん:02/06/18 22:12
>>116
おれ、102だけどサッパリわからんぞ、教えてくれ

118 :デフォルトの名無しさん:02/06/18 22:31
116じゃねーけど。
HTTPのPはProtocolのPだってことでしょ。
Ftpのp、SCSIのI、usbのb。

119 :デフォルトの名無しさん:02/06/18 22:43
あー、そういうことかなるほど。
NTテクノロジね

120 :デフォルトの名無しさん:02/06/19 10:45
Linux&Cでサーバプログラムを作っているのですが、
バッファオーバーランなどのセキュリティーホールをふさぐ為の
設計・コーディングについて解説してある本はありませんか?

121 :デフォルトの名無しさん:02/06/19 10:48
>>120
いや、単にバッファを可変長にするかアフォみたいに大きくするかデータ読み出しの時点であるサイズ以上は素来診具する。

122 : ◆.t4dJfuU :02/06/19 10:49
お世話になります。

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

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

どなたか教えて下さい。お願いします。


123 : ◆.t4dJfuU :02/06/19 11:08
HttpQueryInfoで調べられますでしょうか…?

# これからテストしてみます。


124 :デフォルトの名無しさん:02/06/19 11:35
>120
djbのトコトカ http://cr.yp.to
esehttpdにもそんな謳い文句があったなぁ……

125 :120: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

126 :123 ◆.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()で得た時刻が正確なパケットの
到着時刻って理解していいんでしょうか?
初心者なものですみません。

129 :デフォルトの名無しさん:02/06/19 23:19
>>128
何をもって受信時刻とするかによるが
recvfromで得られたとき、というのが実際妥当なところ。
それ以前の部分は中経路と考え、プログラムに到達したときとなる。

130 :デフォルトの名無しさん:02/06/19 23:49
>>129
ありがとうございます。
しかし、ループの中にrecvfrom()があると、パケットは送信側から
どんどんくるのに、recvfrom()で得られた時刻が受信時刻って
あんまりしっくりこないなぁと思いました。

131 :デフォルトの名無しさん:02/06/19 23:55
Linuxでサーバー、widowsでクライアントという
形を取るときに送受信で気を付けることあります?

132 :デフォルトの名無しさん:02/06/20 00:01
>>131
改行コードと漢字コードくらい。

後は何も気にしなくて良いところがプロトコル。

133 :131:02/06/20 01:31
>>132
なるほど、ソケット通信様々ってところでしょうか。

134 :ななーしさん@接続しっぱなし:02/06/20 01:53
>>120
StackGuard を使う。
http://www.immunix.org/stackguard.html

んじゃ。

135 :デフォルトの名無しさん:02/06/20 04:34
一応、エンディアンも追加しておく。

136 :デフォルトの名無しさん:02/06/21 09:33
Winsockでrecv関数にタイムアウトを設定したいのですが
できますでしょうか?
もし、やりかたがあったら教えていただきたいのですが。

137 :136: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);


138 :デフォルトの名無しさん:02/06/21 22:12
>>137
selectの第二引数を調べてくれ

139 :名無しさん:02/06/21 23:41
ソケットプログラムの勉強をしていますが、以下の処理について
何か良い方法があれば教えていただけるとありがたいです。
で、その処理ですが、ひたすらwrite()でデータを送る。
ただし、相手がビジーになったときに、その理由(バッファフルなど)を
送ってくるので,そのような時はread()で読みたい。
というものです。
このような時は、write()でブロックされてしまわないように
fcntl()を使って、NONBLOCKINGモードにしておいて、
write()とread()をループさせようと思いますが
どうでしょうか。
あと、NONBLOCKINGモードの設定とかで注意点とかあればお願いいたします。


140 :デフォルトの名無しさん:02/06/21 23:51
>>139
私だったらスレッドで分けちゃいます

141 :デフォルトの名無しさん:02/06/21 23:56
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でループさせるのと
一緒に思えますが、何か思い違いでしょうか。


144 :デフォルトの名無しさん:02/06/22 00:41
fd + 1って1じゃないの?

145 :デフォルトの名無しさん:02/06/22 00:42
>>143
読み込み、書き込みどちらかが可能になるか、エラーが返るまでブロックする

146 :名無し:02/06/22 00:51
>>140
スレッドでわけても、writeでブロックされている時は、
別のスレッドでもreadできないのでは?

147 :デフォルトの名無しさん:02/06/22 00:52
>>143
>ん?そうすると、141さんのタイムアウト0でループさせるのと

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

>>144
伝統的なbsd socketにおけるselectの第一引数には、
fdsetにセットしたfd(を整数値とみなしたときの)の最大値+1を入れる。
ちなみにwinsockでは無視されるから注意しよう。

148 :デフォルトの名無しさん:02/06/22 00:54
>スレッドでわけても、writeでブロックされている時は、
>別のスレッドでもreadできないのでは?

ふつうのsocketの実装なら、writeとreadは並行して行えるはず。
「ふつう」がどこまで通用するかは微妙 ;-)
Solaris2.5なんかはバグってたらしい。

149 :デフォルトの名無しさん:02/06/22 10:46
winsockでTCP非同期通信やってますが
データを送信するときはsendを使ってますが
FD_WRITEの使い方がよく分からないです。
データを送信するときはFD_WRITEを待たなければいけないんですか?
FD_WRITEは送信バッファに空きがあることを示すイベントと書いてありました。


150 :デフォルトの名無しさん:02/06/22 11:16
>>149
MFCでクラスがあるくらいだから出来るんじゃない?
多分イベントオブジェクトを受け取ってwaitforsingleobjectかと。

151 :デフォルトの名無しさん:02/06/22 11:45
>>149
待たなくても構わないが、ブロックするかエラーになる

152 :デフォルトの名無しさん:02/06/22 11:48
非同期とノンブロックを区別してほすい

153 :初心者:02/06/22 15:08
やっとselectの意味がわかったよ

154 :デフォルトの名無しさん:02/06/22 18:11
名前が変なんだよな。WaitFor〜だとかpollだとかのほうがまだマシ

155 :デフォルトの名無しさん:02/06/23 20:08
recvfrom()しながら、sendto()するにはどうしたら
いいでしょうか?
非同期にしたらいいんでしょうか?

156 :149:02/06/23 22:03
>>151
じゃあFD_WRITEが発生するまで待ってからsendする方向だと、
一度sendするたびにFD_WRITEが発生したかどうかのフラグみたいなものを
用意しなくちゃいけないんですかね?

157 :デフォルトの名無しさん:02/06/24 01:03
>154
もともとUnixのものだからね。UnixだとSocketに限らずすべての入出力は
ファイルと同じように扱える。つまりselectにSocket以外のファイルディスクリプタ
もセットしてデータの到着や書きこみ可能なタイミングを監視できるわけだ。
「どっから読んだり書いたりしようかな〜」と選択するってことでselectって
名前になっているのだと思う。

158 :デフォルトの名無しさん:02/06/24 08:33
>>157
複数のファイル記述子からシグナル状態になった物を選択して返すからselectじゃないの?

159 :デフォルトの名無しさん:02/06/24 14:09
なぜWinsockのselect()の第一引数は無視されるのでしょう?
というか、なぜ無視できるのでしょう?

160 :デフォルトの名無しさん:02/06/24 19:47
>>159
fd_setの実装が、まるで違うから。マクロとかも覗いてみ。

161 :デフォルトの名無しさん:02/06/24 22:45
Winsockの非同期TCPプログラムの参考になるHP教えてほしい。

162 :デフォルトの名無しさん:02/06/24 23:26
>>161
www.nakka.comとか

163 :161:02/06/25 00:27
>>162
どうも〜、って思ったらすでに見てました^^;
ココ参考にTCPクライアント(非同期型)作ってるんですけど、
データ送信するときsend使ってるけどココのサンプルはFD_WRITEの中で呼んでますよね。
FD_WRITEってイベントだから任意のタイミングではsendは使えないんですか?

164 :デフォルトの名無しさん:02/06/25 02:21
>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で送った値が送られていないようなのですが
何か考えられる原因はありますか?

169 :デフォルトの名無しさん:02/06/25 22:04
>>168
どうしろと・・・。

170 :デフォルトの名無しさん:02/06/25 23:08
>168
とりあえずな、自分の送ったデータと、それへのレスポンス
でも示して貰うか、ソースを晒してもらわないことには、
何も言えない。(というより、該当することが多すぎて列挙しきれない)

171 :デフォルトの名無しさん:02/06/25 23:46
>>166
URLconnection::setDoInput(true)って
やってみましたか?
::setDoOutput(true)だったかもしれない

これで、私はPostできましたよ

172 :デフォルトの名無しさん:02/06/26 01:21
winsockでスレッド使った同期式TCPなんだけど毎回recvするとバッファの最大値まで
データ蓄えてから受け取ってるんだけど。データがまとめられたり分割されるのは
わかるけど、毎回まとめられてるとなんか変な感じ。クライアントでsendを何回も
連続して発行してるけどそれってマズイのかな?


173 :デフォルトの名無しさん:02/06/26 01:31
日本語が変だな。センター国語何点だった?

174 :デフォルトの名無しさん:02/06/26 02:02
>>156
send〜がWSA_EWOULDBLOCKで失敗した時だけFD_WRITEを待てばいいはず。

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

FD_WRITEは実装が複雑になるから、あまりやる必要はないんじゃないかな?
どうしてもしようと思うなら、WSAAsyncSelectを使わずに非同期(重複)I/Oを
使った方がいいかも。ロジックが大幅に変わるから直すのは大変だろうけど。

175 :デフォルトの名無しさん:02/06/26 02:11
>>173
6〜7割取れてました、苦手な科目だったな・・・。

176 :デフォルトの名無しさん:02/06/26 09:21
>>172
根本的にわかっていないようですね。

177 :166: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");
}


178 :166: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
(´_ゝ`)で?

180 :166:02/06/26 11:21
>>179
それでwriteしても、正確なデータが遅れないんですよぉ〜。

181 :じゃヴぁ:02/06/26 11:26
>>179 のソースは間違ってるますよ
正しいソースは…
お昼休みに書く予定です

182 :ごめんくさい:02/06/26 11:34
181です
さっきの発言はうそです ごめんなさい!!
書くきなんて全然ありません
だってお昼だもん俺も休みたいもん!!

183 :179:02/06/26 11:36
そう俺は間違っているんだ(;_;)
JAVAなんて知らないのに煽って悪かった。


184 :デフォルトの名無しさん:02/06/26 11:45
つーか、connectしてないよーな……

185 :デフォルトの名無しさん:02/06/26 19:28
unixのソケットがらみのヤシをWindowsに移植しようとしてるんですが、
close(sd);
がないとか言われました(VC6)。
shutdown(sd);
close(sd);
の変わりになる関数がなんかあった気がするんですが、
教えてもらえませんか? たしか、一回呼べば済むようなヤシだったと思います。

186 :デフォルトの名無しさん:02/06/26 19:29
closesocket

187 :185:02/06/26 19:29
closesocket(sd);
としたら素直にとおったんですが、これでいいんでしょうか?

188 :185:02/06/26 19:30
あ、いいみたいですね。
どうもです。 >>186

189 :デフォルトの名無しさん:02/06/26 19:30
>>185
正解かと。

190 :185:02/06/26 20:00
連続ですみません。またご教授下さい。
socketのKEEPALIVEの設定をしたいのですが、
KEEPALIVEの可否自体はsetsockopt()でできるみたいですが、
そのintervalはどうやって指定するのでしょうか?
よろしくお願いします。

191 :185:02/06/26 20:18
ttp://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#peer_death
こんなドキュメントを見つけました。これって要するに、変えられないってことですよね。
要求ではコネクション毎にKeepAliveIntervalを指定したいみたいなんですが・・・。
まさかアプリケーションで作れってこともないと思うけど(相手がapacheなんで)。
困ったにゃ。

192 :デフォルトの名無しさん:02/06/26 20:25
socketとHTTPをごっちゃにしてるような

193 :185:02/06/26 20:30
いえ、HTTPクライアント(っぽい簡易版)をつくるんですよ。
どうしてKeepAliveをしたいのかは仕様に書いてないんで分かりませんが。

194 :185:02/06/26 20:33
とりあえず、今日は帰ります。ありがとうございました。
あと>>191の口調はキモくてすんまそん。

195 :デフォルトの名無しさん:02/06/26 21:13
TIME_WAITはsocket(特にlistenに影響)で
KeepAlive(のタイムアウト)はHTTPだと思うんだけど、違うかな

196 :デフォルトの名無しさん:02/06/26 21:23
一枚レイヤーが違うと思われ。
SO_KEEPALIVEってのがあるけど、HTTPのKeepAliveとは別物。

197 :デフォルトの名無しさん:02/06/26 21:32
そうなのか。ありがとう。

198 :185:02/06/27 10:50
はい、HTTPのKeepAliveでした。お騒がせしました。

199 :デフォルトの名無しさん:02/06/28 08:19
ちょっと質問があります。

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

どっちが正しいんでしょうか?

200 :デフォルトの名無しさん:02/06/28 09:09
>>199
そら、パケット自体の形式は保証されてるだろう。
届くかどうかは別として。

201 :デフォルトの名無しさん:02/06/28 12:32
TCPも保証は無いんじゃなかたけ・・・

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

っていうか教科書嫁

>>201
TCPにはパケットの概念はないだろ

203 :デフォルトの名無しさん:02/06/28 21:18
>>199
パケットが届く順序が変わるかもしれない。
あと、1回しか送ってないパケットが2回(以上)届くかもしれない。1回も届かないかもしれない。
届いたなら、データの中身は恐らく正しいであろう。壊れて届いたパケットは何も言わずに勝手に捨てられます。

204 :デフォルトの名無しさん:02/06/28 21:34
>>203
時間差で>>202と同じ事欠いても・・・

205 :デフォルトの名無しさん:02/06/28 21:53
重複もありうるんだっけ?
こりゃまずいな...

206 :デフォルトの名無しさん:02/06/28 23:57
俺パケットには通し番号とCRCを自分で付加してたよ
CRCは削っても良いのか

207 :デフォルトの名無しさん:02/06/29 00:42
>データグラムが多重に届くことすらありえる

これ良くわからん
全く同じUDPパケットが2回以上届く事なんてあるの?
UDPが届かないのは良くわかるけど

208 :デフォルトの名無しさん:02/06/29 00:45
あと順番が入れ替わる可能性があるってのもわかるんだが…


209 :デフォルトの名無しさん:02/06/29 00:48
>>207
あるよ。

そのパケットが送信されて受信側に届く前にそのパケットの再送要求出したときとか。


210 :デフォルトの名無しさん:02/06/29 00:54
UDPに再送信要求なんて無いんじゃないの?

211 :デフォルトの名無しさん:02/06/29 00:55
>>210
ルータ間

212 :デフォルトの名無しさん:02/06/29 04:13
>>203>>202のパケットが遅延して欠落して順番が入れ替わって多重に届いたのかな

213 :デフォルトの名無しさん:02/07/04 00:18
promiscuous mode って何ですか?


214 :デフォルトの名無しさん:02/07/04 00:23
>>213
宛先と無関係に流れてきたパケットをすべて取り込むモードです。

215 :デフォルトの名無しさん:02/07/04 00:24
>>214
スニッファですな

216 :デフォルトの名無しさん:02/07/04 01:14
promiscuousを辞書でひいてハァハァ

217 :デフォルトの名無しさん:02/07/04 01:59
1. sexually indiscriminate: having many indiscriminate or casual sexual relationships(disapproving)

218 :デフォルトの名無しさん:02/07/04 17:51
n = socket(...);
...
select(n+1, ...);
のようなコードがあるのですがsocket()の戻り値は
その値自体に何かの意味があるのでしょうか?

219 :デフォルトの名無しさん:02/07/04 18:11
socket discriptor
stdin stdout stderr
とかで検索しる

220 :デフォルトの名無しさん:02/07/04 18:28
>>219
socket discriptor でググッたら 130件もバカが見つかったよ。

221 :デフォルトの名無しさん:02/07/04 19:12
>ごた混ぜの, 乱雑な; でたらめの; 乱交の.


(;´Д`)ハァハァ

222 :デフォルトの名無しさん:02/07/04 21:57
すみません、質問させてください。
winsock2.0、BCCでネットゲーム開発しています。
バイナリデータの送受信にはどういった方法を用いるのですか?
yahoo・グーグルでここ二日ひたすら探したのですが
バイナリデータ送受信を解説しているものが見つからず立ち往生してます。

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

初歩的すぎる質問でしたらキーワードだけでも教えていただけると助かります。
よろしくお願いします。

223 :222:02/07/04 22:05
>>222付け足しです。
ファイルからバイナリデータを読み出してそれを送信する、というのではないです。

変数に格納してある値をテキストデータとして送らないで送受信する方法を
「バイナリデータの送受信」と書きました。紛らわしくてすみません。

224 :デフォルトの名無しさん:02/07/04 23:06
なぜ立ち往生するのかわかりませぬ。

225 :デフォルトの名無しさん:02/07/05 00:02
分解するところ/再構築するところにバグがあるんでねーの

226 :デフォルトの名無しさん:02/07/05 02:37
htonl
htons
などを検索してみるとよいかも。けど「バイトオーダー」については
わかってるみたいなので、はずしてるかもー。

227 :222: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」とのことでソケットが接続されていないらしいのですが、どう対処
していいのか分からない状態です。
とりあえず、プログラムを追ってみたのですが、サーバー、クライアント
共に正しく動いている(ような気が)します。
本当に初歩の初歩の質問だと思うのですが、何かよきアドヴァイスが
ありましたらよろしくお願いします。

229 :デフォルトの名無しさん:02/07/05 14:28
socket()やconnect()は成功してんの? エラー処理入ってる?
send()の直前でとめて、netstatやってみたら?

230 :228:02/07/05 14:52
>>229
お返事ありがとうございます。

>エラー処理入ってる?

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

それで、もう一度動かしてみたのですが、今度はconnect関数に
入ったところで、プログラムが反応しなくなってしまいました。
よって、connectのエラーコードも分かりません。
もちろん、サーバは動かしています。
また何かポカをやっていると思うのですが、よろしくお願いします。


231 :デフォルトの名無しさん:02/07/05 15:03
sockaddr_in構造体にはなにを設定してんの?

232 :デフォルトの名無しさん:02/07/05 15:11
selectしてループまわしてFD_ISSETでチェックしてrecv, sendという処理は
acceptしたクライアント数が多くなると効率悪くないですか?
せめて受信の処理を検索せずにコールバックで処理するような関数はないのでしょうか?
環境はLinuxです。


233 :228: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));
///////終わり////////////


234 :デフォルトの名無しさん:02/07/05 15:21
select自体が重いからな

235 :デフォルトの名無しさん:02/07/05 15:50
>>234
そうですね。プロファイルとってみたらselect(待ち時間は0)が50%近い値でした。
教科書どおりにacceptの度にforkするわけにもいきませんしどうしたものでしょう?
Winsockには非同期通知というのがあるらしいのでそちらを試してみようと思いますが・・・

236 :デフォルトの名無しさん:02/07/05 15:53
スマン。unixはサッパリわからんのだよ。
WinならIOCPがあるんだが。

237 :デフォルトの名無しさん:02/07/05 15:53
つか、待ち時間0でループ回すなよ

238 :デフォルトの名無しさん:02/07/05 15:58
>>235
俺スレッド派だな。

239 :デフォルトの名無しさん:02/07/05 16:16
memcpy(&svAddress.sin_addr, &svaddr, sizeof(u_long));
が怪しい。

240 :デフォルトの名無しさん:02/07/05 16:19
struct hostent *he = gethostbyname( HostName or IP Address );
svAddress.sin_addr.s_addr = ( (struct in_addr*)( he->h_addr ) ) -> s_addr;

みたいなカンジで。

241 :デフォルトの名無しさん:02/07/05 16:23
代入始めるsvAddressの初期化もよろしく。

242 :228: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
を学ぶのは無理だと思いました。
何か他の参考書を買ってきたいと思います。

お答えしていただいた皆さん、ありがとうございました。

243 :デフォルトの名無しさん:02/07/05 16:30
>232
http://ghost.math.sci.hokudai.ac.jp/esehttpd/
ここが役に立つと思う。
Linux2.4系ならPOSIX Realtime Signalsがあります。
*BSDなら、kqueueとか使うんだったかな?

>233
つか、128.128.128.3:45678では誰かちゃんと待っているんだろうな。

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

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



245 :デフォルトの名無しさん:02/07/05 16:48
>>244
つぅかTCP/IPの常識すら知らん奴がネットワークプログラミングなんぞするなよ・・・。
本は無実だと思われ。

246 :228:02/07/05 17:10
>>245
そうですか・・・。
失礼しました。

247 :デフォルトの名無しさん:02/07/05 17:17
>>245
なんで? どうやって勉強すんのよ? 本は無実だが>>228にも罪はない。

248 :デフォルトの名無しさん:02/07/05 17:45
>247
>どうやって勉強すんのよ?
マスタリングTCP/IP嫁よ

>本は無実だが>>228にも罪はない。
本は、128.128.128.3みたいな妙なアドレスを出す時点で有罪
228はそれに、まったく疑問をいだかなかった時点で有罪

249 :デフォルトの名無しさん:02/07/05 17:57
じゃあサンプルではどんなIP使えばいい?
127.0.0.1とか?

250 :デフォルトの名無しさん:02/07/05 18:01
210.150.253.198なんかいいよ。

251 :デフォルトの名無しさん:02/07/05 18:08
7.7.4.3もいいよね。

252 :デフォルトの名無しさん:02/07/05 19:49
>249
たとえばそれがhttp clientなら、kantei.go.jpとか有名な
あたりを指定しとけばいいし、俺様protocolで通信する
ServerとClientなら、localhostを指定しとけばいいと思う。
#名前を引くのは当然として

253 :デフォルトの名無しさん:02/07/05 19:59
サンプルの場合、microsoft.comやらyahoo.comやらの有名どころ、
或いは出版社のサイトになってるのが多いんだけどな。
このスレ的にはwww.2ch.netだが、「無用な負荷をかけるな」と言われる諸刃の剣。

254 :デフォルトの名無しさん:02/07/06 01:51
IP抜かれました。住所とか個人情報ばれますか?

とかふざけたことほざいてるうちはネットワークプログラミングなんぞ10000024年早いってこった。

255 :デフォルトの名無しさん:02/07/06 11:14
サンプルはgoogleを指定してるよ。
あそこは素直だからな。

256 :デフォルトの名無しさん:02/07/06 18:43
うえーん(TДT)サバが立ち上がらないよお

257 :デフォルトの名無しさん:02/07/06 18:54
というよりソケットが貰えないみたいれす・・・

258 :デフォルトの名無しさん:02/07/06 18:56
>>249-253
どこを指定しても、ポート 45678 なんかで待っている奴なんかいないから、結局
エラーになると言う罠。

259 :デフォルトの名無しさん:02/07/06 19:20
socket()がエラーになるのは、winsockでWSAStartup()してないと見たが、どうかな

260 :デフォルトの名無しさん:02/07/06 19:39
>>259 ありがとうございます、できました(^▽^)ノ

# 手元の本にそんなこと載ってなかった・・・。

261 :デフォルトの名無しさん:02/07/06 19:44
Winsockの本なら例外なく最初のセクションにあると思うが

262 :デフォルトの名無しさん:02/07/06 19:47
>>261
最悪でもソースに書いてある。

263 :デフォルトの名無しさん:02/07/06 20:00
TCP/IPプログラミング徹底解説って本なんすけど・・
無いっぽいです(・・)

264 :デフォルトの名無しさん:02/07/06 20:02
それはwinsockの本なのか?

265 :デフォルトの名無しさん:02/07/06 20:08
winsockではないようですがwindowsとunix両方についてかいてあります
本を間違ったかな・・・(-д-)

266 :デフォルトの名無しさん:02/07/06 20:11
いや、間違っては居ないと思うが。
WSAStartup()〜WSACleanup()を除けば
ほぼUnixと同じように書けるし。

Winsock2.0の本で良書があったと思うが、
題名忘れた。

267 :デフォルトの名無しさん:02/07/06 20:13
>>266
Winsock 2.0 プログラミング?

268 :デフォルトの名無しさん:02/07/07 15:19
JAVAでSNTPの機能をつくりたいのだけど
なにか良い資料ない?

269 :デフォルトの名無しさん:02/07/07 15:22
>>268
RFC

270 :デフォルトの名無しさん:02/07/07 16:08
>>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作れますか?
また、その最大数を変更することはできますか?

272 :デフォルトの名無しさん:02/07/08 15:25
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を取得する方法
ってわかりますでしょうか?
パーソナルファイアーウォールなどでは、取得できているようなのですが。
お願いします。

274 :デフォルトの名無しさん:02/07/09 00:13
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)に手を出さないと無理らしい。
このへんの情報知ってましたらお願いします。

279 :デフォルトの名無しさん:02/07/09 12:47
>>275
>>269

280 :デフォルトの名無しさん:02/07/09 17:42
WinSock 2.0  と言う本を買って、ネットで一対一で対戦できるゲームを作ろうとしたのですが
この内容が、ちょっとややこしいので、理解できません。

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

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

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

281 :デフォルトの名無しさん:02/07/09 18:00
--------初期化
WSAStartup();
socket();

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

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

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

--------終了処理
closesocket();

282 :デフォルトの名無しさん:02/07/10 02:08
>>281
CAsyncSocketが楽な罠。

sock.create(80);
sock.connect();

283 :デフォルトの名無しさん:02/07/10 12:17
>>281
WSACleanupも、作法でソ。


284 :280:02/07/10 13:14
ありがとうございました^^
だいたいの流れはわかりました。
早速やってみます。
また質問があるかも知れませんが、そのときはまたよろしくお願い致します

285 :280: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


どこがいけないか、もしよろしければ指摘お願いしたいです;;
また、これからも結構質問するかも知れませんが、よろしくお願い致します。

286 :デフォルトの名無しさん:02/07/10 15:05
なにをやろうとしているのか全然わからん
入門でやりたいならどっかのページ(yahoo.co.jpとか)を
取得するテストでもやってみりゃいい

287 :デフォルトの名無しさん:02/07/10 15:37
"socket bind"とかでググればサンプルいっぱいあるだろうに

288 :デフォルトの名無しさん:02/07/10 16:09
CAsyncSocketは知らんけど、

・clientのポート番号を指定してるのはおかしい
・Createでポート番号指定してるのにbindしてるのはおかしい

289 :デフォルトの名無しさん:02/07/10 16:23
指定ポートからの接続以外をはねる実装もあるので、
一概にクライアントで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使用してクライアソトに伝えようと思ったんすけど・・・
なんか他に(・∀・)イイ方法あるなら教えてください。

厨なんで質問の意図わかりにくいかとは思いますが
何卒オナガイシマス

291 :デフォルトの名無しさん:02/07/10 23:47
漏れも厨なんで分からないんですが、環境はなんですか?
共有メモリを使ったIPCですk?
そして、よっぱらってぐらぐらします。

292 :デフォルトの名無しさん:02/07/11 00:13
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の機能でこれを代理するものはないでしょうか?

294 :デフォルトの名無しさん:02/07/12 14:31
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がベスト。

296 :デフォルトの名無しさん:02/07/12 17:20
SolarisでWinSockのWSAAsyncSelectみたいなのありませんか?

297 :デフォルトの名無しさん:02/07/12 23:15
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

299 :デフォルトの名無しさん:02/07/13 06:01
かかれているように、Another solution試せばいいやん。

300 :デフォルトの名無しさん:02/07/13 12:12
>>294-295
ありがとうございます
やり方としては間違っていないようで安心しました
参考文献もおもしろかったです

301 :デフォルトの名無しさん:02/07/15 17:55
ソケットを再利用するにはどうしたらいいでしょう。
shutdown closesocketするだけではだめなようです。
OSはWindows2000で,MFCではなく素のAPIでやっています。


302 :デフォルトの名無しさん:02/07/15 17:57
再利用は出来ない

303 :デフォルトの名無しさん:02/07/15 17:58
ソケットって再利用するものなのか?
そして、この場合の再利用の意味とは?

304 :301:02/07/15 18:03
あ、スイマセン。再取得?したらできました。
いや、相手との接続が急に切断して、また、そのsocket
でconnectできるかとおもったのですが。
見当違いでした。どうも。

305 :デフォルトの名無しさん:02/07/16 04:04
IRCクライアント作りたいんすけど、どこかに簡単なCで書かれたソースありませんか?
とりあえず1チャンネルだけのクライアントは作れたんですけど、2複数のチャンネルを
どう処理したら良いか分かりません。

306 :デフォルトの名無しさん:02/07/16 08:23
過去ログ嫁

71 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)