ネットワークプログラミング相談室 Port21at TECH
ネットワークプログラミング相談室 Port21 - 暇つぶし2ch1:echoちゃん
08/02/29 21:19:37
主にソケットに関しての質疑応答スレッドです。

Programming UNIX Socket FAQ (日本語訳)
 URLリンク(www.kt.rim.or.jp)
Winsock Programmer's FAQ (日本語訳)
 URLリンク(www.kt.rim.or.jp)

関連リンクは>>2-10辺り
足りなかったら適当に付け足してね

前スレ
ネットワークプログラミング相談室 Port20
スレリンク(tech板)

関連スレ
Java ネットワークプログラミング 【教えて!】
スレリンク(tech板)

2:echoちゃん
08/02/29 21:20:51
過去スレ:
Port19 スレリンク(tech板)
Port18 スレリンク(tech板)
Port17 スレリンク(tech板)
Port16 スレリンク(tech板)
Port15 スレリンク(tech板)
Port14 スレリンク(tech板)
Port13 スレリンク(tech板)
Port12 スレリンク(tech板)
Port11 スレリンク(tech板)
Port10 スレリンク(tech板)
Port9 スレリンク(tech板)
Port8 スレリンク(tech板)
Port7 スレリンク(tech板) ★行方不明
Port6 URLリンク(pc5.2ch.net)
Port5 URLリンク(pc2.2ch.net)
Port4 URLリンク(pc3.2ch.net)
Port3 URLリンク(pc3.2ch.net)
Port2 URLリンク(pc.2ch.net)
Port1 URLリンク(pc.2ch.net)

3:echoちゃん
08/02/29 21:21:51
図書コーナー:
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
 URLリンク(www.amazon.co.jp)
 そのソースコード
 URLリンク(www.unpbook.com)
詳解TCP/IP〈Vol.1〉プロトコル
 URLリンク(www.amazon.co.jp)
詳解TCP/IP〈Vol.2〉実装
 URLリンク(www.amazon.co.jp)
詳解TCP/IP〈Vol.3〉トランザクションTCP, HTTP, NNTP, UNIXドメインプロトコル
 URLリンク(www.amazon.co.jp)
TCP/IPによるネットワーク構築
 〈Vol.1〉原理・プロトコル・アーキテクチャ
  URLリンク(www.amazon.co.jp)
 〈Vol.3〉クライアント‐サーバプログラミングとアプリケーション
  URLリンク(www.amazon.co.jp)
  Linux/POSIXソケットバージョン
  URLリンク(www.amazon.co.jp)
  Windowsソケットバージョン
  URLリンク(www.amazon.co.jp)

4:echoちゃん
08/02/29 21:22:15
マスタリングTCP/IP RTP編
 URLリンク(www.amazon.co.jp)
Linuxソケットプログラミング?ネットワークプログラミングにおける実践技法
 URLリンク(www.amazon.co.jp)
Webプロトコル詳解?HTTP/1.1、Webキャッシング、トラフィック特性分析
 URLリンク(www.amazon.co.jp)
WinSock2.0プログラミング
 URLリンク(www.amazon.co.jp)
猫でもわかるネットワークプログラミング
 URLリンク(www.amazon.co.jp)
IPv6ネットワークプログラミング
 URLリンク(www.amazon.co.jp)
Visual Basicではじめるネットワークプログラミング超入門
 URLリンク(www.amazon.co.jp)

5:echoちゃん
08/02/29 21:22:38
URL抜粋:
★規格
RFC 日本語版リスト
 URLリンク(www5d.biglobe.ne.jp)
JPNIC RFC関連リンク集
 URLリンク(rfc-jp.nic.ad.jp)
RFC Editor
 URLリンク(www.rfc-editor.org)
HTMLなRFC (セクションを直に示すのに便利)
 URLリンク(www.freesoft.org)
RFC 2616 "Hypertext Transfer Protocol -- HTTP/1.1" 日本語訳
 URLリンク(www.studyinghttp.net)
IANA Well known port numbers
 URLリンク(www.iana.org)

6:echoちゃん
08/02/29 21:23:41
★プログラミング
C10K ヘヴィーロードサーバ
 URLリンク(www.kegel.com)
C10K ヘヴィーロードサーバ(日本語訳)
URLリンク(www.hyuki.com)
MSDN
 URLリンク(msdn.microsoft.com)
Raw IP Networking FAQ
 URLリンク(www.whitefang.com)
Java で packet capture
 URLリンク(netresearch.ics.uci.edu)
Randomness Recommendations for Security
 URLリンク(www.faqs.org)
BoostSocket
 URLリンク(www.crystalclearsoftware.com)
The Code Project - Internet & Network programming
 URLリンク(www.codeproject.com)
ネットワークプログラミングの基礎知識 (問題ありのサイト?)
 URLリンク(X68000.q-e-d.net)

7:echoちゃん
08/02/29 21:27:33
★ツール類
ethereal - URLリンク(www.ethereal.com)
Wireshark - URLリンク(www.wireshark.org)
tcpdump - URLリンク(www.tcpdump.org)
Windump - URLリンク(netgroup-serv.polito.it)
WinPcap - URLリンク(www.winpcap.org)
pathchar - fURLリンク(ftp.ee.lbl.gov)
pchar - URLリンク(www.employees.org)
Packetyzer - URLリンク(www.networkchemistry.com)
libevent - URLリンク(www.monkey.org)

★プロトコル
TTCP
 URLリンク(www.sean.de)
 URLリンク(www.kohala.com)
UDP Hole Punching
 URLリンク(homepage3.nifty.com)

★IP, TCP実装
URLリンク(www.iti.fi)
URLリンク(www.sics.se)
URLリンク(www.codeguru.com)
URLリンク(www.geocities.jp)

8:デフォルトの名無しさん
08/02/29 23:04:48
keep-aliveの使い方を教えてほしいです。

9:デフォルトの名無しさん
08/02/29 23:08:42
         / ̄\
        |     |
         \_/
          |
       /  ̄  ̄ \
     /  \ /  \
    /   ⌒   ⌒   \      よくぞこのスレを立ててくれた
    |    (__人__)     |      褒美としてオプーナを買う権利をやる
    \    ` ⌒´    /   ☆
    /ヽ、--ー、__,-‐´ \─/
   / >   ヽ▼●▼<\  ||ー、.
  / ヽ、   \ i |。| |/  ヽ (ニ、`ヽ.
 .l   ヽ     l |。| | r-、y `ニ  ノ \
 l     |    |ー─ |  ̄ l   `~ヽ_ノ____
    / ̄ ̄ ̄ ̄ヽ-'ヽ--'  / オプーナ  /|
   .| ̄ ̄ ̄ ̄ ̄ ̄|/|    | ̄ ̄ ̄ ̄ ̄ ̄|/| ______
/ ̄オプーナ/|  ̄|__」/_オプーナ  /| ̄|__,」___    /|
| ̄ ̄ ̄ ̄ ̄|/オプーナ ̄/ ̄ ̄ ̄ ̄|/ オプーナ /|  / .|
| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄|/l ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄|/| /
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|

10:デフォルトの名無しさん
08/03/01 14:29:19
age

11:デフォルトの名無しさん
08/03/04 13:04:04
Windowsの質問です。

「Winsock Programmers FAQ 2.13 - ネットワークの異常切断はどのようにして検出できますか?」に
あるような状況で、プロトコルに「コマンド/応答」の仕組みがないやり取りをする場合があるときの話です。

クライアントアプリケーションを開発してるのですが、次のような場合どうすればいいのでしょうか?
1. クライアントアプリ(これを作っている)がサーバにconnectする
2. サーバからの要求を受け取り処理結果をsendする

このとき、ネットワークが異常切断していたら、disconnectして再connectすることを求められています。

異常切断しても、ローカルのソケットが生きている場合は、sendは失敗しません。
また、FAQにあるようにecho機能を追加することもできず、既存のプロトコルを変更することも
許されていません。

FAQにあるように、pingで生存確認するしかないんでしょうか?

12:デフォルトの名無しさん
08/03/05 00:36:53
WinSockのconnectについて質問です。

POST URLリンク(aaa.bbb.jp) HTTP/1.1
したいのですが、connectすると
10060「接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。」
となってしまいます。

IEのアドレスにURLリンク(aaa.bbb.jp)を入れてやると応答があります(ボディを送っていないのでエラーメッセージしか表示されませんが)。

どうしたらconnectしてPOSTできるようになるでしょうか?
httpsだから特別なことをしなければならんのでしょうか?(その辺がわかりやすいページや本を教えてもらえると助かります。どれもhttpのGETの例ばかりで、httpsやPOSTの例がなくって。)

よろしくお願いします!

13:デフォルトの名無しさん
08/03/05 00:53:29
>>12
httpsなので特別なことをしなきゃならんです。どういうことをするかは
ここにはとても書き切れないぐらい複雑。

よく知らないけど、Windowsだったらwinsockじゃなくてwininetとかいう
ので簡単にできたりしないかな。


14:デフォルトの名無しさん
08/03/05 01:38:35
ありがとう。とりあえずwininet調べてみます!

15:デフォルトの名無しさん
08/03/05 02:07:08
>11
TCPならKeepAliveもあるし、
接続してから一定期間リクエストが来なければ切る手もあるし。

16:11
08/03/05 10:38:10
>>15
やはり、KeepAliveしかないですか・・・。

リクエストのタイムアウトは、通信間隔が非常に長くなる(24時間を越える)場合もあるため、
なかなか厳しいです。

KeepAliveに関して詳しく調べてみます。

17:デフォルトの名無しさん
08/03/05 18:31:23
>>12
URLリンク(www7a.biglobe.ne.jp)


18:デフォルトの名無しさん
08/03/06 00:44:39
機能としてのサーバが、connectを発行するという時点で
かなりオ㍗ルかんね。

19:デフォルトの名無しさん
08/03/07 02:09:24
Linux UDPでマルチキャストの勉強をしてるのですが、
recvfrom()中にifdownでネットワーク断が発生した場合、
どうやって検知すればよいでしょう?
tcpdumpではifdown直後にNetwork is down.と表示されるので
何からの方法で検知できるとは思うのですが、、

20:デフォルトの名無しさん
08/03/09 02:31:43
sendで"0123456789"という文字列を送りrecvで受信した際に

"012456789"
  ↑3が抜けてる

というような事が起こりえますか?

21:デフォルトの名無しさん
08/03/09 04:53:29
>>20
規格上は "012" "3" "456789" という IP パケットに分
割されて "3" のパケットが抜けることがあるかもしれ
ないが、一つのパケットに再構成出来ないので UDP で
はパケットロストでアプリケーションには届かないし、
TCP ならパケット再送で正しいパケットが届く。


22:デフォルトの名無しさん
08/03/09 05:19:36
>>21
レスありがとうございます
勉強になります

23:デフォルトの名無しさん
08/03/09 17:28:59
もし送信側の UDP ライブラリが何らかの理由で "012"
"3" "4567890" という具合いに三つのパケットに分割し
て、なおかつ "3" のパケットが抜ければそういう状態
になるかも知れない。

TCP 使ってればまず問題ない。

24:デフォルトの名無しさん
08/03/09 22:29:59
UDPレベルで分割送出するならともかく、
それ以下のレイヤで分割されたなら、全部
届くか届かないかでないの。

25:デフォルトの名無しさん
08/03/09 22:37:11
>>24
> UDPレベルで分割送出するならともかく、

これが > 23 で

> それ以下のレイヤで分割されたなら、全部
> 届くか届かないかでないの。

これが > 21 のつもりだったんだけど、何か変?

26:デフォルトの名無しさん
08/03/09 22:52:10
UDPはそういう分割をしないんじゃなかったっけ?

27:デフォルトの名無しさん
08/03/09 23:53:28
>>26
あー、ユーザーランドインタフェイス内部でのつもりだった。
もちろん、それが特に書かれてるのが TCP の RFC
なのはわかってるけど >>20 に環境が書かれてないんだもん。

28:デフォルトの名無しさん
08/03/10 22:47:33
>>27
お前、シッタカはタイガイニシル

29:デフォルトの名無しさん
08/03/11 00:33:03
SMTPが到達を保証できない理由を
分かり易く解説したサイトってない?

30:デフォルトの名無しさん
08/03/11 00:46:35
>>29
・SMTPを使ったメールはインターネット上のあらゆるサーバを経由して転送される
・あらゆるサーバとは、自分のあずかり知らないサーバを経由する可能性がある
・あずかり知らないサーバを経由するということは、そのあずかり知らないサーバの管理者
 がどうとでもすることができる

他にもあるが、これだけでも分かったつもりにはなれるだろ。

31:デフォルトの名無しさん
08/03/11 01:08:18
いや、そういうハナシじゃなくて
電子商取引推進協議会(ECOM)のガイドラインで
プロトコル上の欠点を示唆してるようだが、詳しい理由を解説してないから、
そこを突っ込んでいる奴を。

URLリンク(www.ecom.jp)

32:デフォルトの名無しさん
08/03/11 01:13:42
問題の文書はコレで、

第5章 通信基盤ガイドライン
URLリンク(www.ecom.jp)

>SMTP では、メールが相手に確実に届く保証がないこ
>とやデータの順次性を必ずしも保てないといったデータ
>送受信の確実性の問題がある。

33:デフォルトの名無しさん
08/03/11 01:16:33
補足:

多分ここら辺りにポイントがあると予想する。

>なお、データの送受信の確実性の確保に関しては、
>通信レベルだけの対応では不十分であり、
>アプリケーションレベルでの対応が必要である。

34:デフォルトの名無しさん
08/03/11 01:26:35
確実の定義次第じゃん・・・

35:デフォルトの名無しさん
08/03/11 01:35:22
そういうミもフタもないハナシなのかなぁ

36:デフォルトの名無しさん
08/03/11 01:38:38
>>32
当たり前のことしか書いてない。まぁメールなんて使うなってこった。

37:デフォルトの名無しさん
08/03/11 01:46:10
ちなみにいまのインターネットだって、送信したデータが*確実に*相手に
届くことなんて保証してないぞ。TCPは可能な限りの努力をするが、
届かないときはどうしようもない。

*確実*だけのキーワードだと、ダウンタイムとか冗長性とか、
障害耐性とか、コアとなるハブの存在だとか、クラスター性だとか
・・・・。

38:デフォルトの名無しさん
08/03/12 00:26:14
TCPは、届かないなら届かなかった事が判るでしょ

39:デフォルトの名無しさん
08/03/12 00:35:07
企業や学校はメールゲートウェイとかあって
メールサーバー本体と直接通信してなかったりするから
TCPソケットでエラーが出なくても届いてない可能性があるかと。

直通のftpメールなら確実だと思うけど。

40:デフォルトの名無しさん
08/03/12 12:36:31
つうかレイヤーを切り分けて考えろよ

41:デフォルトの名無しさん
08/03/12 21:52:33
相手のメールサーバから「受信した」とackが来ても、
その直後にディスクがクラッシュするかもしれないからな
確実とはいえない

42:デフォルトの名無しさん
08/03/12 22:06:50
なにいってんだこいつ

43:デフォルトの名無しさん
08/03/13 04:49:20
>31が「エスパーキボンヌ」にしか見えないのは気のせい?

SMTPプロトコルの欠点だけ論うなら、
 bounceが存在する
  ->エラー通知が10年後に届いても文句言えない
   ->確実性✕
なんて部分があるな。

44:デフォルトの名無しさん
08/03/19 23:41:34
サーバ側KEEP-ALIVEの一回の接続で処理出来るリクエスト数が30で
一つのページに使われているインラインコンテンツが30以上あった場合
これらをダウンロードするためには
もう一回接続する必要がありますか?

45:デフォルトの名無しさん
08/03/19 23:54:54
そりゃそうだろう

46:デフォルトの名無しさん
08/03/22 21:06:10
どんなネットワークプログラム作ったらいいかわかりません
どうしたらいいですか?

47:デフォルトの名無しさん
08/03/22 21:24:16
>>46
特に何か作る必要がないのなら、別に何も作らなくていいのでは?

48:デフォルトの名無しさん
08/03/22 22:16:48
>>46
文字列を入力したらもう一方の端末でその文字列を表示するというのをソケットを使って作成しましょう

49:デフォルトの名無しさん
08/03/26 09:51:42
組み込みlinux機器向けにC言語ベースの簡易httpクライアントを作成しています。
ヘッダの読み取りに、1行ずつストリームから取得するという処理を
書いているのですが、1文字ずつrecvして、\r→\nのパターンが
来るまで繰り返す、という方法はありなんでしょうか?
他に何か良い方法はあるでしょうか。


50:デフォルトの名無しさん
08/03/26 10:19:15
ありだと思うけど、\r\nを返さないサーバもあるから気を付けてね。

51:デフォルトの名無しさん
08/03/26 10:23:39
一応ソースコードです。改行制限キツイですね。
// 1行読み取り,改行を含む長さを返す,バッファに入りきらない場合はnul終端文字列の長さ
int readline(int sd, char *buf, int bufsize) {
int rlen = 0, wlen = 0, cr = 0;
char ch;
for (;;) {
int r = recv( sd, &ch, 1, 0 ) ;
if (r < 0) {
fprintf(stderr,"readline:error r < 0\n");
return r;
} else if(!r) {
fprintf(stderr,"readline:warning !r\n");
break ;
}
if (ch == '\n') {
if (!cr)
fprintf(stderr,"readline:warning !cr\n");
if (rlen < bufsize) buf[wlen++] = ch;
rlen++;
break;
} else {
cr = (ch == '\r') ? 1 : 0;
if (rlen < bufsize) buf[wlen++] = ch;
rlen++;
}
}
if (wlen>=bufsize)
wlen--; // nul終端文字列になるように調節
buf[wlen] = 0;
return wlen;
}

52:デフォルトの名無しさん
08/03/26 10:33:06
>>50
ありがとうございます。
自分でバッファリングしてくこと考えたら
頭痛くなってきたので。
\rはオプション扱いに致します。

53:デフォルトの名無しさん
08/03/27 12:31:48
初心者向けの本は何を買ったらいいんですか?

54:デフォルトの名無しさん
08/03/27 16:03:57
NAT越えって、まだ個人がおいそれと実現できる領域じゃないのかな?
ゲーム作ってて、NAT越えできたらなぁとよく思うんだけど・・・

55:デフォルトの名無しさん
08/03/27 21:09:58
>>54
TCPで接続張ってしまえば、自由に通信できるよ。最初の
接続元はNATの内側から出ないといけないけど。

ゲームなら別にそれでもいいでしょ。

56:デフォルトの名無しさん
08/03/27 22:46:39
>>1
まだftpか。httpまであと何年かかるかな。

57:デフォルトの名無しさん
08/03/28 08:56:49
>>55
>最初の接続元はNATの内側から出ないといけないけど。

意味ねーじゃんw

58:デフォルトの名無しさん
08/03/28 10:30:09
>>55,57
質問者の54です。ちょっと意味がわからないのですが、NAT越えとは以下のことができる技術という認識であってるでしょうか?

AとBは、両方ともルータの中の人間。直接やりとりは普通は無理。
Cというサーバーに、AもBも通信を行なう
Cが、AとBをうまく結びつける
AとBが直接やりとりできるようになる(Cを経由しない!!) ←NAT越え!

これができると、マッチングサーバーCはほとんど負荷無く運営できて良いのですが。
NintendoDSのWIFI対戦も、この仕組みだと聞いております。

このCサーバーを構築する方法は、個人で気軽に手の届く技術でしょうか?
(どうやら、それをツールとして売り出している企業はあるようなのですが)

59:デフォルトの名無しさん
08/03/28 10:53:25
UDP Hole Punching ってのもあったような

60:デフォルトの名無しさん
08/03/28 11:05:36
UDP Hole Punchingは「あまりセキュリティーに力を入れていないルータ」しか乗り越えられないようなのと
具体的ソースを提示しているサイトが見当たらないことが
TCPをUDPに切り替える足かせになっているような気がします。

概念はわかりやすいものなので、実験環境があればテストは簡単そうです。
この土日にでもテストしてみたいと思います。

他にも何か情報があれば嬉しいです。
NAT越えは面白い分野ですが、ム板では盛り上がっていないようなので…

61:デフォルトの名無しさん
08/03/28 11:16:39
初心者も簡単にNAPT設定ができれば、たいした問題にはならんのに
なんで用語とか各メーカーばらばらなんだか・・

62:デフォルトの名無しさん
08/03/28 11:35:02
今となってはUPnPでよくね?
UPnP対応ルータじゃないルータって、いまどき売ってるかね?

63:デフォルトの名無しさん
08/03/28 13:34:36
>>62
だね。きちんと整備されたライブラリ使えば、socketでlistenするのと、
UPnPでポート割り当てるの同感覚。特定のポート番号使えるのが、NAT内の1台だけだって制限があるけど。

64:デフォルトの名無しさん
08/03/28 14:26:22
54です

恥ずかしながら、初めてUPnPというものを知りました。
これは素晴らしい技術ですね。
早速サンプルソースも手に入れましたので、実験してみたいと思います。
ありがとうございました。

>>63
もしよろしければ、きちんと整備されたライブラリ~というものの例をいただけるとありがたいです。
とりあえず
URLリンク(www.bosuke.mine.nu)
ここを参考に組んでみようと思います。

余談ですが、今たまたまGoogleで色々調べていたら、ここの前スレで同じサイトを参考に組もうとしている人を発見しましたw

65:デフォルトの名無しさん
08/03/28 15:30:45
UPnPもSTUNもルータに激しく依存するから結局繋がらない場合は繋がらないけどな。
UPnPも最近になってやっと危険性が認知されてデフォでoffになったりしてるし。
URLリンク(jvn.jp)
URLリンク(internet.watch.impress.co.jp) cda/news/2008/01/17/18149.html

66:デフォルトの名無しさん
08/03/28 16:47:43
Flashの通信機能を遮断する方法がわからないんだよなー

67:デフォルトの名無しさん
08/03/28 18:25:28
>>60
RFC3489の"5. NAT Variations"あたりを見てみたら?
UDP Hole PunchingできるのはFull Coneだけでしょう.
たしかI-Dのどれかに,どの機種がFull Coneかのリストが載っていたような

>>65
TURNを作れば? :-)

68:デフォルトの名無しさん
08/03/28 22:28:43
NGN普及して、IPv6デフォルトになればNAPTなぞ過去の技術になる。

69:デフォルトの名無しさん
08/03/29 07:01:44
>>68
NAPTは遺物となってもFWは残る

70:デフォルトの名無しさん
08/03/31 04:51:24
かなり初歩的なことをお聞きしますが、プロキシサーバーというものは送られてきたメッセージを直接ホストに送信するだけでよいのでしょうか?

71:デフォルトの名無しさん
08/03/31 10:23:37
駄目

72:デフォルトの名無しさん
08/03/31 12:14:16
>>70
proxy serverといってもいろんな種類があるが何のプロトコルのproxy?

73:70
08/03/31 13:11:11
>>72
HTTPプロトコルです

74:デフォルトの名無しさん
08/03/31 13:22:48
>>73
代表的なのは、
・ メソッドに書かれてる URL から正しくホストに接続する
URLリンク(www.example.com) みたいな URL をホスト接続時は /path1/path2.html に変換する
・ プロキシ特有の環境変数を付加する (必要な場合)
・ CONNECT メソッドを正しく解釈する (CONNECT 以降はそのままデータの送受信を行う)
辺りかな。 RFC などのドキュメントを見るのが一番手っ取り早いとは思うが。

75:デフォルトの名無しさん
08/03/31 13:27:01
>>73
http proxyはちゃんと作るとかなり複雑だが、少くともリクエスト内容は書き換えなきゃいけないだろ。
あとは、HTTP/1.0/1.1の場合分けとかKeepAliveとかpipelineとかchunkとか100 Continueとか、
真面目にやりだすと結構大変。

とりあえずRFC2616嫁

76:70
08/03/31 13:35:09
>>74-75
レスありがとうございます
RFCのドキュメントを読んでみることにします

77:デフォルトの名無しさん
08/03/31 13:37:56
まぁ、読んでもわかんないと思うけどね・・・

78:デフォルトの名無しさん
08/03/31 13:39:24
>>77
そないなことあらへんで。

79:デフォルトの名無しさん
08/03/31 13:44:17
内容を理解できないということじゃなくて、proxy serverの構成要件とは何かがわかんないだろうって意味

80:デフォルトの名無しさん
08/03/31 13:47:37
>>79
あ、なるほど。

81:fxで裁判中。教えて
08/04/03 08:29:02
外国為替証拠金取引会社のアトランティックトレードと裁判になりました。

裁判の内容をここに記してみました
システム障害等でくわしいかた、是非とも情報をお待ちしております。
よろしくお願いします。
  URLリンク(members3.jcom.home.ne.jp)


82:デフォルトの名無しさん
08/04/04 00:49:43
>>68
そのNGNがv6マルチプレフィクス問題で、やっぱNAPT使うか?とも言われている件。

83:デフォルトの名無しさん
08/04/09 11:10:34
プロトコル定義するときに 「最初のグリーティングはクライアントから出させる事」 みたいな
一般論的なセキュリティ上の推奨をどこかで見たようながあったような気がするんだが、
これって単に攻撃のための情報を減らす目的でしたかね?

何かそういった鉄則集みたいなのを 10 年くらい前にどこかで見たような記憶があるんですが
どこかご存知ないですか?

84:デフォルトの名無しさん
08/04/12 11:31:55
簡単なオンラインゲーム(MMO)を作ろうと思うのですが、
無料のデータベースであるMySQLかSQLServer2005Expressを使おうと思ってますが
おすすめのものとその理由など教えていただきたいです。

85:デフォルトの名無しさん
08/04/12 11:35:23
日本語でおk

86:デフォルトの名無しさん
08/04/12 12:00:58
>>84
スレ違い以前に板違いだぞ、DB板かゲ製行ってくると良い

87:デフォルトの名無しさん
08/04/12 13:32:10
>>86
いってきます

88:デフォルトの名無しさん
08/04/12 17:05:47
Winsockを使って相手サーバがKEEP-ALIVEに対応しているか確かめる方法はありますか?

89:デフォルトの名無しさん
08/04/12 17:07:23
投げてみて、その反応をさぐるしかない。

90:デフォルトの名無しさん
08/04/12 18:39:30
>>89
投げてみました。
ApacheではKEEPALIVEがOffにされていた場合
Connectionがcloseとなっています。
closeであるかないかで判定しようと思うのですが、
どうでしょうか?

91:デフォルトの名無しさん
08/04/12 18:41:43
HTTP かよ。
Connection: close ならエンティティボディ送信後に切断だよ。
RFC 嫁。persistent connection でググレ

92:デフォルトの名無しさん
08/04/12 21:35:08
Connection(小文字)がCONNECTION(大文字)で返ってくるサーバはありますか?

93:デフォルトの名無しさん
08/04/12 21:40:22
いいからRFC読めよ

94:デフォルトの名無しさん
08/04/12 21:44:06
>>93
ウラル貼ってくれ

95:デフォルトの名無しさん
08/04/12 21:54:17
>>93
URL貼って下さい

96:デフォルトの名無しさん
08/04/12 21:56:35
URLリンク(www.google.co.jp)

97:デフォルトの名無しさん
08/04/12 21:59:34
>>96
いや、
RFCの何番?

98:デフォルトの名無しさん
08/04/12 22:03:28
だからみりゃわかるだろ低脳。
そもそも>>1に「関連リンク云々」書いてあること読めないか?

99:デフォルトの名無しさん
08/04/12 22:16:56
>>98
いや、
だからHTTPヘッダが大文字で返ってくるサーバとかあるのか、
って聞いてんだよ

100:デフォルトの名無しさん
08/04/12 22:21:10
あるだろうなぁ。

101:デフォルトの名無しさん
08/04/12 22:26:46
>>100
ありがとうございます。

102:デフォルトの名無しさん
08/04/12 22:57:12
規定してなきゃ存在するとみなすのが当然じゃん。
その規定が書いてあるのがRFCなんだけど。

103:デフォルトの名無しさん
08/04/12 23:05:57
>>102
素で意味がわからん。

104:デフォルトの名無しさん
08/04/12 23:30:50
>>102
規定してあるよ。おまいがよく読めw

105:デフォルトの名無しさん
08/04/13 00:09:31
何もないと思うが。

106:デフォルトの名無しさん
08/04/13 00:49:58
>>105
URLリンク(www.studyinghttp.net)
4.2 メッセージヘッダ
一般ヘッダ (section 4.5)、リクエストヘッダ (section 5.3)、レスポンスヘッダ (section 6.2)、エンティティヘッダ (section 7.1)
各フィールドを含む HTTP ヘッダフィールドは、RFC 822 [9] の Section 3.1 で与えられているものと同じである共通のフォーマットに従う。
それぞれのヘッダフィールドは、名前、その後にコロン(":")、そしてフィールド値から成る。
フィールド名は、大文字・小文字を区別しない。

「大文字と小文字を区別しない」

107:デフォルトの名無しさん
08/04/13 00:54:11
>>106
そりゃRFCだろ。

108:デフォルトの名無しさん
08/04/13 01:00:51
変な流れになってるなぁ。

109:デフォルトの名無しさん
08/04/13 09:39:25
どうみても同一人物だろ・・・
言い返されたからってムキになるなよ(;´Д`)

110:デフォルトの名無しさん
08/04/13 10:10:40
迷子のキムチさん
出て行ってください

111:デフォルトの名無しさん
08/04/19 21:15:07
Keep-alive使ったサンプルコードってあります?
Winsockで

112:デフォルトの名無しさん
08/04/19 21:46:27
一週間ぶりですね

113:デフォルトの名無しさん
08/04/19 22:11:14
Linux用に作成したソケット通信アプリのテストにtcpdumpを使いたいのですが
アプリが送受信しているデータの表示方法がなかなか分かりません。

tcpdump -s 1600 -X tcp port 1024

と打った上で、アプリに送受信させるとデータが含まれたパケットの中身が
バイナリで表示されますが、アプリが送受信しているデータだけ表示させる
方法はないでしょうか?
どなたか教えてください。よろしくおねがいいたします。

114:デフォルトの名無しさん
08/04/19 23:17:37
>>113
つwireshark

115:デフォルトの名無しさん
08/04/19 23:52:33
X環境入れてないのです(;_;)

116:デフォルトの名無しさん
08/04/20 03:30:50
>>112
……(´・ω・`)

117:デフォルトの名無しさん
08/04/22 14:58:59
最近ネットプログラミングはじめたのですが、
よくサーバはクライアントのパケットを信用してはいけないと書かれていて、
逆にクライアントはサーバのパケットを信用して良いのでしょうか?


118:デフォルトの名無しさん
08/04/22 15:21:33
クライアントが、信用できないサーバ (不特定多数のサーバ) と通信する可能性があるなら、信用してはいけない。
信用できるサーバとしか通信しないなら信用してもいいかもしれないが、
信用できないという前提で組む方が、サーバに何かバグがあったり、
通信の改ざんを受けたり、なりすましサーバに当たったりしたときに、安全でいいと思うよ。

119:デフォルトの名無しさん
08/04/22 17:24:53
>>118
なるほど、ありがとうございます

120:デフォルトの名無しさん
08/04/22 17:28:58
送るときは厳格に、受ける時は寛容に、はネットワークプログラミングの基本。

121:デフォルトの名無しさん
08/04/22 22:03:41
受けるときも厳格に、が基本だよ

122:デフォルトの名無しさん
08/04/22 22:30:16
読解力が試されます

123:デフォルトの名無しさん
08/04/23 06:22:28
プロセス間通信用にソケットを使う場合、
どういう取り決めにしてますか?
自分はhttpと同じで、行単位で空改行までを
送受信単位にして、必要ならオプションの
バイナリデータが続く、という感じにしてますが。
いきなりバイナリでやりとりするのは
データ構造決めるのが面倒なんで。
何か既成のモデルがあったらいいんですが。

124:デフォルトの名無しさん
08/04/23 09:41:10
xml-rpcとか?

125:デフォルトの名無しさん
08/04/23 10:24:29
シンプルなバイナリなら TLV
任意長バイナリは GIF っぽくサブブロック化

126:デフォルトの名無しさん
08/04/23 15:46:48
>>121
受けるときは寛容に、が基本。

URLリンク(tools.ietf.org)
> In general, an implementation must be
> conservative in its sending behavior, and
> liberal in its receiving behavior.


127:デフォルトの名無しさん
08/04/23 16:09:50
>>123
俺の長い組み込み経験からのアドバイス。

1.レイヤを定める。下位レイヤは上位レイヤのデータ
 構造を知らなくてもやり取り出来るようにする。バイ
 ナリ←→プログラムデータの変換部分との間にユーティ
 リティ的なレイヤがあると便利。

2.最初に「バイト長」とか入れない。これをやられる
 と送信側でデータが揃わないと送出開始出来なくなる。
 仕事でこういうプロトコル決めてる奴を見ると殺意が
 芽生える。

3.1や2を実現するために、たとえバイナリでもエス
 ケープ文字を用意する。俺が良く使うのは SLIP のエ
 スケープ(昔仕事で使ったから)。下位レイヤでデー
 タやコマンドの開始/終了などを用意する。読む側の
 下位レイヤで「開始」が来たら読んでる途中のものを
 全部破棄して例外を投げるように(初期状態 read で
 catch するように)すると、通信相手のバグその他で
 変な状態に陥っても元に戻ることが保証出来る。


128:デフォルトの名無しさん
08/04/23 16:23:06
>>127
あんまり殺気たてんでくれ。
俺の20プロダクト中16回コロされてる事になる。

129:デフォルトの名無しさん
08/04/23 18:21:40
俺はパート長は入れるね

130:デフォルトの名無しさん
08/04/23 18:40:40
任意長のフィールドは 1 バイトのブロック長と続く最大 256 バイトのデータブロック。ブロック長 0 が終端。
GIF と PNG のフォーマットは通信用データ構造のお勉強に最適。

131:デフォルトの名無しさん
08/04/23 20:35:39
>>127
>2.最初に「バイト長」とか入れない。

が、なぜ以下のようになるのかまったく意味不明。

>これをやられると送信側でデータが揃わないと送出開始出来なくなる。

データそろえて送信したところで、ネットワーク上で何バイトずつ
受信側に届くかなんて何の保証もないわけで。そろえて送る
理由がまったくない。

132:デフォルトの名無しさん
08/04/23 20:46:19
>>131
127 じゃないけど、何を言ってるか分からないのは君だけだと思うよ。

133:デフォルトの名無しさん
08/04/23 22:27:05
俺もわからん。RAW SOCKETの話?
データ長は,送るものが先に決まるならプロトコルとしてはありかもしれないが、
エスケープ文字を入れて区切りの失敗を見つけるぐらいならソケット閉じてしまったほうが早いのでは?
むしろUDPで自分で順番を制御するとか。

134:デフォルトの名無しさん
08/04/23 22:38:11
ヒント:組み込み屋さん


135:デフォルトの名無しさん
08/04/23 22:53:03
組み込みでハードウェアがらみな制限付きで、バッファの制限もついてるからかな?
DLNAとかではHTTPベースでchunked encodingとかあったが、あれは、ストリーム送信用に送信開始時にデータ長が不定だったからだが。
ほかもそんなことが多いのかな?

136:デフォルトの名無しさん
08/04/23 23:09:21
内容検証用の MD5 ハッシュも全体を走査してみないと決定できないし。そういう情報を先頭に
持ってこられると、XSL の処理結果や BLOB を垂れ流したい場合は一度ファイルか何かに
落とさなきゃいけないからかなり不便。

137:デフォルトの名無しさん
08/04/23 23:13:02
時代は組み込みだからな。

データ全体を収めるバッファを用意するなんてありえない。

数KBさえ無駄にできない。

お前らはこういう基本すらわかってないんだな。

138:デフォルトの名無しさん
08/04/23 23:59:50
すみません教えていWINSOCKでPROXY対応なんですが
リクエストヘッダーへ
Proxy-Connection: keep-aliveも
Connection: Keep-Aliveも指定しているのですが
PROXYがサーバー間の接続を勝手に切ってしまいます
クライアントー>PROXYの接続は維持しています
サーバー側のエラーコードは10054を示しています

サーバーからのレスポンスはしっかり帰ってくるのですが
直後に切られます。 なんで?

リクエストはPOSTなんですが これって正常動作?

139:デフォルトの名無しさん
08/04/24 00:04:51
別に組み込みに限った話じゃないと思うが、システムの
時間ボトルネックが何処かを考えれば自明。

どうがんばっても通信速度以上のスピードでは送れない
んだから、なるべく早く送信開始して、バッファアンダー
ラン(タイムアウトによる PUSH とか)にならないよう
にバッファに詰めていければ一番効率が良い。

とはいえ最近は下手するとディスクの方が遅かったりす
るからなー。

>>136
> 内容検証用の MD5 ハッシュも全体を走査してみないと決定できない

送信時は送信しながら計算して最後に付加すればいいん
だけど、受信は受信しながらオブジェクト作っても合致
しないときに破棄する必要があるんで面倒なんだよな。


140:デフォルトの名無しさん
08/04/24 00:09:05
正常ではないな。
プロキシがサーバとの接続を維持する気がないなら Keep-Alive でリクエスト出したらいかん。
多分プロキシ実装が Persistent Connection に対応していないし、リクエストヘッダも何も考えず
素通りさせてるだけだと思うが。

141:デフォルトの名無しさん
08/04/24 00:13:59
受信時は一定容量ごとのMD5でいいんだが、それよりファイル保存時にディスクアクセスを早くしようとして、
受信サイズの最後尾までファイルを拡張してから受信を開始すると途中で中断したときにある個所から後ろがごみデータが充填するんだが、
ファイルIOで一定サイズ移行のデータを削除してファイルサイズを小さくするって言う命令が無いために、ファイルを拡張すること自体が駄目何だよねぇ。
どこかに有効なファイルサイズを別に保存すればいいんだが、管理ファイルが散乱するので避けたいのだが、いい方法は無いものか。

142:デフォルトの名無しさん
08/04/24 00:16:39
>>140ありがとうございます
ただ、PROXYは定番どころのSQUIDをデフォルトで
使用しています。 レスポンスヘッダーがおかしければ
クライアントにデーターが届かないはずなんですが・・・
困ってます。

143:デフォルトの名無しさん
08/04/24 00:40:33
>>141
?
PC 程度以上の OS のファイルシステムなら (ANSI 標準じゃないにしても) 大抵用意されてるんじゃないか?
URLリンク(www.linux.or.jp)

>>142
よく知らんけど Squid が HTTP/1.0 互換モードで動いてるとか。

144:デフォルトの名無しさん
08/04/24 00:41:55
#include<stdio.h>
void main(void)
{
int a,b,c;
printf("数字を入力してください\n");
scanf("%d",&a);
printf("数字をまた入力してください\n");
rewind(stdin);
scanf("%d",&b);
printf("数字をまたまた入力してください\n");
scanf("%d",&c);

if(a == b == c)
printf("等しいです,\n");
else
printf("等しくないです,\n");
}


これでa==b==cだったら"等しい"と表示させるように組んでるのに 1、1、1以外の数字は入力してもは全部"等しくないです"になるのは
なんででしょうか?

145:デフォルトの名無しさん
08/04/24 00:44:52
>>144
スレリンク(tech板)
でどうぞ。

146:デフォルトの名無しさん
08/04/24 00:50:11
>>144
スレ違いだけど
君が参考にしてるものは信用しないほうがいい

147:デフォルトの名無しさん
08/04/24 00:58:41
>>143
たしかにSquidが吐き出すヘッダーは 1.0になっています
調べてみます。

148:デフォルトの名無しさん
08/04/24 02:08:49
非同期に双方向でイベント通信するためのプロトコルって何かある?
できれば 1:1 じゃなくて中継サーバかました n:n で使える奴。

149:デフォルトの名無しさん
08/04/24 02:38:39
>>148
TCP


150:デフォルトの名無しさん
08/04/24 03:12:13
>>149
もう一層上で。

151:デフォルトの名無しさん
08/04/24 03:48:09
>>150
2ちゃん

152:デフォルトの名無しさん
08/04/24 05:17:26
SIP

153:142
08/04/24 05:33:32
自己レスです
公開PROXYでテストしたところうまくいきました
また、ぐぐったところ SQUIDはHTTP/1.1をHTTP1.0に
勝手に変換する事がわかりました
(ヘッダーは別としてかといってPROXY側から切断するので???ですが)
これ以降は板違いですので移動します m(。。)m

154:デフォルトの名無しさん
08/04/24 07:10:52
>>143
ありがとう。知らなかったよorz
少しぐぐって、winだと_chsizeや下のサイトがあった。
URLリンク(www.void.in)

ANSIの関数全て読んだのは93年だったがそのころからあったのかな・・・・

155:デフォルトの名無しさん
08/04/24 23:26:33
winsock2でパケットキャプチャモジュールを作成したのですが、
プロミスキャスモードにしないと何もパケットを受信しません。
自分宛のパケットだけキャプチャしたいのでプロミスキャスモードは使用したくないのですが
プロミスキャスにしなくてもパケットを受信する事は出来るのでしょうか?

156:デフォルトの名無しさん
08/04/25 23:31:22
バイト長いれるなって話がまったくわからん。
カイヤでstartとか送って、endが届くまでバイナリが続くとかにすればいいの?

157:デフォルトの名無しさん
08/04/25 23:32:45
s/カイヤ/下位レイヤー/;

158:デフォルトの名無しさん
08/04/25 23:47:02
下位の部分を作るときに、アプリ(上位)側が全部を用意し終るまで出力を開始できないってことだろう。

例えばディスクへアクセスするドライバを書くときに、
ファイルのサイズが判明するまでHDDに書き込めない(領域を確保出来ない)ようだとやりにくくて仕方が無い、
というような話だと思う。たぶん。

159:デフォルトの名無しさん
08/04/25 23:49:35
あ、例えが悪いな。
HDDのドライバじゃなくてファイルシステムの造りの方が適切だな。

160:デフォルトの名無しさん
08/04/26 00:24:08
>>156-157
尻にしかれた某芸能人の事かとオモタ


161:デフォルトの名無しさん
08/04/26 17:04:22
>>130
> GIF と PNG のフォーマットは通信用データ構造のお勉強に最適。

画像フォーマットはツールが知らない種類のチャンクを読み飛ばせるように
バイト長が入ってる。通信の為じゃない。


162:デフォルトの名無しさん
08/04/26 17:07:24
>>161
インタレースも知らないのか?

163:デフォルトの名無しさん
08/04/26 17:07:33
>>161
ま、確かにそうなんだけど、GIFはCompuServe由来だし、PNGはPortable Network Graphicsだから、通信用である事も意識していたと思うよ。

164:デフォルトの名無しさん
08/04/27 14:03:53
>>161
思いっきり局部しか見てませんて感じのレスだな。

165:デフォルトの名無しさん
08/04/28 10:45:56
OSPFにしろ、BGPにしろ、RSVPにしろ、そもそもIPからしてペイロード長先付けだろ。
データがそろわないと、長さが書けないから送信できず、バッファが要る、ってのは、
可変長データならチャンク化すれば済むこと。
固定長データなら、バイト列にエンコーディングするレイヤよりも上のレイヤが先にデータ長を宣言すれば済む。


166:デフォルトの名無しさん
08/04/28 10:47:38
長い組み込み経験からのアドバイスなんだぜ?

素直に聞けよ。

167:デフォルトの名無しさん
08/04/28 14:00:03
臨機応変
適材適所
一長一短

168:デフォルトの名無しさん
08/05/06 07:23:41
IP のパケットサイズって最大 64kB だと思うんだけど、イーサなんかの
MTU の 1,500B とかっていうサイズは、IP パケットがさらにその下のレイヤーで
分割されているということですかね?

169:デフォルトの名無しさん
08/05/06 09:36:31
IP fragmentation でヤフれ

170:デフォルトの名無しさん
08/05/06 14:49:23
IPスタックが、下層から最大送出可能な
パケットサイズをもらってきておいて、
IPパケットを送出する際に分割するような

171:デフォルトの名無しさん
08/05/06 15:32:52
>IP のパケットサイズって最大 64kB
これも実装依存だそうだ

172:デフォルトの名無しさん
08/05/06 17:14:11
ヘッダの長さフィールドが16bitってだけでそ

173:デフォルトの名無しさん
08/05/07 23:22:32
selectで
PULLHUP相当のエラーって感知できますか?
大人しくpull()った方がいい?

174:デフォルトの名無しさん
08/05/08 04:11:09
pullじゃなくてpollでggr

175:デフォルトの名無しさん
08/05/08 22:18:04
select失敗した場合ってFD_SETって
どうやって処理すればいいの?

単純にクリアするだけでおk?

176:デフォルトの名無しさん
08/05/09 04:03:10
おれはそういうの気にしないために、
fdsetは呼ぶ前にコピーして、そっちをselectに掛けてる。
コピーに変更があったら手動でオリジナルを更新。
何かのサンプルの真似だけど。

177:デフォルトの名無しさん
08/05/09 04:08:31
sshでログインしてるとき小さいファイルを向こう側へもっていきたいんだけど
わざわざFTPとか起動するの面倒なときっていい方法ありますか?

178:デフォルトの名無しさん
08/05/09 04:20:04
ssh ファイル転送
でggr

179:デフォルトの名無しさん
08/05/09 05:04:50
こっち側がwindowsの場合はどうすればよいでしょうか?
たとえばpoderosaを使ってる場合。

180:デフォルトの名無しさん
08/05/09 11:39:53
scp

181:782
08/05/10 21:29:28
linux版より誘導されてきました
よろしくオナガイシマス
linuxでの実装、通信関連の実装の経験の無い未熟ものです
URLリンク(www.katto.comm.waseda.ac.jp)
linux TCPサーバー側
という部分のコードをコンパイルしているのですが、
accept()システムコールのこの部分で
dstSocket = accept(srcSocket, (struct sockaddr *) &dstAddr, &dstAddrSize);
error: invalid conversion from \342\200\230int*\342\200\231 to \342\200\231 socklen_t\342\200\231
と怒られています
どうしたら怒られなくなりますか

コンパイラは gcc-4.1.2-33です

182:デフォルトの名無しさん
08/05/10 21:31:40

名前 782
スマン間違えてシマイマスタ

183:デフォルトの名無しさん
08/05/10 22:55:30
プログラムに2バイト文字使ってる?

184:デフォルトの名無しさん
08/05/10 23:04:14
>>183
コメント文で2バイト文字を使っていますが
ソースコードでは使っていません


185:デフォルトの名無しさん
08/05/10 23:09:43
>>181
dstAddrSize が socklen_t ではないっていう型エラーでは? int で宣言してない?

186:デフォルトの名無しさん
08/05/10 23:50:33
>>185thx
>>tAddrSize が socklen_t ではないっていう型エラーでは? int で宣言してない?
ビンゴでした、socken_t型で宣言したら、エラーが消えました
後、
#include <string.h>
#include <unistd.h>
を追加し
int status;
も追加し
gcc tcp_serv.c -lsocket
とコンパイルすると

/usr/bin/ld: cannot find -lsocket
collect2: ld はステータス 1 で終了しました
となっ てしまいました・・・・・

187:デフォルトの名無しさん
08/05/10 23:55:06
-lsocket 不要

188:デフォルトの名無しさん
08/05/11 00:01:30
>>187
どうも、そのようですね
HPが古いのでコンパイラのバージョンが違うから、こんなにエラーが出たのだと思います
g++ tcp_serv.c -o tcp_sev
でコンパイルに成功しましたが
Waiting for connection ...
のままなのですが、これで成功なのでしょうか?
クライアントと接続したらこのメッセージは消えるものなのかな・・・・?

189:デフォルトの名無しさん
08/05/11 00:03:43
スマソ
gcc tcp_serv.c -o tcp_sev
でした

190:デフォルトの名無しさん
08/05/11 00:23:28
クライアント側も作成して 127.0.0.1 で接続するのだ。

191:デフォルトの名無しさん
08/05/11 10:05:45
>>190
>>181です
thx
HPのコードを修正して、今しがたserverとclientの、実行ファイルを、同一PC内ですが起動して
Wiresharkでパケットが流れているのを確認シマスタ
今書いているPCの他に後2台Windows XPとFedora Core 8が繋がっているので
このサーバーで対戦型のオセロゲームでも実装してみようと思います^^
一応C++使い(MFC)なのでWindows側の実装は難しく無いんだけど
linuxのシステムコールやAPIの使い方を知らないのが痛い・・・・orz
とりあえずMFCでいう処の、GetKeystate()関数のような、linuxでのキーボード入力のAPIが知りたい

192:デフォルトの名無しさん
08/05/11 10:29:13
>>191
select() が使えませんか?

193:デフォルトの名無しさん
08/05/11 10:43:50
>>192thx
>>191です
なるほど、キー入力の前に接続方法を、再考する必要がありますね
複数のclientが、ぶらさがるサーバの場合、acceptシステムコールや、recvシステムコールをコールして実行してして
一旦、接続行われるとsocketをcloseするまでは、他からのリクエストが受けれなくなりますね・・・・orz
そこでselect()システムコールの出番ですね、ちょいと調べてみます。


194:デフォルトの名無しさん
08/05/11 10:48:30
ブロックするのがいやならソケットをノンブロックにしても良い。
MFCの糞ソケットクラス使ってるとこの辺の感覚が分からんかも。

195:デフォルトの名無しさん
08/05/16 00:09:14
WinSock2を使用して特定用途のTCP/IPサーバをCで作ろうとしていますが、ポート番号の自動割り振りでハマっています。
抜粋したコードは以下のとおりです。

WSADATA wsaData;
int len;
static SOCKET serverSocket;
static struct sockaddr_in addr;
if (WSAStartup(MAKEWORD(2, 2), &wsaData)) return -1;
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == INVALID_SOCKET) return -1;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = INADDR_LOOPBACK; // ★ループバックアドレスを設定
addr.sin_port = htons(0); // ★ポート番号の自動割り振り
bind(serverSocket, (struct sockaddr *)&addr, sizeof(addr));
len = sizeof(addr);
getsockname(serverSocket, (struct sockaddr *)&addr, &len); // 自動的に割り振られたポート番号を取得
printf("%s\n", addr.sin_port); // 0が出力される
listen(serverSocket, 1);

getsocknameを行った後でaddr.sin_portに割り振られたポート番号が入っていることを期待するのですが、WinXP+VC7.1では0になっています。
手順がどこか悪いのでしょうか?

196:195
08/05/16 01:04:52
>>195
自己レスです。

addr.sin_addr.S_un.S_addr = INADDR_LOOPBACK; // ★ループバックアドレスを設定

addr.sin_addr.S_un.S_addr = htonl(INADDR_LOOPBACK);
↓もしくは
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

でした。
また、addr.sin_portは使うときにはntols(addr.sin_port)としてやる必要がありました。

197:デフォルトの名無しさん
08/05/25 08:38:08
こんにちは。
winsock、TCP/IP非同期の、ゲーム用のチャットを作ってます。
クライアントからサーバーにチャット文が届いたらfor文で回して
各クライアントのソケットにsendしているのですが、
(for(i=0,i<MAXCLIENT,i++) send(socket[i])みたいな感じです)
この方法だとユーザーが少ないうちはいいのですが、
ユーザー全体数が150人くらいになると重くなります。
少しタイムラグがあって届くみたいな感じです。
どうすれば解決するでしょうか?
よろしくお願いします。

198:デフォルトの名無しさん
08/05/25 09:03:57
サーバーのCPUがマルチコアなら、マルチスレッド使うと早くなるよ

199:デフォルトの名無しさん
08/05/25 10:19:33
IPv6のサーバーサイドのプログラムが見つかりやせん

200:デフォルトの名無しさん
08/05/25 10:21:43
>>197
UDPにする

201:デフォルトの名無しさん
08/05/25 10:49:35
>>197
ノンブロッキングにする

202:デフォルトの名無しさん
08/05/25 13:25:46
その問題はノンブロックにして解決するの?

203:デフォルトの名無しさん
08/05/25 13:28:48
マルチキャスト

204:デフォルトの名無しさん
08/05/25 14:40:10
俺は2000クライアントにマルチキャストするプログラム書いたが
そんなに気になるラグはなかったぞ。多くても150msくらいの遅延しかない。
プログラム的に問題あるんじゃない?TCPでもsendにそんなに時間かかるって事はないと思うけど・・・
送信するデータのサイズにもよるけどね。

205:デフォルトの名無しさん
08/05/25 14:51:07
単純な foreach (clients) { client->send(data); } のとき
一匹でも激遅クライアントがいると
そこでsendが糞詰まりを起こして全体が遅くなる

206:デフォルトの名無しさん
08/05/25 15:06:04
え、send()って、相手に到着しないと抜けないの?

207:デフォルトの名無しさん
08/05/25 15:56:12
tcp送信バッファが満杯になればblockする

208:デフォルトの名無しさん
08/05/25 20:13:36
なんでn回ユニキャストする発想になるのか。

209:デフォルトの名無しさん
08/05/25 20:29:59
そりゃmulticast/boardcastを知らないからだろjk

210:デフォルトの名無しさん
08/05/25 23:18:00
boardcastは俺も知らない。

211:デフォルトの名無しさん
08/05/26 00:33:39
TCPはmulticastできないみたいです。。。
for文じゃなくてマルチスレッドにするといいのかな?
どうも同じような気がするのですが、一応やってみます。

212:デフォルトの名無しさん
08/05/26 02:11:21
くだんのスレがアフォなのはどうでもいいが、150ms遅延「しかない」
とかもう救いようがないな。

213:デフォルトの名無しさん
08/05/26 03:31:04
キューを実装して非同期sendすればプログラムが重くなるのは解消される

214:デフォルトの名無しさん
08/05/26 10:34:34
あれ、>>197には
>TCP/IP非同期
って書いてあるやん

150人に一斉同報するのってフツーに重いんじゃないの

215:デフォルトの名無しさん
08/05/26 10:38:07
ircdってどんな実装になってるんだろ

216:デフォルトの名無しさん
08/05/27 02:32:22
>>212
環境を書いてないからなんとも言えんがな。

217:デフォルトの名無しさん
08/05/27 02:57:49
質問者が馬鹿だったのは、二チャンネルで質問したことだろな。

218:デフォルトの名無しさん
08/05/27 09:04:41
197じゃないけど、似たようなプログラムでクライアントにダイヤルアップレベルの細い回線が混ざってて、
かつ数百キロバイトのデータが必要になる場合があるときは
・単一スレッドから非ブロッキングモードで送信
・接続毎にキューを持ったスレッドを作成してブロッキングモードで送信
どちらがいいいのでしょうか?
接続クライアント数は10程度です。

219:デフォルトの名無しさん
08/05/27 09:33:28
10程度だったらコードの見易さからいってスレッド作るのはアリかな
そうだとしてもブロッキングにはしないなあ、中断しにくいから

220:デフォルトの名無しさん
08/05/28 19:59:52
ネットワークとは直接関係ないのですが。。。
ネットゲームの延長の質問ということでご了承ください><
直接アプリのアイコンをダブルクリックで起動じゃなくって、
ハンゲームとかのHPみたいにゲームスタートみたいなボタン(リンク)を
クリックするとアプリが起動するのありますよね。
HPからユーザー側のアプリが起動できちゃうと悪さができちゃうからムリ
みたいな事も聞いたことあるんだけど。。。
ああいうのってどうやってるのでしょうか?

221:デフォルトの名無しさん
08/05/28 21:26:27
>>220
ためしに登録してみたが・・・
ActiveXコントロールのインストールが必要ですって言われたぞ

222:デフォルトの名無しさん
08/05/28 21:27:07
署名付きActiveXだとおもうが。

#厳密には署名がなくても不可能ではないけど、
#そのセキュリティを緩めるのは致命的な筈

223:デフォルトの名無しさん
08/05/28 21:27:45
ActiveXコントロールってなんですか?

224:デフォルトの名無しさん
08/05/28 21:28:47
>>223
ググレカス

225:デフォルトの名無しさん
08/05/28 21:34:28
署名付きアプレットを認証局から証明書を発行してもらう必要があるみたいですね。
多分有料ですよね。
でも大体わかりました、ありがとうございます!

226:デフォルトの名無しさん
08/05/28 21:36:59
ハウス ググレカスー

227:デフォルトの名無しさん
08/05/29 20:55:00
おいしそうなおやつがあったので、置いておきますね


東京藝術大学音楽学部 羽目鳥祭り開催中
スレリンク(musicology板)

228:デフォルトの名無しさん
08/05/30 05:21:46
ActiveXコントロールは
ユーザーがインストールを許可する事でインストールされる。
インストールしなければ動かない。
実体はDLLかEXEなので起動されれば何でもできてしまう。
よくスパイウェアとして使われる。
よほどの馬鹿でなければ
信用あるサイト以外からはインストールしないので
作っても無駄

229:デフォルトの名無しさん
08/05/30 05:27:24
ユーザは馬鹿だぜ?

230:デフォルトの名無しさん
08/05/30 08:14:56
ほいほいインストールすると思う。

署名のないActiveXを使ってる企業などのサイトで「警告が表示されますがOKを押してください」なんてわざわざ解説してたりするし。
「インストール手順を増やすうざいダイアログ」ぐらいにしか思ってないんじゃない。

あれを見るにつけ、日本って終わってると思う。

231:デフォルトの名無しさん
08/05/30 19:26:57
作り手もかなりあほだぜ

232:デフォルトの名無しさん
08/05/30 21:11:41
Vistaでは署名無しAXは起動できないんじゃなかったっけ

233:デフォルトの名無しさん
08/05/31 20:30:02
絶対ほいほいインストールする

234:デフォルトの名無しさん
08/05/31 23:41:10
とあるサイトからデータを自作したプログラムでダウンロードしているのですが、
ダウンロードに成功したり失敗したり 2分の1の確率で動いているのですが、
ダウンロードに成功しないのは なにが原因でしょうか?

235:デフォルトの名無しさん
08/05/31 23:49:58
自作したプログラムなら、原因を調べられるだろう?
どこで何のエラーが返ってきてるとか

236:デフォルトの名無しさん
08/05/31 23:55:45
翻訳:エスパー募集中

237:デフォルトの名無しさん
08/06/01 00:14:20
HRESULT h;
h = URLDownloadToFile( 0, http, file, 0, 0 );
switch(h){
case S_OK:
    printf( "   success.\n" );
    break;
case E_OUTOFMEMORY:
    printf( "   E_OUTOFMEMORY\n" );
    break;
case INET_E_DOWNLOAD_FAILURE:
    printf( "   INET_E_DOWNLOAD_FAILURE\n" );
    break;
default:
    printf( "   error?\n" );
    break;
}
上のようにしてやっているのですが、 h が default の値しか返さなくて何が原因なのかがわからないのです。

238:デフォルトの名無しさん
08/06/01 00:20:46
値を表示してみるという思いつきができないのか
なんというゆとり

239:デフォルトの名無しさん
08/06/01 00:24:56
defaultを使わないでもっと絞ればいいだろ

240:デフォルトの名無しさん
08/06/01 00:31:06
>>238
戻り値は -2146697510 です
意味わかるんですか?

241:デフォルトの名無しさん
08/06/01 00:32:33
>>239
リファレンスには
 S_OK
 E_OUTOFMEMORY
 INET_E_DOWNLOAD_FAILURE
の3つしか 特に戻り値として明記されていませんでしたので これ以外の戻り値は わかりません。

242:デフォルトの名無しさん
08/06/01 00:40:10
仕様書か実装のバグだね
MSに抗議しないと

243:デフォルトの名無しさん
08/06/01 00:40:42
リファレンス外の戻り値を返すとかどんだけ糞なライブラリorリファレンスだよ

244:デフォルトの名無しさん
08/06/01 01:10:01
-2146697510 = S_OK + E_OUTOFMEMORY + INET_E_DOWNLOAD_FAILURE


245:デフォルトの名無しさん
08/06/01 01:12:17
>>244
おまえすげえなwww

3つの戻り値の和を返すというのはいったいどういうことを言いたいんだろうかこの関数は

246:デフォルトの名無しさん
08/06/01 01:20:04
>>244
1245206じゃハゲ
テキトーなこと抜かしてるんじゃねーよボケ
死ね工作員

247:デフォルトの名無しさん
08/06/01 01:40:25
一体何の工作だ

248:デフォルトの名無しさん
08/06/01 01:52:00
FACILITYの意味からして足すのはありえんと思うんだが

249:デフォルトの名無しさん
08/06/01 01:54:15
-2146697510 = S_OK | E_OUTOFMEMORY | INET_E_DOWNLOAD_FAILURE

250:デフォルトの名無しさん
08/06/01 01:55:03
>>248
ビット和だろ常考

251:デフォルトの名無しさん
08/06/01 01:59:40
-2146697510を16進数に直すと0x800bfeda
8 は失敗をあらわす。
b は FACILITY_CERT で、電子証明書関連のエラーだとわかる。
feda は不明。

httpsで繋ごうとして何かがまずかったんだなとはわかるね。



252:デフォルトの名無しさん
08/06/01 02:09:45
winerror.hに詳しくなるスレはここですか

253:デフォルトの名無しさん
08/06/01 04:57:28
スタック破壊してんじゃネーノ

254:デフォルトの名無しさん
08/06/01 05:07:10
ネットワーク接続を切る、接続するAPIってあるんでしょうか?
言語は C/C++ Windowsでお願いします

255:デフォルトの名無しさん
08/06/01 05:08:39
あるよ。

256:デフォルトの名無しさん
08/06/01 05:19:49
>>255
何でしょうか?

257:デフォルトの名無しさん
08/06/01 05:23:23
Winsock

258:デフォルトの名無しさん
08/06/01 05:49:25
すいません 間違えました
ネットワークでなく インターネットの接続です

259:デフォルトの名無しさん
08/06/01 05:50:53
どう違うんだ

260:デフォルトの名無しさん
08/06/01 05:53:14
稀にIPじゃない場合もあるか否か

261:デフォルトの名無しさん
08/06/01 05:56:17
IPじゃないってドメインのことか?
ドメインならgethostbynameでIPに変換可能
あとは一緒

262:デフォルトの名無しさん
08/06/01 05:56:57
ネットワーク接続 WNetConnectionDialog関数を使ったら

URLリンク(sakuratan.ddo.jp)

のようなダイアログがでたのですが、これではないやつで
インターネット接続関連のダイアログがでてくると幸いです

263:デフォルトの名無しさん
08/06/01 06:02:35
>>261
Internet Protocolを使ってないコンピュータネットワークもあるってこと。

264:デフォルトの名無しさん
08/06/01 06:30:21
connect() 関数じゃないですよ?

265:デフォルトの名無しさん
08/06/01 06:51:53
物理的にネットワークアダプタを抜いた状態と同じ環境にしたいってことです

266:デフォルトの名無しさん
08/06/01 07:41:40
>>263
あるわけないだろ。
ばか?

267:デフォルトの名無しさん
08/06/01 07:45:56
>>266
うせろキチガイ

268:デフォルトの名無しさん
08/06/01 07:47:43
>>266 が無知なのは分かったw

269:デフォルトの名無しさん
08/06/01 08:31:21
>>268が無知すぎる件
ある意味犯罪

270:デフォルトの名無しさん
08/06/01 09:43:55
>>269
アナタを・・・
telnetです・・・

271:デフォルトの名無しさん
08/06/01 15:34:01
>>266,269
AppleTalkとかIPXは?

272:デフォルトの名無しさん
08/06/01 15:34:40
>>265
Win32APIでネットワークアダプタを無効にするとか

やり方知らんが多分できるとオモ

273:デフォルトの名無しさん
08/06/01 15:48:13
WindowsでSockRAW取れないのですが
どうしてですか?XP SP2です

274:デフォルトの名無しさん
08/06/01 16:05:42
覗くなということだ

275:デフォルトの名無しさん
08/06/01 18:13:05
>273
ググればすぐわかる。

276:デフォルトの名無しさん
08/06/01 19:20:30
MMORPGのサーバとクライアントの同期化について知りたいのですが、
何か参考になるものとかありますか?

277:デフォルトの名無しさん
08/06/01 20:02:12
韓国語を覚えたほうがいいかもね

278:デフォルトの名無しさん
08/06/01 23:23:04
>>277
理由は?

279:デフォルトの名無しさん
08/06/01 23:37:34
市場の8割がチョン製クリゲ

280:デフォルトの名無しさん
08/06/02 04:57:58
日本ってなんで情報なかったりするんだろう(・ω・)

281:デフォルトの名無しさん
08/06/02 10:36:41
日本のゲーム業界特有の情報閉鎖性もあるけど
オンラインゲームが流行ったときに不況で
誰も手を出さなかったとういのもあるかも
そして>>279

282:デフォルトの名無しさん
08/06/02 13:03:35
商売がヘタクソってのも多いと思うな>日本のメーカー
あからさまな出し惜しみとかして客に逃げられるパターンが多すぎる

283:デフォルトの名無しさん
08/06/02 13:30:29
商売というか、小汚い金の稼ぎ方が日本人にあわないんだろうね
あっちの人たちは金が儲かれば形振りかまわないから成功はする
名声はないけど

284:デフォルトの名無しさん
08/06/02 14:20:06
うん,高度成長期の日本そっくり

285:デフォルトの名無しさん
08/06/02 14:23:01
パンヤもみんゴルのパクリといわれてるし、
その他もろもろパクリは多いよな。

そりゃ作るのは楽だよ

開発で使ってるソフトも平気で割れでやってそうw

286:デフォルトの名無しさん
08/06/02 16:21:36
>>285
ネットランナー・・・

287:デフォルトの名無しさん
08/06/03 21:38:57
WinSockでソケットのポート番号を

sockaddr_in add;
int addlen =(int)sizeof(add);
getpeername(Sock, (struct sockaddr *) &add, &addlen);

char buf[50];
_itoa_s(add.sin_port,buf,(int)sizeof(buf),10);

といった感じで取得はできましたが
IPアドレスを取得するにはどうすればよいでしょうか?


288:デフォルトの名無しさん
08/06/03 22:20:02
getpeernameで返してもらった連中を
getnameinfoにでも突っ込めば。

289:デフォルトの名無しさん
08/06/03 22:35:15
sockaddr_in だと長さ足りなくないか

290:デフォルトの名無しさん
08/06/03 22:54:40
【エアー調査会社】HG嫁 住谷杏奈61【ハッカー妊婦】
スレリンク(ms板)


291:デフォルトの名無しさん
08/06/04 01:37:08
ネットプログラム初心者です。
ネットゲームのプログラミングが目的なのですが、
コネクション数は1~200あたりで、OSがwindowsXPとした場合、
URLリンク(www.kt.rim.or.jp)
を読む限り、WSAAsyncSelectかWSAEventSelectを使うのが良さそうですが
どうなのでしょうか。

292:デフォルトの名無しさん
08/06/04 01:46:06
「Winsock標準に準拠」にこだわるのでなければ(もはや意味なし)
IOCPにしとけ

293:デフォルトの名無しさん
08/06/04 01:48:59
期待した動作をしなくてもくじけないココロがあるならなんとでもなるZE!

294:デフォルトの名無しさん
08/06/04 01:57:35
まったく使ったことがないのでよくわかりませんが、
select 毎回の引数の処理が無駄
WSAAsyncSelect,WSAEventSelect メッセージの通知が遅い
IOCP とにかく速い、プログラムは難しくなる
で良いでしょうか?

ROのエミュ鯖ではselectが使われてて、引数の処理が入ってたのは見たなぁ。

295:デフォルトの名無しさん
08/06/04 02:18:41
selectの64制限は確か#defineで回避出来たと記憶してるが
WSAEventSelectの64制限(WaitForの制限)は
複数のスレッドに64以下ずつわけるしかないんじゃなかったかな。

296:デフォルトの名無しさん
08/06/04 02:29:14
複数のスレッドになると難しそうですね。
マルチスレッドもネットプログラミングの経験もない自分的には
ひとまずselectが良さそうな気がしてきました。
オープンソースのmmoが2つともselect使用しているみたいなので、実装例見れますし。


297:デフォルトの名無しさん
08/06/04 20:45:00
pthread_mutexって10万個作って使っても
問題ない?

298:デフォルトの名無しさん
08/06/04 20:59:21
>>297氏とは違うのですが、ミューテクスとセマフォを分かりやすく説明できる方いないでしょうか?
ググッてみたけど、どこも似たような分かりにくい説明が多いです。。

299:デフォルトの名無しさん
08/06/04 21:22:02
ミューテクスは複数のスレッドがあった場合、順番に処理するのに対して、
セマフォを複数のスレッドが同時にアクセス可と言う考え方でいいのでしょうか?

300:デフォルトの名無しさん
08/06/04 22:06:23
セマフォは5個の資源を10人で使うというような考え方。
listenの引数みたいなというか

301:デフォルトの名無しさん
08/06/04 22:14:35
>>300
係数1のセマフォならいっしょじゃねーか
嘘教えるな

302:デフォルトの名無しさん
08/06/04 22:17:22
>>298
ミューテックスは、同時にひとつのスレッドしかアクセスできない。
1人用のイスみたいなもの。 早いもの勝ちで1人だけが獲得できる。
残念ながら座れなかった人は、イスが空くまで待つ。
イスが空いたら、待ってましたとばかりに奪い合って、勝った人1人だけがイスに座れる。
負けた人は、またイスが空くまで待つ。

セマフォは、同時にアクセスできるスレッドの数を好きに指定できる。
3人まで座れるソファーとか、そういうの。
4人目が来たら、誰かがどくまで待つ。
1にすれば、ミューテックスとほぼ同じ。

303:デフォルトの名無しさん
08/06/04 22:25:50
>>301

だからそのものズバリだろw
教科書でミューテックス=二進セマフォという表記も使われる。

304:デフォルトの名無しさん
08/06/04 22:50:39
WinやRecursiveにしたときのpthreadは、Mutexは同じスレッドならば何度でも取得できるところが一番違う。
スレッドごとの排他制御にMutex、複数の資源管理にセマフォ、単一の資源管理ならどっちでもいい。

305:298
08/06/04 22:53:48
>>299-303
>>302さんの説明分かりやすかったです。ありがとうございました。
ググッても、どこも排他的とかいまいち理解しづらいですよね。。

306:デフォルトの名無しさん
08/06/04 23:25:22
なんというスレ違い

307:デフォルトの名無しさん
08/06/08 12:27:33
C++使いなのですが、socketの実装未経験です、
車輪の再発明はしたくないのでlinuxのsocketライブラリを探しています
CommonC++(commoncpp)というのを見つけたのですが
URLリンク(www.sunsite.ualberta.ca)
ソースコードを見てると使いやすそうなんですが、他にもオマイラお勧めの、良いライブラリとか
あったら教えてホスイのですが
boostにもsocketのライブラリがあるっぽいんだけど・・・・こっちの方が有名なのかな?

308:デフォルトの名無しさん
08/06/08 12:56:46
boostのがおすすめ

309:デフォルトの名無しさん
08/06/08 14:23:14
オマイラだと?何だその態度は

310:デフォルトの名無しさん
08/06/08 14:28:50
>>307
一度くらいは自分で実装するべきだ。その上で便利なライブラリを探すんだ。
車輪の再発明はしたくないって便利な言い訳だね。


311:デフォルトの名無しさん
08/06/08 14:41:01
別に使えるものは使えばいいんじゃねえの
いちいちカーネルやコンパイラから自分で書き起こしたりはしないだろ

312:デフォルトの名無しさん
08/06/08 21:49:25
>>307どえす
VS2005とgcc-4.1.2-33に、boost-1_35をスコーンとインスコして
asioをやりまくっているんだが
VS2005は、無問題、gccでコンパイルする場合
いちいちコンパイル毎、変数を設定するのがマンドクサイので
.bash_profileに
CPLUS_INCLUDE_PATH=/usr/local/include/boost-1_35; export CPLUS_INCLUDE_PATH
LD_LIBRARY_PATH=/usr/local/lib; export LD_LIBRARY_PATH
追加設定して
$ g++ -pthread -lboost_system-gcc41-mt sample.cpp
こんな感じでコンパイルしてて、今んとこ無問題なんだが、どうよモマイラ、
他にいい方法があったら聞いてやるが

313:デフォルトの名無しさん
08/06/08 22:12:11
Makefile

314:デフォルトの名無しさん
08/06/08 23:02:18
>>312
聞いてくれなくてもいいが


315:デフォルトの名無しさん
08/06/08 23:13:36
boostの非同期ライブラリおすすめ>>307

316:デフォルトの名無しさん
08/06/09 00:07:43
>>315
boost::asioも非同期ライブラリ持ってるんじゃないの?


317:デフォルトの名無しさん
08/06/09 10:02:28
ACEだな、やっぱでかいし

318:デフォルトの名無しさん
08/06/09 23:12:11
ごめん。
asioのことを言ったw>>315

319:デフォルトの名無しさん
08/06/10 21:12:45
ネットワークプログラミングの利点って何?

320:デフォルトの名無しさん
08/06/10 21:32:02
ネットワーク通信ができること。

321:デフォルトの名無しさん
08/06/11 03:25:33
宿題スレに質問投げておくと勝手にだれかが作ってくれる
これがネットワークプログラ

322:デフォルトの名無しさん
08/06/11 12:27:03
>>321
小人さんは間違いが多いのが欠点だ。

323:デフォルトの名無しさん
08/06/13 22:24:38
>>312どえす、おいモマイラ一週間ぶりに俺様が来ましたよっと>>310の言う通り、漏れはソケット初心者なので、動作を理解するうえで、薄いラッパークラス作っている
近い将来、サーバー側、クライアント側で行う動作を基底クラスで実装して、それぞれのクラスを派生させようと思うが、サーバー側とクライアント側で
何が共通手順なのか、今はまだよく分からないので、とりあえず前に進めるためおこなっていおる
どうよこんな感じで
class Socket {
int fd1, fd2;
struct sockaddr_in saddr;
struct sockaddr_in caddr;
int len;
public:
Socket() : fd1(0), fd2(0), len(0) {} // コンストラクタ
~Socket(){} // デスクトラクタ
void MakeSocket(); // ソケット生成
void InitSocket( sockaddr_in saddr) ; // ソケット初期化
void NameOfTheSocket( sockaddr_in saddr );// ソケットに名前を代入
void BindSocket( sockaddr_in saddr ); // ネームバインド
void ListenSock( int fd1 ); // リッスン
void AcceptSocket(); // アスペクト
void CloseSocket(); // ソケットクローズ
};


324:デフォルトの名無しさん
08/06/13 22:24:59
続き
void Socket::MakeSocket()
{
if ((fd1 = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
exit(1);
}
}
void Socket::InitSocket( sockaddr_in saddr )
{
memset((char *)&saddr, 0, sizeof(saddr));
}
void Socket::NameOfTheSocket( sockaddr_in saddr )
{
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = INADDR_ANY;
saddr.sin_port = htons(PORT);
}
void Socket::BindSocket( sockaddr_in saddr )
{
if (bind(fd1, (struct sockaddr *)&saddr, sizeof(saddr)) < 0){
perror("bind");
exit(1);
}
}
void Socket::ListenSock( int fd1 )
{
if ( listen(fd1, 1) < 0) {
perror("listen");
exit(1);
}
}

325:デフォルトの名無しさん
08/06/14 06:51:37
オブジェクト試行ですか?

326:デフォルトの名無しさん
08/06/14 07:58:40
sockの関数と1対1に対応するメソッドを作ってるうち恩恵を受けにくい。一連の決まった操作をひとつのメソッドにまとめてしまおう。
sockaddrはラップして、アドレスのクラスを作ってしまう。簡単にアドレスを設定できるようにするといい。

あと、言葉遣い直せ


327:デフォルトの名無しさん
08/06/14 08:00:05
JavaとかRubyとかPythonとかの
ソケットクラスの構成をみれば~?

328:デフォルトの名無しさん
08/06/14 08:27:18
>>326
君はまずその変な日本語を直さないとな
他人の言葉遣いを指摘してる場合じゃないぞ



329:デフォルトの名無しさん
08/06/14 09:27:20
さて、些細な顰蹙をかっているようだが、2ちゃんねるクオリティーということで、まぁ許してちょんまげ
こんな感じで、完成形に徐々に近づきつつあると思うが、どうよ
class Socket {
struct sockaddr_in saddr;
struct sockaddr_in caddr;
public:
Socket(){} // コンストラクタ
~Socket(){} // デスクトラクタ
void SetAddresSocket( sockaddr_in saddr, unsigned short sock_family, unsigned short sock_port, int sock_addr ); // sockaddrラッパークラス
int DescriptSocket(); // ソケットを作り、成功したらソケットディスクリプタを返す
};


330:デフォルトの名無しさん
08/06/14 09:27:56
void Socket::SetAddresSocket( sockaddr_in saddr, unsigned short sock_family, unsigned short sock_port, int sock_addr )
{
saddr.sin_family = sock_family;
saddr.sin_addr.s_addr = sock_port;
saddr.sin_port = htons( sock_addr );
}
int Socket::DescriptSocket()
{
int fd1, fd2;
size_t len;
if ((fd1 = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
exit(1);
}
memset((char *)&saddr, 0, sizeof(saddr)); // 初期化
// バインド
if (bind(fd1, (struct sockaddr *)&saddr, sizeof(saddr)) < 0){
perror("bind");
exit(1);
}
if ( listen(fd1, 1) < 0) {
perror("listen");
exit(1);
}
len = sizeof(caddr);
if ((fd2 = accept(fd1, (struct sockaddr *)&caddr, &len)) < 0) {
perror("accept");
exit(1);
}
close(fd1);
return fd2;
}

331:デフォルトの名無しさん
08/06/14 09:34:50
しかしなんだね、g++ってVC8とは若干違うよね
accept()関数の第三引数の
accept(fd1, (struct sockaddr *)&caddr, &len))
lenだが、VC8ならintでも無問題なのだけど、g++はsize_tじゃないと嫌だと
怒ったりとかと少し戸惑う、>>330でした

332:デフォルトの名無しさん
08/06/14 09:54:59
POSIXではsocklen_tだけど、intで実害はない。
size_tとしてしまうのは誤り。
socklen_tとint(やsize_t)が同じサイズか判定をどこかに入れておくと安全。

// 偽なら負の添え字になりコンパイルエラー
#define STATIC_ASSERT(cond) extern int static_assert_array[ (cond) ? 1 : -1 ];
STATIC_ASSERT(sizeof(int) == sizeof(socklen_t))


333:デフォルトの名無しさん
08/06/14 10:05:46
>>332
Thx
物知りですね、勉強になります
gccの場合、accept()関数の第三引数は、int型でコンパイルに成功してたんだけど、g++でコンパイルした際にエラーが出たんで
なんでかなと思ってた、コンパイラに依存しないようにアサーションマクロを書いておくと、メモメモ

334:デフォルトの名無しさん
08/06/14 14:25:52
Winsockで非ブロッキングモードにしたいときは
selectでウインドウハンドルとそのウインドウのプロシージャを設定するけど
最初はウインドウAでメッセージ受けてたけど
次はウインドウBでメッセージ受けるように変更
とかいうことはできますか?

本当はウインドウハンドル指定しなくてよければ通信メッセージ受けるところだけ独立させたいんだけど

335:デフォルトの名無しさん
08/06/14 14:32:58
>>334
WSAEventSelectを使えばウインドウハンドルはいらない。

336:デフォルトの名無しさん
08/06/14 14:35:32
>>335
お~ ウインドウハンドルいらない版もありましたか
ありがとうございまつ

337:デフォルトの名無しさん
08/06/14 16:12:06
winsockについてです
gethostbynameではwinsockが確保したメモリが返されてきますが
これはどうすると解放できるのでしょうか?

338:デフォルトの名無しさん
08/06/14 16:17:39
>>337
gethostbynameでググルと一番上に解説が出てくるし

339:デフォルトの名無しさん
08/06/14 20:59:48
>>329なんだけどさ
>>327
が書いてたんで、rubyのソケットのライブラリを見てたら、やっぱ個別に
sockの関数と1対1に対応するメソッドを持ってるよね
>>326
1対1に対応するメソッドを作ると、恩恵は受けにくいと言うし
ネットワークプログラミングとは直接関係ないけど、どっちがいいんだろうな?
この問題にはいつも悩まされる
永遠の命題なのか・・・・orz

340:デフォルトの名無しさん
08/06/14 21:10:21
>>339
たとえば、自分向けのライブラリを作るなら、いきなりconnectで繋がって、closeで閉じるライブラリを作り置きしておくと、今後ずっと楽になる。

341:デフォルトの名無しさん
08/06/14 21:19:02
>>340
わかりやすい説明、ありがとう
たしかに、それは言えるのだけど、ついつい、かまえてって言うか、型にはめようとして
再利用性だとか、拡張性だとか、考えてしまいクラスの設計には、いつも苦労するんだよね、俺の場合
もう少し気楽に考えた方がいいかもね

342:デフォルトの名無しさん
08/06/14 21:26:20
>>341
共通の機能は基本クラスに、専用の機能は派生クラスに分散。一つのクラスで機能を欲張らないのが設計のコツ。


343:デフォルトの名無しさん
08/06/14 21:27:55
>>341
C/C++で書いてるんなら、いつでも下に降りられるから、ある意味
どうでもいい気がする。

rubyみたいな奴だと、標準で抽象度の高いAPIしか用意されてないと
そこより下に降りたければCでextension書くしかないって話になる。
だからそういう設計になってるんだと思うよ。


344:デフォルトの名無しさん
08/06/14 21:34:17
>>341です
皆さん、いい話ありがとう

345:デフォルトの名無しさん
08/06/14 23:34:33
TCP/IPで、自ソケットが生きてる場合、一時的に通信経路に問題があってもsendは成功すると
思いますが、その後すぐにその問題が解決したら、相手側には届くのでしょうか?

346:デフォルトの名無しさん
08/06/14 23:36:06
>>345
いつか届く。


347:デフォルトの名無しさん
08/06/15 04:36:59
僕の想いも届いて!

348:デフォルトの名無しさん
08/06/15 06:09:21
winsockを使っていますが

”こんにちわ” ”こんばんわ”
を相手が送信したときに
2つのメッセージに対して
FD_READが2回発生するときと
1回しか発生しないときがあります

2回発生するときは
”こんにちわ” と ”こんばんわ” を別々に取得できて問題ないのですが

1回しか発生しないときは
”こんにちわこんばんわ”という1つの文字になってしまいます

送信相手が1回送信するごとにFD_READが1回発生するように設定することはできますか?
できないとして1送信ごとに何らかの記号をつけて識別したりするのでしょうか?


349:デフォルトの名無しさん
08/06/15 06:29:10
基本的にできない。「こんにちわ」と「こんばんわ」を別のものとして扱うなら、それぞれの頭に俺プロトコルのヘッダ(メッセージ長など)を付けて送り、受信側でそれを解釈する。

あと、どーでもいいけど「こんにちは」と「こんばんは」だと思う。

350:デフォルトの名無しさん
08/06/15 10:57:00
そういうときこそ、
SCTP。
おまいら使ってる?

351:デフォルトの名無しさん
08/06/15 14:04:34
>>348
そもそも
「こ」「ん」「に」「ち」「わ」と5回に分かれてFD_READが来ることだってありえるぞ。
TCPとはそういうもんだ。区別したけりゃストリームに自前で区切情報載せろ

352:デフォルトの名無しさん
08/06/15 15:09:49
>>349 351
ありなとうございまつ

Sendの末尾に区切り文字入れれば
1回で複数受信してもOKじゃね?
とか思ったけど1送信あたりでも分離することあるのですかorz
しかしそうなると

「こんに」「こんばんわ」「ちわ」という受信すらありえるような
それともTCPは受信順番も考慮するからそれはないと思っていいんでしょうか?


353:デフォルトの名無しさん
08/06/15 15:32:35
つ[延滞]
必ずしも送った順に相手に届くとは限らない
この辺はUDPとTCPの違いを調べれば分かる

354:デフォルトの名無しさん
08/06/15 15:58:37
>>352
TCPは順番は変わらないよ!。


355:デフォルトの名無しさん
08/06/16 11:35:18
マルチスレッドなプログラムでsocketを使った場合に、
thread1(){ send("ABCDE"); }
thread2(){ send("abcde"); }
の2つのスレッドが同時にsendをコールした場合、
相手側でrecvした時に、
"ABCDE"と、"abcde"が混ざることってありますか?
例えば、"AaBbCcDdEe"みたいに。

シングルスレッドな場合だと、
send単位で送ったデータはそのまま出て来ますよね。


356:デフォルトの名無しさん
08/06/16 11:50:15
せめて"ABabcdeCDE"くらいの例えならな

357:デフォルトの名無しさん
08/06/16 11:52:11
1. netstat -a で見れる情報(プロトコルやアドレス/ポート ステータス)は
どこから持って来てるんでしょうか?
(同じ情報を自分のプログラムから取得するにはどうすればいいでしょうか?)

2. TDImonか同等のプログラムのソースコードはどこかにないでしょうか?



358:デフォルトの名無しさん
08/06/16 11:53:48
netstatのソース見ればいいんでねぇの?


359:デフォルトの名無しさん
08/06/16 11:59:56
>>356
>"ABabcdeCDE"
これもありうる?
カーネルの中のソケット毎の送信バッファってのは、1つだよね。
複数のスレッドがsendをコールすると、その送信バッファに、
送信データが詰め込まれて行くんだと思うんだけど、
それがsend単位に区切られて詰められない可能性もあるってこと?

こういう動きって、OS依存?
send実行中に、スレッドがコンテキストスイッチしたらこうなるってこと?

2このスレッドが、同時に100Mバイトとかのデータをsendしたら、
そうなりそうな気がしないわけじゃないけど。

360:デフォルトの名無しさん
08/06/16 12:04:11
そもそも同期化もせずに 1 つのソケットに複数スレッドで書き込むな。

361:デフォルトの名無しさん
08/06/16 12:09:29
232Cでやっちまったことはあるな

362:デフォルトの名無しさん
08/06/16 12:50:47
>>360
確かにおっしゃる通りですね。
ってことは、やっぱりそうなる事もありうるってことですか。


363:デフォルトの名無しさん
08/06/16 19:19:51
>>362
実装依存だろうし、起きるかどうか考えるだけ無駄

364:デフォルトの名無しさん
08/06/16 21:45:50
ロックしろよ


365:デフォルトの名無しさん
08/06/16 21:51:18
Unixで同期モードならおきない気がする

366:デフォルトの名無しさん
08/06/16 22:11:13
>>365
どういった理由からですか?保障されているんですか?

367:デフォルトの名無しさん
08/06/16 23:13:06
TCPだったら、sendした順に届くとは限らない。
スレッド関係なしに。
だから、逐次処理で
send( "ABCDE" );
send( "abcde" );

とかやっても、相手側で
abcdeABCDEと受信することも普通にある。


368:デフォルトの名無しさん
08/06/16 23:19:20
おいおい。TCPでそれはないって。


369:デフォルトの名無しさん
08/06/16 23:22:45
>367
え??

370:デフォルトの名無しさん
08/06/16 23:30:04
次にお前は「ワーイ沢山釣れたー」と言う…

371:デフォルトの名無しさん
08/06/16 23:37:42
winsockならURLリンク(www.kt.rim.or.jp)
まぁ、どの実装でも、自前でコントロールすべしって結論になると思う

372:デフォルトの名無しさん
08/06/16 23:39:36
あれ?システムコール実行中にコンテキストスイッチて起るんだっけか?

373:デフォルトの名無しさん
08/06/16 23:47:19
起こらないとするなら、誰かがsendを喚ぶと、戻ってくるまで
システムフリーズするだけだな。

374:デフォルトの名無しさん
08/06/17 01:51:31
TCPは送信順番も送信内容も保障されるか破棄されるんじゃないの?
順番がかわるとか複製される可能性があるのはUDPじゃないの?

おれなんか間違ってること言ってる?
手元の参考書にそう書いてあるんだけど?

375:デフォルトの名無しさん
08/06/17 01:56:01
釣れた釣れた(^^)

バーカ >>374

376:デフォルトの名無しさん
08/06/17 02:01:15
>>375
スレ監視し続けてたんだね
お疲れ様
釣れて良かったね
おめでとう

377:デフォルトの名無しさん
08/06/17 02:46:29
>>372
普通に起こるだろ。
シグナルだって入るし、場合によっちゃスレッドだってスイッチする。

378:デフォルトの名無しさん
08/06/17 04:08:33
>>372
I/Oだったら普通にキューにぶっこんでコンテキストスイッチしないかな?


379:デフォルトの名無しさん
08/06/17 04:28:02
Winsockでconnect、send、recvそれぞれに個別のタイムアウト値を持たせたいのですが、
connectのみ
WSAWaitForMultipleEventsでタイムアウトを判断して
send、recvはsetsockoptを使って指定、
これで大丈夫でしょうか?

380:デフォルトの名無しさん
08/06/17 08:52:26
今の今までスレタイがtypoだと思ってた俺愕然。

381:デフォルトの名無しさん
08/06/17 09:58:45
65535まで続くよ!

382:355
08/06/17 10:05:16
>>367
シングルスレッドの場合でしょ、それは絶対にあり得ないと思うんだけど。
最近のカーネルは、カーネルプリエンプションだから、カーネル内部の処理
実行中にコンテキストスイッチすることもあるかも知れないけど、
ロジックの実行順序(逐次処理)が入れ替わることはないと思います。

>>373
それとはまた別の話ではないでしょうか。
sendを呼んだひとはブロックされるでしょうが、他のプロセスは
普通にシステムコールを実行することも、ユーザーランドのロジックも
実行できると思います。

>>374
私もそういう認識です。
TCPで1つのスレッドが送信した場合であれば、sendした順に相手側では
recv出来ると思ってます。(何回recvすれば良いかは判らんけど。)
途中でパケロスしたり、物理的に線が切れたりした場合は、受信側に届いた
部分まで(これも、相手がsendした順)が受信出来る。

なにか間違ってます? >> all


383:デフォルトの名無しさん
08/06/17 16:49:35
>>479

384:デフォルトの名無しさん
08/06/17 17:04:56
>>379

385:デフォルトの名無しさん
08/06/17 17:14:26
>>579

386:デフォルトの名無しさん
08/06/17 17:23:55
getaddrinfoはブロッキングを起こしますか?

387:デフォルトの名無しさん
08/06/17 17:54:23
AI_NUMERIC を付けない場合は起こします

388:デフォルトの名無しさん
08/06/17 18:07:41
LAN接続PC間で、低速、高ping回線の環境を再現するにはどのような方法があるでしょうか?
自作の俺プロトコルアプリが低速回線環境でどういった影響を受けるのか調べたいのですが。
環境はWindowsです(98orXP)

389:デフォルトの名無しさん
08/06/17 19:19:43
そういうソフト使えばいいだろ。

390:デフォルトの名無しさん
08/06/17 19:50:44
>>367
TCPでそれがあったら大変だろ
UDPでは十分ありうるだろうが
UDPは順序がかわるどころか
複製されたりもするらしいからな

しかしUDPって順序も保障されてないとなると
1パケットあたりの情報をどうやって認識するんだろうか
区切り文字やらパケットサイズ送っても
順序がかわったりしたらアウトだよな?



391:デフォルトの名無しさん
08/06/17 20:41:21
このスレに出入りする奴の発言とは思えんな。

392:デフォルトの名無しさん
08/06/17 21:56:19
UDPは来るか来ないかだけで、「パケット」という構造自体は保証されるだろ。
2つ以上のパケットをもってきて、その関連をどうこういうと面倒だけど。

393:デフォルトの名無しさん
08/06/18 09:28:59
UDPで順序が変わるってのはわかります。
例えば、
(1)udp_send("ABCD");
(2)udp_send("abcd");
とした場合、(1)で作成されたUDPパケットが相手HOSTに到達
するルートと、(2)で作成されたUDPパケットが相手HOSTに到達
するルートが同じだとは限らないですよね。
たまたま、(2)のUDPパケットが相手HOSTに到達するルートの方が
速い回線だったりした場合、受信側のHOSTでは、(2)(1)の順に
UDPパケットを受信する事もあり得ます。
UDPパケット毎の順序は不定ですが、複数のUDPパケットが混ざる
事はありません。(シングルスレッドの場合)

で、複製されるってのはどういう意味?

394:デフォルトの名無しさん
08/06/18 17:14:46
udp_send("ABCD");
とかが2回以上あったかのように
複数回届くことかと思われ

で、実際そういうことがある
パケットにインデックスとかつけて
2回目以降のやつは棄てればいいので問題ない

395:デフォルトの名無しさん
08/06/18 17:22:56
>>394
それって UDP側じゃなくて MAC側の仕様じゃないの?
結果は同じだけど・・・
細かすぎるか?w

396:デフォルトの名無しさん
08/06/18 17:48:55
UDPパケットがネットワーク上で消失するってのは判るんですが、
重複するってのはなぜ?
誰がパケットを複製するの?

マルチキャストであればルータがパケットを複製するってのは
判るんですが。


397:デフォルトの名無しさん
08/06/18 17:59:51
論理的にはあり得ないけど、ハードやOS側が腐っている場合は、
勝手に複製されてしまうこともあるって事ですか。

man ping より
重複パケットと障害パケット
     ping ユーティリティは重複パケットと障害パケットを報告します。重複パケット
     はユニキャストアドレスに対しては起こるはずのないものですが、リンク層での
     不適切な再送信によって引き起こされるようです。重複は様々な状況で起こる可
     能性があります。低いレベルの重複の存在は必ずしも警告にならないかもしれま
     せんが、よい兆候ではありません。ブロードキャストもしくはマルチキャストア
     ドレスに ping する時には、重複が起こることが期待されます。実際に重複する
     のではなく、異ったホストから同じ要求に対して応答が行われからです。

     障害を受けたパケットは明らかに重大な警告です。多くの場合、ping パケットの
     経路のどこか (ネットワーク内かホスト内) のハードウェアの故障が考えられま
     す。



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch