トップページ⇒tech
1001コメント339KB

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

レス数が1000を超えています。これ以上書き込みはできません。
0001名無しさんフフフフフフフNGNG
主にソケットに関しての質疑応答スレです。

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

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

過去スレ:
Port1 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/tech/kako/1023/10233/1023359282.html
Port4 http://pc3.2ch.net/tech/kako/1034/10342/1034236536.html
Port5 http://pc2.2ch.net/tech/kako/1040/10402/1040220302.html
Port6 http://pc2.2ch.net/tech/kako/1052/10521/1052106444.html
Port7 http://pc2.2ch.net/test/read.cgi/tech/1063035045/

関連リンクは>>2-10辺り
0002デフォルトの名無しさんNGNG
図書コーナー!

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
http://www.amazon.co.jp/exec/obidos/ASIN/4894712059/
詳解TCP/IP〈Vol.1〉プロトコル
http://www.amazon.co.jp/exec/obidos/ASIN/4894713209/
The Implementation (TCP/IP Illustrated, Volume 2)
http://www.amazon.co.jp/exec/obidos/ASIN/020163354X/
Linuxソケットプログラミング―ネットワークプログラミングにおける実践技法
http://www.amazon.co.jp/exec/obidos/ASIN/4894714671/

足りなかったら適当に付け足してね
0003デフォルトの名無しさんNGNG
前スレに出てきたURL抜粋

JPNIC RFC関連リンク集
http://rfc-jp.nic.ad.jp/link/

RFC 2616 "Hypertext Transfer Protocol -- HTTP/1.1" 日本語訳
http://www.studyinghttp.net/rfc_ja/2616/rfc2616_ja.html

C10K ヘヴィーロードサーバ
http://www.kegel.com/c10k.html

TCP/IPによるネットワーク構築〈Vol.3〉―クライアント‐サーバプログラミングとアプリケーション
http://www.amazon.co.jp/exec/obidos/ASIN/4320028007/
Webプロトコル詳解―HTTP/1.1、Webキャッシング、トラフィック特性分析
http://www.amazon.co.jp/exec/obidos/ASIN/4894715414

tcpdump
http://www.tcpdump.org/
Windump
http://netgroup-serv.polito.it/netgroup/tools.html
pathchar
ftp://ftp.ee.lbl.gov/pathchar/
pchar
http://www.employees.org/~bmah/Software/pchar/

MSDN
http://msdn.microsoft.com/library/en-us/dnsitehelp/html/tochelp.asp
0004デフォルトの名無しさんNGNG
Winsock FAQ 日本語訳
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/

RFC-JP ML
http://www.imasy.or.jp/~masaka/rfc-jp/

↓前スレからコピペ
でも出てたけど、次スレテンプレに
 http://x68000.startshop.co.jp/~68user/net/
追加よろ。それと RFC 集として
 http://www5d.biglobe.ne.jp/~stssk/rfcjlist.html
の追加をキボン (http://rfc-jp.nic.ad.jp/link/ への
リンクより役立つと俺は思う)。

あと、1 の
 Winsock Programmer's FAQ
 http://tangentsoft.net/wskfaq/
は日本語訳の
 http://www.kt.rim.or.jp/~ksk/wskfaq-ja/
に差し替えていいんでない?
0005デフォルトの名無しさんNGNG
(´゜ ´ω_゜,ε゜‘) >>1おつかれ
0006デフォルトの名無しさんNGNG
乙。フフフフフっ。
いやー。まだ笑える。俺のつぼにはまったよ。
0007デフォルトの名無しさんNGNG
>>1 (;゚Д゚)ノ '\0'終端忘れてますよ乙!
0008デフォルトの名無しさんNGNG
略してネトプ
0009デフォルトの名無しさんNGNG
ちょっとしたファイル転送が出来るチャットプログラムを組もうと思ってるんですが
TCPよりUDPのほうが高速に転送出来ると聞きました。
自前でのエラー処理を含めてもUDPが優位になるほど高速なのでしょうか?
0010デフォルトの名無しさんNGNG
熱湯プレイ
0011デフォルトの名無しさんNGNG
便乗して質問させてください。
UDPの信頼性が保障されてないと言うのは
化けたパケットの破棄だと聞きましたが
それは、間違ったデータは破棄されるので送られない と言う事なのでしょうか?
0012デフォルトの名無しさんNGNG
>>11
化けるより、パケット自体が届かない、フラグメント化した断片が届かない、とかの方が多いかも。
完全なUDPパケットに組み立てられない場合、アプリケーションには届かず、消えてしまう。
0013デフォルトの名無しさんNGNG
>>9
おとなしく、TCPにしておいた方がいいと思います。
チャットプログラム程度で、TCPプロトコルスタックがやっているような
輻輳・再送制御を自前やるって、つらくないですか?

逆に、その辺を手抜きすると、間違いなくTCPより、遅くなる(or信頼性がなくなる)ような。
(たとえば、ftp(TCP)とtftp(UDP)とどちらが速いと思ってます?)
0014デフォルトの名無しさんNGNG
届く順序とか届いたり届かなかったりとかだからねー
オレはそれでもいい、音声や動画など多少データ欠けてもヨシって
ときしかUDPは使わないなあ。
ヘッダと連番はつけるけど。
0015デフォルトの名無しさんNGNG
暇があるんならまずはTCP版をきっちり作って
次にUDP版に移植するのに七転八倒してみるのがいいかもね。
00169NGNG
なるほど・・・
UDPをそこまでして使うメリットは少ないんですね。
0017デフォルトの名無しさんNGNG
↓ソケットのrecv()で0が帰ってくるってどうゆうこと?
http://docs.hp.com/ja/B2355-60104-05/rn17re138.html
0018デフォルトの名無しさんNGNG
FAQ嫁
0019デフォルトの名無しさんNGNG
>>17
なんでHPのサイトなんて見てるの?
http://www.linux.or.jp/JM/#search
0020デフォルトの名無しさんNGNG
うちは2000人規模のチャットサーバーやってるけど
ユーザーのIPの問い合わせに対して返すだけのシステムだからUDP使ってる。
DNSもUDPだしね。
こういう用途だとUDPでも良いんじゃないかな。
0021デフォルトの名無しさんNGNG
質問があります。

メーラをつくり始めているのですが、SMTPサーバとの接続がうまくいきません。
Etherealにてパケットを覗いてみたのですがTCPのコネクションが確立した後の
サーバの応答(220 ***.smtp.server.name.com)に[TCP Zerowindow] [TCP Dup ACK 44#1]
という応答を行っていて、ここで通信が終わっているようです。

この[TCP Zerowindow]はどういう場合に送られるのでしょうか?
0022デフォルトの名無しさんNGNG
>>21
http://pc2.2ch.net/test/read.cgi/tech/1063035045/774
0023デフォルトの名無しさんNGNG
>> 22
過去スレにありましたね
申し訳ないです↓
勉強が足りませんね…
0024デフォルトの名無しさんNGNG
前スレはあのまま放置か?
0025デフォルトの名無しさんNGNG
だいたい1万くらいのコネクション数があるサーバーのプログラムなんですが
これくらいの数だと、コネクション毎にスレッド起こすようなプログラムだとまずいんですかね?
処理内容は、クライアントからの要請でデータを返す、データ参照するようなサーバーなのですが・・・
0026デフォルトの名無しさんNGNG
>>25
サーバーマシンとOSの性能にもよるが、それらが許した上で
要求した性能が出せるならまずくないんじゃない?(笑)
0027デフォルトの名無しさんNGNG
pcapやtcpdumpのプログラムソースはどこで入手できますか?
勉強のために読みたいと思っています。よろしくお願いします。
0028デフォルトの名無しさんNGNG
探せ
0029デフォルトの名無しさんNGNG
接続者からのコマンドを受信して、
printfで表示するプログラムなんですが

void command(SOCKET msgsocket)
{
char command_buf[5];
char buf_temp[1024];
SOCKADDR from;
int fromlen;
while(1)
{

memset(buf_temp,0,sizeof(buf_temp));
fromlen = sizeof(from);
recvfrom(msgsocket, buf_temp, BUF_LEN,0, &from, &fromlen);

//コマンド取り出し。
command_buf[0] = buf_temp[0];
command_buf[1] = buf_temp[1];
command_buf[2] = buf_temp[2];
command_buf[3] = buf_temp[3];
command_buf[4] = '\0';
printf(command_buf);
}
}
何故か、何も表示されません。
勿論接続は成功しています。
なぜでしょうか?
0030デフォルトの名無しさんNGNG
>>27
こんな感じで。
ttp://www.google.com/search?q=source+code+pcap
ttp://www.google.com/search?q=source+code+tcpdump
0031デフォルトの名無しさんNGNG
>>25
Javaだと1000ぐらいでアボーンした
0032デフォルトの名無しさんNGNG
>>25
ネットワーク以前にスレッド1万も作るのは効率悪杉。
OSにはそれぞれ最適化されたハイパフォーマンスなAPIがあるからそれを使うことを検討してみたら?
0033デフォルトの名無しさんNGNG
>>25
ソケットをそれだけ持ってていいのかは知らんけど
数が膨れることがわかってればselectでシングルスレッドですよ
うひょ
0034デフォルトの名無しさんNGNG
selectで一万はしんどいだろ。
003527NGNG
>>30
ありがとうございます。みつかりました。
003625NGNG
なるほど・・・
やはり、スレッドを1万も起こすのは効率悪いですよね。
Selectしかないのでしょうか?

一応ターゲットにしているOSは、Windows2000Serverなのです。
何か良いAPI等はないでしょうか?
あと、プログラムはコンソールアプリとして製作しています。
0037デフォルトの名無しさんNGNG
WSA系の非同期API使え。
サーバの内容にもよるけど一台でこなせなかった場合に備えて
複数台のマシンでの負荷分散も考慮しとけ。
0038デフォルトの名無しさんNGNG
>>29
送信元からの文字コードはあってる?
間違ってると。・・・・
あ、化けるだけか・・・

う〜ん、なんでだろ?
0039デフォルトの名無しさんNGNG
>>37
なるほど
色々調べて見ます。
運悪く初めて何となく買った参考書がUNIX系だったもので、WSA系ってあんまり知らないんですよね(汗
0040デフォルトの名無しさんNGNG
>>34
いや、10を超えたらもうあとはいっしょだよ。難易度的に
0041デフォルトの名無しさんNGNG
>>40
いや、数千を超えたらもうあとはがた落ちだよ。パフォーマンス的に
0042デフォルトの名無しさんNGNG
>>29
recvfrom の戻り値は確認してんの ?
004329NGNG
>>42
う〜ん、どうやら常に-1のようです・・・
何故失敗するんでしょうか?
0044デフォルトの名無しさんNGNG
errnoミロ
0045デフォルトの名無しさんNGNG
>>41
まーそりゃしょうがないよ
1サーバ2,300あたりまでに制限してあとは負荷分散するくらいだろ

ていうかあの書き方だったらアクセス数が多いけど作業量少なそうだから
1万とかでもなんとかなるだろ
0046デフォルトの名無しさんNGNG
フロントエンドとバックエンドを分けるのが理想かなあ
あとはキャッシュかな
0047デフォルトの名無しさんNGNG
Linuxのカーネルから経路情報を取得するプログラムを作るために
UNIXネットワークプログラミングや、zebraを調べているのですが
rt_msghdrの定義が見つかりません。
Linuxには、そもそもないのでしょうか?
もしないなら、どのように経路情報を取得するのか教えてください。
よろしくお願いします。
0048デフォルトの名無しさんNGNG
>>25
1万コネクションともなると、スレッド以前にロードバランシングを
考えたほうがよさそうな気がするのだが。
サーバ1台で処理するとなるとPCサーバではきついっしょ。
0049デフォルトの名無しさんNGNG
>>43
そげなことがあんた以外にわかるわけなかと。
とっとと、>>44 の指示にしたごーたほうがよかと。
005043NGNG
どうもです。
errono見てみます。
005143NGNG
WSAGetLastError() で調べると。
10038というエラーでした。
0052デフォルトの名無しさんNGNG
>>51
ソケット以外のものに対して操作を実行しようとしました。
0053デフォルトの名無しさんNGNG
>>51
http://www.google.co.jp/search?hl=ja&ie=UTF-8&oe=UTF-8&c2coff=1&q=Google%E3%81%ABWSAGetLastError%E3%81%A810038%E3%82%92%E3%81%B6%E3%81%A1%E8%BE%BC%E3%82%93%E3%81%A7%E6%A4%9C%E7%B4%A2%E3%81%97%E3%82%8D%E3%82%84%E3%83%9C%E3%82%B1&lr=
0054デフォルトの名無しさんNGNG
>>51
10038 WSAENOTSOCK 無効なソケットに操作を行っています。

なめとんか ?
005543NGNG
どうもありがとうございます。
何故か、スレッド起こして、ソケット内容を渡す後と前とで番号が変わってました(汗
何かミスったかな・・・

何はともあれどうもありがとうございました。
0056デフォルトの名無しさんNGNG
質問です。
ホームページのネットワークプログラムを動かしたいのですが
Apacheというホームページのプログラムがあると聞いたのですが
Bpacheと言うのを電気屋で見たのですが。
どちらが良いのでしょうか?

環境は
OS:Pentium4
CPU:WindowsMe
HDD:256MB
です。
よろしくお願いします。
0057デフォルトの名無しさんNGNG
AやBなどと言わず、若いんだからCまで頑張れ。
0058デフォルトの名無しさんNGNG
>>56
突っ込みどころ満載だが…
まぁ、初心者のようなので良い事を教えてやろう。

Cpacheってのが良いよ。
あと、多分そんな環境は壊れてるから
買ったPCメーカーに返品したほうが良いよ。
CPUのソケットにOS挿して、HDDにCPU突っ込んで、IDEにメモリ挿したら
普通壊れるからさ
0059デフォルトの名無しさんNGNG
>>55
て言うか、API の戻り値はちゃんと確認した方がいいよ。
特にネットワークだと、相手の問題でエラーになることもあるからね。

>>56
HDD:256MB はありえるけどな。
0060デフォルトの名無しさんNGNG
>>56
万が一 ネタじゃないなら 板違い
0061デフォルトの名無しさんNGNG

ネタでも板違い
0062デフォルトの名無しさんNGNG
WSAENOTSOCK
(10038)
ソケット以外に対してソケット操作が行われた
An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.
0063デフォルトの名無しさんNGNG
質問です。
IRC等は、ポート0同士でデータ転送が出来てますが
あれは、Winsock等を使って実装する事は可能なのでしょうか?
方法があれば教えていただけるとありがたいです。
0064デフォルトの名無しさんNGNG
>>63
IRCじゃなくてIRQでしょ。
そういえば、WinMXもポート0同士での通信に対応してたな
IEのコンポーネント使ってるって聞いた事あるけど、そんなので可能なのかな?
0065デフォルトの名無しさんNGNG
鯖経由してるんじゃないの?
MSNメッセは、ポート0同士の場合、鯖経由だが(だから遅ぇ
0066デフォルトの名無しさんNGNG
IRQは、違うだろ
普通の速度でてるし・・・

鯖は経由してるがデータそのものは経由してない ってのが正しい。
WinSockの機能としては無理
0067デフォルトの名無しさんNGNG
ポート0同士の接続は無理でしょ。
>>63の言うIRCでのデータ転送ってのがDCC-SENDのことなら記憶違いじゃないか? 不可能。
>>64の言うやつも記憶違いでは。無理っしょ
0068デフォルトの名無しさんNGNG
ポート0って事はSoftEitherみたいな仕組みか?
つまり、鯖をハブに見立てて ってやつ
でも、それデバドラ組まないと駄目だと思う。
006963NGNG
やはり無理ですか・・・
う〜ん、鯖経由ですか・・・
どうもありがとうございました。
0070デフォルトの名無しさんNGNG
SoftEtherでも、HUBがlistenしているわけで
それって中央鯖経由するのと変わらない。
0071デフォルトの名無しさんNGNG
IRQ?
0072デフォルトの名無しさんNGNG
○ICQ
×IRQ

IRQって言ったら・・・・
アレだろw
007371NGNG
ICQか。マジでわからなかった。
0074デフォルトの名無しさんNGNG
UDPで、サーバープログラムを作ってるのですが
ローカルから、telnetで設定ポートへ接続を行おうとしたんですが
接続できません。
UDPはtelnetで接続出来ないのでしょうか?
0075デフォルトの名無しさんNGNG
>UDPはtelnetで接続出来ないのでしょうか?
そのとおり。
UDPには接続という概念はありません。
007674NGNG
どうもありがとうございます。
勉強になりました。
0077デフォルトの名無しさんNGNG
UDPは投げっぱなしジャーマンスープレックス
007874NGNG
すみません、1つ疑問なんですが
確かDNSって、UDPでしたよね?
でも、何故かDNSはtelnetで接続出来るんですが・・・
ああいうのは何故なんでしょうか?
0079デフォルトの名無しさんNGNG
>>78
nameserver    42/tcp  name         #Host Name Server
nameserver    42/udp  name         #Host Name Server
008074NGNG
なるほど・・・
TCPも動いてたんですね。
どうもです。「
0081デフォルトの名無しさんNGNG
RTCやDirectPlayを使わずにボイスチャットのソフトを作りたいのですが
音声データをリアルタイムで相手に配信するにはどのようにすればいいのでしょうか?
回線状態によって、100%相手に届かなくてもいいので、UDPが望ましいのですが・・・
0082デフォルトの名無しさんNGNG
>>81
音声のミキシングを行って
WindowsMediaフォーマットSDK で音声をエンコード
あとは、普通に転送でOKだと思う。
0083デフォルトの名無しさんNGNG
ネットワークプログラミング、略してネワプ
0084デフォルトの名無しさんNGNG
>>83
それ、自分で面白いと思って書いたのか?
書き込みした後の気持ちってどんな感じ?
今、どんな心境?
0085デフォルトの名無しさんNGNG
ネプ投げって今もうやってないの?
0086デフォルトの名無しさんNGNG
>>83
どう考えても、ネトプ の方がましだろ。
0087デフォルトの名無しさんNGNG
UDPでプログラムを組んでます。
sendto()で文字列を送信したいのですが

ソケットまでは取得できてる状態で
sendto(msgsocket,buf,1024,0,aaa,sizeof(aaa));
こんな感じでいいのでしょうか?
相手先のアドレスの指定は、どの形式でしょうか?
008887NGNG
struct hostent *server_ent;
char ip_str[] = "localhost";

server_ent = gethostbyname(ip_str);
sendto(msgsocket,buf,1024,0,server_ent->h_addr,server_ent->h_length);

う〜ん、こんな感じだと思ってやったけど、出来ない。
どうすれば良いんでしょうか?
もうさっぱりわからないです。
0089デフォルトの名無しさんNGNG
>>88
sendto()のあて先指定は、IPアドレスじゃなくて sockaddr(IPならsockaddr_in)へのポインタだよ。
0090デフォルトの名無しさんNGNG
>>88

こんな感じで書け。

struct hostent *hp;
struct sockaddr_in addr;

memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(ポート番号);
if (!(hp = gethostbyname(相手ホスト名)))
  エラー処理;
bcopy(hp->h_addr, &addr.sin_addr.s_addr, hp->h_length);

if (sendto(s, buf, sizeof(buf), 0,
    (struct sockaddr *)&addr, sizeof(addr)) < 0)
  エラー処理;

gethostbyname() の結果得られる hostent 構造体の h_addr に
IP address が入ってる (正確には h_addr は配列なので、h_addr
としてアクセスすれば、bcopy の第一引数にそのまま使える) から
それを sockaddr_in 構造体の sin_addr.s_addr にコピー。
アドレスの長さは hostent 構造体の h_length に入ってるから
それを使え。

sockaddr_in 構造体は 0 クリアしてから、sin_family, sin_port,
sin_addr を設定しとけ。sin_port は送信したい宛先ポート番号な。

つーか、スレの先頭の参考書ぐらい嫁。
0091デフォルトの名無しさんNGNG
こんな基本的な質問する奴っていったい何見て勉強してるんだ?
ひたすらネットを漂流して不正確なコードの断片に惑わされているんだろうか。
009287NGNG
>>89
>>90
サンクスです。
無事出来ました。

>>91
家にある参考資料はTCPだけだったり、UNIX用で別の方法で実装されてたりで
ひたすら断片をつなぎ合わせて言ってる感じです。
009390NGNG
>>92
どのプラットフォームでやってるのか知らんが、
マニュアルは読まないのか?
0094デフォルトの名無しさんNGNG
他で聞いたらこっちに誘導されたんですが、
あるパケットがPC1から出発してPC2に届くまでにかかった時間をミリセカンドの単位で測りたいんですがどうすればよいでしょうか?
0095デフォルトの名無しさんNGNG
それは、時間を計るための特別なパケットなのか?
0096デフォルトの名無しさんNGNG
>>94
双方の時刻をちゃんと同期させておいて、双方で
ethereal でも使ってトレース取れば?
009794NGNG
>95
いえ、音声パケットです。
PC1で発した声がPC2で再生されるまでの時間を測りたいのです。
0098デフォルトの名無しさんNGNG
パケットが発射された時間をパケットフォーマットに含めないと
受信側には判りようがない気がするわけだが。
009994NGNG
>96
初めて知りましたethereal

出来ればかかった時間のみをファイルに1列で出力したいのですができませんか?
0100デフォルトの名無しさんNGNG
>>94
安易に ping じゃだめなのかな?
そうでなければ NTP の RFC を読んでみれ。
転送遅延の計り方と計算方法が出ている…筈。
010194NGNG
>98
そうですよね、、言われてみてもっともです。
なにかしら方法はないものですかね?
0102デフォルトの名無しさんNGNG
受信側には、受信した時刻がある。
送信側には、送信した時刻がある。
じゃあ、あとはパケットにuniqなidでも振っておいて、
id:到着時刻とid:送信時刻をつき合わせたらええやん。
010396NGNG
>>99
う〜ん、双方のデータ見て、手で計算すれば? 程度のコメント
だったんだけど...。

双方の ethereal のデータをテキスト化して付き合わせ、
かかった時間を計算するようなスクリプトを書くのは
難しくないと思うけどね。

データ取る、計算する、という手順だから、既存ツールで
一発、ってワケには行かないよ。その辺は自分でささっと
作るベシ。ここはマ板だし、できるでしょ。

libcap 形式にしておいて、tcpdump に喰わせてパケット内容
の一部も表示させて、それをキーに、双方のデータを付き合わせる
ようにすれば、楽だと思うよ。実際に >>99 が期待している音声
データとやらにそのまま適用できるアイデアなのかは知らないけ
どね。
010496NGNG
あ、俺が >>103 で言いたかったことは、
要は >>102 ってことです。

>>102 の言うようなパケットを計測データ
として使えば、計算するスクリプトを書く
のも楽だ、っつーことで。
010594NGNG
>100
pingとは別に値を取りたかったので。

>102
>103
どうもです、Eterealは使ったこと無いのですがとりあえずやってみます。
ありがとうございました!
0106デフォルトの名無しさんNGNG
TTYってなに?
0107デフォルトの名無しさんNGNG
TeleTYpe
0108デフォルトの名無しさんNGNG
Winsockで1つのソケットを複数のスレッドで共有して使うと何かマズーな事が起きますか?
0109デフォルトの名無しさんNGNG
ない。
ライブラリレベルではスレッドセーフだ。
MSの保証はないが。
0110デフォルトの名無しさんNGNG
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/intermediate.html#threadsafety

>一方のスレッドが send() を呼び出し、別のスレッドが同一のソケットに対して
>recv() を呼び出すのは安全である、という伝説があります。
>しかし私はこれを確認したことはありません。
>より堅固な情報やデモンストレーション用のコード、
>さらなる伝説などがあれば、教えていただけると幸いです。

この記述が気になったもんで・・・
大丈夫っすよねー?
0111デフォルトの名無しさんNGNG
スレッドを使うのは厨だ。漢なら(ry
0112デフォルトの名無しさんNGNG
>>92
UNIXでsendto()する場合も、90と基本的に等価になる筈だが。
0113デフォルトの名無しさんNGNG
あ、俺受信スレッドでselect()->recv()回しつつ、メインスレッドでsend()
とか何も考えず普通に使ってたな。
0114デフォルトの名無しさんNGNG
>>113
前にも書いたと思うけど、全てのプラットフォームで、
アプリケーションレベルの排他を無しにそれをやって
破綻しないことが保証されているわけではない。

SVR 系の libsocket + sockmod というダサい実装を引き
ずっている商用 UNIX だとダメ。つっても、商用 UNIX で
イマドキ、そんなダサい実装を引きずってるのは少ない
けどね。

ただし、そういう実装でも read() と write() を競合
させるのは大丈夫。recv() と send() だとダメ。
ポータビリティを考えるなら、ちゃんと、アプリケーション
レベルで排他制御をしなさいってこった。
0115デフォルトの名無しさんNGNG
今は winsock の場合での話だと思うのだが。
0116デフォルトの名無しさんNGNG
今UDPでプログラムを組んでるのですが
len = recvfrom(msgsocket, buf_temp, BUF_LEN,0, &from, &fromlen);//データ受信
if (len=-1)
{
printf("エラーです。No : %d",WSAGetLastError() );//受信ミスの時エラーを吐く
}
}
こんな感じでエラー処理をして、いざテストしてみると
エラーナンバー0とか言い出すんです。
何故でしょうか?
0117デフォルトの名無しさんNGNG
なんでだろ?
0118デフォルトの名無しさんNGNG
(len=-1)
0119デフォルトの名無しさんNGNG
>>116
コンパイラの警告レベルを上げると幸せになるかも
0120116NGNG
すみません。。。。。
お恥ずかしいおはなしで・・・・(汗

==ですね。。。
気づかなかった(恥

どうもありがとうございました。。。
0121デフォルトの名無しさんNGNG
ワロタ
0122デフォルトの名無しさんNGNG
>>114
>ただし、そういう実装でも read() と write() を競合
>させるのは大丈夫。recv() と send() だとダメ。

なんで?
0123デフォルトの名無しさんNGNG
質問です。
Winsockでプログラムを組んでるのですが
Unicodeで送信する場合どうすれば良いのでしょうか?
また、Winsockは特に指定の無い場合はどのコードが使われるのでしょうか?
家にある文献には文字コードの事がまったく書かれてないのです。。。
0124デフォルトの名無しさんNGNG
WINSOCKの「送信」という概念において、載るのは「データ」である。
文字列・コードセット・エンコーディングの規定は主にプロトコルで行われる。
UNICODEで送りたければ勝手に送るがいいさ。
0125114NGNG
>>122
基本から勉強し直しましょう。
0126ホントの114NGNG
>>125 はニセモノ。俺が本物。

>>122
> なんで?
SVR 系の実装だと、send() や recv() がライブラリだからさ。
ソース読めば理由はわかる。
0127デフォルトの名無しさんNGNG
SVR系のソースってSolaris?

# 他のは見ようがないしなぁ…
# つかSolarisのソースって今も見れるんだっけか?
0128デフォルトの名無しさんNGNG
>>127
Solaris は 2.5.1 で sockmod を捨てた (sockfs にした)
から、昔の SVR のダサい実装じゃない。
0129デフォルトの名無しさんNGNG
>>128
Solaris2.6からでは?
0130デフォルトの名無しさんNGNG
>>129
そんな細かいことにこだわるなよ
0131デフォルトの名無しさんNGNG
>>126
SVR ソースなんか持ってねーよ。
lib のがスレッドセーフじゃないのけ?
0132デフォルトの名無しさんNGNG
wininetでsocks経由でHTTP鯖からhtmlをGETするにはいかが致せばよろしいのでしょうか?
wininetでは無理ですか?
単にPROXY経由なら簡単なのだが…
0133デフォルトの名無しさんNGNG
〜でしょうか
〜ですか
〜だが
0134デフォルトの名無しさんNGNG
>>132
HTTPポートに接続してGETリクエストを発行してください。
0135デフォルトの名無しさんNGNG
>>132
SOCKS Version4とか5の事か?
0136132NGNG
>>133
ご指摘ありがとう

>>134
そりは違う

>>135
そうです
0137デフォルトの名無しさんNGNG
IEにsocksプロキシの設定項目があるんだからできるでしょ
0138デフォルトの名無しさんNGNG
ネットの勉強1週間目の初学者です。

SMTP、POP3、FTP、HTTPってDNSサーバをつかってデータを移動させているのではないのですか?
DNSサーバがなくてもいいのですか?
また逆に、データの移動だけならメールとして展開できなくても、
DNSサーバがあればパケットを受け取るだけは受け取れるんでしょうか?

IP-TCP-DNSーSMTPなのか
IP-TCP-SMTPなのか
教えてください。
0139デフォルトの名無しさんNGNG
一週間かけてIPとDNSについてまるで知らないってのは・・・
いきなり「メールの送受信の仕方」を覚えようとしたんだろうなあ
0140132NGNG
>>137
IEでできるかどうかではなく、wininetでやる方法を知りたいのです。
0141デフォルトの名無しさんNGNG
>>138
DNSとかTCP/IPを色々勘違いしていると思われる。
DNSはホスト名とIPアドレスのマッピング(それと電子メールのルーティング情報の
提供)をするときに使われる。
gethostbyname、gethostbyaddrおよびresolverに関して調べてみると良い。
まぁ、その前に知るべきことが山ほどあるように思うけど。
0142デフォルトの名無しさんNGNG
>>138
>SMTP、POP3、FTP、HTTPってDNSサーバをつかってデータを移動させているのではないのですか?
はい

>DNSサーバがなくてもいいのですか?
はい

>また逆に、データの移動だけならメールとして展開できなくても、
>DNSサーバがあればパケットを受け取るだけは受け取れるんでしょうか?
いいえ

>IP-TCP-DNSーSMTPなのか
>IP-TCP-SMTPなのか
IP-TCP-SMTP

他に質問は?
0143デフォルトの名無しさんNGNG
>140
俺は見てないけど、このページは見たのか?
http://www.google.co.jp/search?q=socks+wininet&lr=
0144デフォルトの名無しさんNGNG
>>142
MXは無視ですか?
0145142NGNG
>>144
WinMX は関係無いでしょ。
0146144NGNG
>>145
ネタ?

MXレコード。
0147142NGNG
>>146
釣り
0148144NGNG
>>147
プ
0149デフォルトの名無しさんNGNG
というかもともと>>138の質問がプログラミングの質問でもないような
0150デフォルトの名無しさんNGNG
みんな >>138 に釣られた分けでありますが・・・
0151デフォルトの名無しさんNGNG
>>150
手が込んでいるな。
DNSの質問で、SMTP、POP3、FTP、HTTPを同列にしながら
あえて個別にSMTPを聞いてくるあたり…。
0152デフォルトの名無しさんNGNG
>>138
ネットワークについての質問スレッド Part7
http://pc.2ch.net/test/read.cgi/hack/1071933402/l50
0153デフォルトの名無しさんNGNG
このスレ、いつからC言語のスレみたいにネタスレになったの?
0154138NGNG
>>139>>141-142>>149-151
皆さんレスありがとうございます。
>>141
これから調べてみます。
>>142
霧が晴れました。
>>149
概念がどうも書籍の文章から連想できなかったもので設計までたどり着けなかったもですから。
>>150-151
釣りやネタではありません。本物の初学者の挙動のサンプルにでもしてください。
>>151
それら(DNS、SMTP、POP3、FTP、HTTP)は同列(アプリケーション層)なのに、という意味ですか?
SMTPは例にしただけで全部書くのもくどいかなと思ったものでそうなりました。失礼しました。
>>152
ありがとうございます。行ってみます。
>>153
ネタではありません。


無知ゆえの質問にてお許しください。
0155デフォルトの名無しさんNGNG
>>153
>>1の名前からしてネタスレだが
0156デフォルトの名無しさんNGNG
>>154
ネットワークを使って具体的に何をやりたいのか質問すれば?

このスレは最近、閑古鳥が鳴いているのでネットワーク閑人が
答えてくれるでしょう。
0157デフォルトの名無しさんNGNG
>>155
次スレでは、「名無しさん204.204.204.204」だな。
0158デフォルトの名無しさんNGNG
>>154
どの本を読んでそういう考えに至ったのか興味あるが…。

プログラミングをはじめる前に、まともなTCP/IPの本を読んだり
実際にNetworkを構築したりして、TCP/IPのお勉強をした方が良い。
何をやっているかわからないものをプログラミングすることは
絶対にできませんから。まだ設計云々のレベルじゃない。

>それら(DNS、SMTP、POP3、FTP、HTTP)は同列(アプリケーション層)なのに、という意味ですか?
SMTPが特別なのは>>141に答えが書いてあるのが読めないのかな?
MXが関係するわけだが…。
0159デフォルトの名無しさんNGNG
いまどきパソコン好きな女の子だって、こんな馬鹿な
質問しないよ。いい加減、放置しろよ。
0160デフォルトの名無しさんNGNG
>>158
DNDとFTPも毛色が違うだろ?
0161160NGNG
DND ってなんだ。逝ってくる
0162デフォルトの名無しさんNGNG
この業界じゃ,Drag aNd Drop だな。
0163138NGNG
>>156>>158>>159
レスありがとうございます。
>>156
まずは至極単純なプロキシサーバを作ろうと思っています。
(WAN)モデムとルータ(LAN)の間にかませる「入出全データの丸投げ状態の物」を想像しています。
>>158
ごめんなさい>>141からは、IP-TCP-DNSーSMTPを連想します…。
(っていうかIP-TCP-DNSーIP-TCP-SMTP?また馬鹿なこと言ってたらすみません)
でも、>>144-148のやり取りが理解できたかも。
>>159
背筋が凍ります。知らない町(冬の北海道)で一人ぼっちにされたような気になります。
そんなこと言わないでください。

参考文献(購入順)
基礎からわかるTCP/IPネットワーク実験プログラミングLinux/FreeBSD対応
TCP/IPの絵本
UNIXネットワークプログラミング第2版Vol.1
C言語によるTCP/IPセキュリティプログラミング

全てわかったあとに恥かしくなるような疑問なんでしょうが、いまは大真面目です。
0164デフォルトの名無しさんNGNG
>>163
>(WAN)モデムとルータ(LAN)の間にかませる「入出全データの丸投げ状態の物」を想像しています。

WAN - |モデム - RS232C| - |RS232C - PC - ETHER| - |ETHER - ルータ| - LAN
こんな感じか?

しかし、そんだけ参考文献を読んでおいてあの質問は寒い・・・
0165デフォルトの名無しさんNGNG
>>163
ひょっとしたら、全銀協TCP/IP手順をやりたいわけ?
0166デフォルトの名無しさんNGNG
>>163
>(っていうかIP-TCP-DNSーIP-TCP-SMTP?また馬鹿なこと言ってたらすみません)
>でも、>>144-148のやり取りが理解できたかも。

♂なら氏ね!
0167デフォルトの名無しさんNGNG
つーか相手すんなよ。
全レスしようとするからうざくてたまらん。
0168デフォルトの名無しさんNGNG

         \   ∩─ー、    ====
           \/ ● 、_ `ヽ   ======
           / \( ●  ● |つ
           |   X_入__ノ   ミ   そんな餌で俺様がクマ――!
            、 (_/   ノ /⌒l
            /\___ノ゙_/  /  =====
            〈         __ノ  ====
            \ \_    \
             \___)     \   ======   (´⌒
                \   ___ \__  (´⌒;;(´⌒;;
                  \___)___)(´;;⌒  (´⌒;;  ズザザザ
                               (´⌒; (´⌒;;
0169デフォルトの名無しさんNGNG
マスタリングTCP/IPを100遍読め!
0170デフォルトの名無しさんNGNG
>>168
このコピペ凄い好き。
0171デフォルトの名無しさんNGNG
>>143
FTPには用はない、
なんでVBのページなんか
0172デフォルトの名無しさんNGNG
googleがVBのページに見えるとは凄いな
0173デフォルトの名無しさんNGNG
>>171
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/internetconnect.asp?frame=true
0174デフォルトの名無しさんNGNG
>>172
オマイは指示されたところから先へ進むことができない能無しの脳無しだな
Ω\ζ°)チーン
0175デフォルトの名無しさんNGNG
>>173
つまりこういうことですか?

通常は
InternetOpen
InternetOpenUrl
InternetReadFile
InternetCloseHandle
InternetCloseHandle
だけでhtmlをもらって来れるわけですが、SOCKS経由の場合は
InternetOpen
InternetConnect
HttpOpenRequest
HttpSendRequest
HttpQueryInfo
InternetReadFile
InternetCloseHandle
InternetCloseHandle
InternetCloseHandle
となるわけですか

そう考えるとInternetOpenUrlってのは
InternetConnect、HttpOpenRequest、HttpSendRequest、HttpQueryInfo をまとめて面倒みてくれる便利な関数なんだなぁ
0176132NGNG
失礼、>>175は私です。
0177デフォルトの名無しさんNGNG
Winsockを使ったパケットキャプチャ作って疑問に思ったんですが。
Winsockってイーサネットフレームのデータって取れないんですか?
MACアドレスとtypeの値が欲しいんだけどうまくいかず。
typeが拾えないとしたら、パケットフィルタ作るときにどうやってIPv4とIPv6を区別するんだろう?
VersionはIPv4もIPv6もパケの最初4bitだからそこで処理分岐させるのかなぁ
0178デフォルトの名無しさんNGNG
winpcapにしとけ。
0179デフォルトの名無しさんNGNG
WSAGetLastError と getsockopt SO_ERROR の違いは以下の認識で宜しいでつか?

WSAGetLastError
 ・同じスレッドの最後のエラーコードを取得
 ・エラーはクリアしない

getsockopt SO_ERROR
 ・同じソケットの最後のエラーコードを取得(スレッドは関係なし)
 ・エラーをクリアする

select の exceptfds 等のエラーコードは WSAGetLastError では拾えないので
ソケットに接続した後は getsockopt SO_ERROR でエラーを取得した方が幸せになれる。


0180デフォルトの名無しさんNGNG
>>179
いいえ
0181179NGNG
>>180
どこが間違ってまつか?
0182デフォルトの名無しさんNGNG
>>180
ウソツキ
0183デフォルトの名無しさんNGNG
>>181
「でつ」
0184デフォルトの名無しさんNGNG
>>183
でつ ← 10秒以上見つめるとスヌーピーに見えます
0185デフォルトの名無しさんNGNG
どなたかDelphiのTServerSocketコンポーネントに類似のC++ライブラリ知りませんか?
Delphiで書いたプログラムをLinux/gcc(C++)に移植したいんですが。
0186179NGNG
真面目に答えてくださいよぉ〜。
0187デフォルトの名無しさんNGNG
>>184
を ← 10秒以上見つめると水たまりに足を突っ込めます。
0188デフォルトの名無しさんNGNG
>>187
ワラタ 初めて知った
0189デフォルトの名無しさんNGNG
Linux環境でCによる簡単なサーバを書きかえる必要が出たんだけれど、
IPv6にも必ず対応させるようにと言われましたが、経験が無くてよくわかりません。
IPv4とIPv6の両者に対応させる場合にはどのような点に気をつければいいんでしょうか。

たとえばJavaなら、意識せずにかいても自動的にAPIとカーネルによってIPv6の対応を
すませてもらえるとおもいます(Java1.4、場合によってはLinux2.4が必要)。
Cの場合は、たとえば既存のこのような部分は要修正である、など
どのような点に気を付ければいいのかご教授頂けますか?

よろしくお願いします。
0190デフォルトの名無しさんNGNG
>>189
出来はしらんが、こんな本がある。
『IPv6ネットワークプログラミング』
http://www.amazon.co.jp/exec/obidos/ASIN/4756142362

http://www.ipv6style.jp/jp/apps/20030617/index.shtml
http://www.soi.wide.ad.jp/class/20030030/materials_for_student/11/osamuNP11ver1.0.ppt
0191デフォルトの名無しさんNGNG
どうしてこのスレの住人は性格が悪いのですか?
0192デフォルトの名無しさんNGNG
>>185

commonc++
socket++
よさげな方をどうぞ
0193デフォルトの名無しさんNGNG
>>189
まず、socket(2) 実行時のアドレスファミリ (第一引数)
は AF_INET6 を指定しておくこと。Linux は良く知らない
けど、通常はこれで、IPv4, IPv6 コンパチなソケットが
生成される。KAME カーネルなんかだと、そのあとで
IPV6_V6ONLY オプションを有効にしてやると、IPv6 しか
受け付けなくなるけど。

bind(2) するときも、sockaddr_in6 構造体を用意して
bind(2) しておくこと。bind(2) 時のアドレスの指定
方法なんかは、>>190 が紹介している本を嫁。

accept(2) 時に第二引数をちゃんと指定 (NULL にしない)
するんなら、やっぱり、sockaddr_in6 構造体分のサイズ
を用意しておくこと。

(続く)
0194193NGNG
(続き)

>>190 が紹介している本を持ってるけど、C でのソケット
プログラミングの知識がすでにあるなら、>>190 の本を
読めば、IPv6, IPv4 両方 OK なサーバプログラムなんて、
すぐ作れるよ。ちょっとイマイチな所 (著者の考え方が
偏り気味) もあるし、半分以上が Appendix (内容は RFC
と Internet-Draft) だったりする変わった本だけど、
現時点で IPv6 にフォーカスする (日本語限定) のであ
れば、Stevens 読むより、イイと思う。

イメージ沸かないなら、FreeBSD の inetd のソースを
読んでみるのも参考になっていいぞ。

問題は、>>189 がターゲットとしている Linux のカーネル
が、どこまでマトモに IPv6 を実装しているか、だけどな。

長文、スマソ。

0195デフォルトの名無しさんNGNG
>>190
情報ありがとう。

>>193-194
詳しくありがとう。参考になります。
0196デフォルトの名無しさんNGNG
> まず、socket(2) 実行時のアドレスファミリ (第一引数)は AF_INET6 を指定しておくこと。
場当り的対処だな。美しくない上に将来のことなかまったく考えてない汚いやり方だ。
addrinfo 使えばアドレスファミリに関する操作はかなり抽象化できる。
こんな実装依存の方法を使う必要ないよ。

> イメージ沸かないなら、FreeBSD の inetd のソースを
> 読んでみるのも参考になっていいぞ。
>
> 問題は、>>189 がターゲットとしている Linux のカーネル
> が、どこまでマトモに IPv6 を実装しているか、だけどな。
Linux の v6 スタックが未だ実用に耐えないとでも?(´,_ゝ`)プッ
0197デフォルトの名無しさんNGNG
>>193
> AF_INET6 を指定しておくこと。
> sockaddr_in6 構造体を用意してbind(2) しておくこと。
> sockaddr_in6 構造体分のサイズを用意しておくこと。

この部分はまずい。
AFやPFに依存しないコードを書いた方が良い。
それは簡単にできる。

もちろんFTPの様にIPアドレス、ポート番号を直接扱うプロトコルだと、
その部分「だけ」は明確に書かざるを得ないけどね。

> 偏り気味

藁
0198デフォルトの名無しさんNGNG
>>196
> 場当り的対処だな。
ハァ? AF_INET6 指定で socket(2) をコールせずに IPv6 が
使えるとでも?

> Linux の v6 スタックが未だ実用に耐えないとでも?
だーかーらー、『>>189 がターゲットとしている』とわざわざ
書いてるだろ? どのバージョンのカーネルを使うかわかんねー
じゃん。最新の (2.6 だっけ?) はちゃんと実装されてるらしい
ね。けど、プログラミングに関する部分って、まだまだ、RFC
になっていなくて、実装による違いが出る部分も多いから、
注意が必要だよね。
0199198NGNG
ああ、>>196 の言っている『addrinfo』って
getaddrinfo() のことか。なら納得。

それなら、bind(2) の説明のところを引用すべき
だったね。socket(2) の所を引用しているから、
はぁ? とオモタ。
0200197NGNG
> なら納得。

要するに、返ってきた構造体の
getaddrinfo(3): ai_family, ai_socktype, ai_protocol, ai_addrlen
gethostbyname(3): h_addrtype, h_length
を使え、自分でマクロ定数を書くのは必要最小限に。

最低限: URLの// →AF_INET, AF_INET6に限定など。
0201199NGNG
>>200
うん。そーだね。そういう作りが望ましい。
そーゆー話が、>>190 の本に書いてあるんで、やっぱ、
参考書としてはいいんでないかい?
0202195NGNG
なるほど、getaddrinfoを使えば仮想的に扱えるんですね。
将来的にまた新しいIPが出てきても問題ない、と。

・・・こういう理解でいいのかな?とりあえずはgetaddrinfoを基本として
そのほか紹介されたAPIも調べつつ、本も読みつつ、やってみたいと思います。
0203デフォルトの名無しさんNGNG
>>179
select exceptfds は、getsockopt SO_ERROR でエラーを取得。
それ以外は、WSAGetLastError でエラーを取得するべし。

また、エラーメッセージはFormatMessageで取得するあるよろし。
0204デフォルトの名無しさんNGNG
おしえてください
HTTPにてサーバーを読みに行くと
ノートンインターネットセキュリティにつかまります.
回避したいのですがノートンから認証とればOKですか
また、つかまるのはHTTPだけですか?
おねがいします。
0205デフォルトの名無しさんNGNG
>>204
どの辺がネットワークプログラミングと関係あるのかと
小一時間。
0206デフォルトの名無しさんNGNG
httpsで通信すればオッケーですヨ。
0207デフォルトの名無しさんNGNG
>>206
ありがとうございます
0208デフォルトの名無しさんNGNG
Port0で通信ってどういうこと?
検索してもWinny関連しかヒットしない(´・ω・`)ショボーン
0209デフォルトの名無しさんNGNG
P2P用語で、Proxyの中に居るなどで、こちら側がたとえlistenしても、
向こうからはconnectできない状態にあるってこと。つまり、
こっちからconnectするしかない。
0210デフォルトの名無しさんNGNG
う〜む
何とか通信速度を犠牲にせずにポート0通信をやる方法ないかな・・・

鯖を介して通信するとポート0通信は可能だけど、それだと通信速度が落ちるし・・・
何か良い方法は無いものか・・・
0211デフォルトの名無しさんNGNG
通信速度は関係ないんだけど。
全てがポート0になると、どことも接続できなくて困るだけ。
0212デフォルトの名無しさんNGNG
>>209
どうしてそれを「port0」通信って呼ぶのかな?
ポート番号0じゃなくて、ローカルのポートを一つも(ゼロ個)事前割当てしないって事?
0213デフォルトの名無しさんNGNG
>>210
Port0同士で接続する方法が見つかれば大発見
0214デフォルトの名無しさんNGNG
>>213
あるだろ。
rfc3489とか、UDP hole punching あたりで検索してみろ。
0215208NGNG
>>209
サンクス。P2P用語だったのね・・・
Port0で通信するなんてWinnyってTCPパケットレベルでいじってたのか。う〜ん。
0216デフォルトの名無しさんNGNG
>>214
へぇ、、そういうのあるんだ・・・
でも個人で実装できるレベルのものなの?
Winsock使えます ってレベルじゃ無理じゃないかな?
ソースが公開されてるとかなら何とかなりそうだけど・・・
0217デフォルトの名無しさんNGNG
>>215
> Port0で通信するなんてWinnyってTCPパケットレベルでいじってたのか。う〜ん。

なんか勘違いしてないか?(w

>>216
routerとかfirewallがsupportしてないと…
0218デフォルトの名無しさんNGNG
>>217
RFC3489ってSTUNの事だよね?
確か、STUNはルーター非依存じゃなかったっけ?
相性問題でウマく行かない事が多いとか聞いたけど
0219デフォルトの名無しさんNGNG
>212
これは予想やけど、P2Pアプリで、listenポートを入力する欄があって、
そこが0だとconnectしかしない(listenしない)モードになるような
インターフェース設計のが有ったからではないかと。
0220デフォルトの名無しさんNGNG
STUNってSTUNサーバなきゃだめじゃん、
完全ポイントツーポイントでport0同士ってわけじゃなく
サーバ介してポートをあけるような
振る舞いをさせるもの、ルータに。

ルータ非依存じゃなく、たまたま
多くのNATルータで動いてしまう。
0221デフォルトの名無しさんNGNG
UDP hole punching と STUNの違いは?
0222sageNGNG
【指令】winsock日本語ドキュメントへのポインタを示しなさい。

  提出期限は、本日0時とする。
  以上。
0223デフォルトの名無しさんNGNG
氏ね
0224デフォルトの名無しさんNGNG
ぬるぽいんた
0225デフォルトの名無しさんNGNG
本日0時はとっくに過ぎてますよ
0226デフォルトの名無しさんNGNG
( ・∀・)⊃─[]ガッ
[    ]  (・∀・ )←>>224
0227sageNGNG
あと4分ですよ?
0228デフォルトの名無しさんNGNG
>225を百回嫁低脳
>225を百回嫁低脳
>225を百回嫁低脳
0229sageNGNG
>>228
知らないことは知らないと素直に言う勇気
0230デフォルトの名無しさんNGNG
「知らないことは知らない」
0231デフォルトの名無しさんNGNG
そんな事言って情報引き出そうとしてもだめー
とっととお帰り。
0232sageNGNG
じゃぁ帰るからお礼になんかください
0233デフォルトの名無しさんNGNG
Windows 2000+VC6.0で WEBサーバにアクセスするプログラムを書いて
ベンキョしたいと思っているのですが、なにかよい書籍はないでしょうか。
以下2点が検索されたのですがは古くないでしょうか?
・WinSock2.0プログラミング(1998)
・Win32ネットワークプログラミング(1998)
0234デフォルトの名無しさんNGNG
rfc2616
0235デフォルトの名無しさんNGNG
>>233
>>3の
| Webプロトコル詳解―HTTP/1.1、Webキャッシング、トラフィック特性分析
| http://www.amazon.co.jp/exec/obidos/ASIN/4894715414
読め
0236デフォルトの名無しさんNGNG
初めまして。
小生ただいま、クライアントJavaアプリを作成しています。
下記HPに必要事項をクエリとして投げて(POSTして)みたのですが、
次の画面(Submitボタンを押した後の画面)に遷移しません。
遷移後の画面からhtmlソースを取得することが目的です。
http://www.ncbi.nlm.nih.gov/BLAST/Blast.cgi

htmlソースを見ると、JavaScriptを使用して送信?を行っているようです。
試しに、ブラウザのURL欄にSubmitボタンのアクション"javascript:document.forms[0].submit();"
を代入して移動すると、Submitボタンを押した後の画面に遷移しました。
GoogleやYahooのような検索エンジンで試してみると正しく次の画面に遷移します。
POSTの処理は、きちんと行われているようです。

JavaScriptが介入してくると、ブラウザの起動は必須なのかなと思い、
アプレットやswt3.0のBrowserClass使って簡単なブラウザを作ってみたりしたのですが、
どちらもいまいち上手く行きませんでした。(特にBrowserクラスは出たばっかりみたいで…)
JavaクライアントアプリケーションでJavaScriptを実行する方法等教えて頂けないでしょうか。

ご教授の程、よろしくお願い申し上げます。
0237デフォルトの名無しさんNGNG
//以下ソースです。長文スミマセン
import java.io.*;
import java.net.*;
public class SubmitButtonTest {
public static void main(String[] args) throws IOException {
URL url = new URL("http://www.ncbi.nlm.nih.gov/BLAST/Blast.cgi?");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
String postdata = "ALIGNMENTS=0&ALIGNMENT_VIEW=Pairwise&" +
"AUTO_FORMAT=Semiauto&CLIENT=web&DATABASE=swissprot&DESCRIPTIONS=50&" +
"ENTREZ_QUERY=Mus+musculus+[ORGN]+OR+Homo+Sapiens+[ORGN]+OR+Rattus+norvegicus+[ORGN]&" +
"ENTREZ_QUERY=All+organisms&EXPECT=1&FILTER=L&FORMAT_BLOCK_ON_RESPAGE=None&" +
"FORMAT_ENTREZ_QUERY=All+organisms&FORMAT_OBJECT=Alignment&FORMAT_TYPE=HTML&" +
"GAPCOSTS=11+1&GENETIC_CODE=1&GET_SEQUENCE=on&LAYOUT=TwoWindows&" +
"MATRIX_NAME=BLOSUM62&NCBI_GI=on&PAGE=Translations&PROGRAM=blastx&QUERY=BG076932&" +
"SERVICE=plain&SET_DEFAULTS.x=22&SET_DEFAULTS.y=12&SHOW_LINKOUT=on&SHOW_OVERVIEW=on&" +
"UNGAPPED_ALIGNMENT=no&WORD_SIZE=3&END_OF_HTTPGET=Yes";

//ストリームを取得してデータをセット
con.setDoOutput(true);
//URL 要求のメソッドをPOSTに設定します。
con.setRequestMethod("POST");
//送信
con.connect();
//応答をすべて標準出力へ
BufferedReader breader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
while((line = breader.readLine()) != null){
System.out.println (line);
}
con.disconnect();
}
}
0238デフォルトの名無しさんNGNG
ネットワークプログラミング相談室って次第にレベルが落ちているな。
0239デフォルトの名無しさんNGNG
>>238
レベルもなにも・・・
ネットワークプログラミング限定での話しになると、このレベルしか話しようがないだろ・・・
それ以上のレベルになると個人レベルでの実装は不可能な話になるし
0240デフォルトの名無しさんNGNG
いや、過去スレと比べての話だよ。
0241デフォルトの名無しさんNGNG
質問。
STUNもそうだけどさ
つまり内部からルーターにある指令を送って特定のポートを随時開放するって事だよね?
って事は、どういうパケットを送ってるの?STUNは

何か調べたけど、有料なSDKとかしかないし・・・
おまけに英語は読めないし(実は日本語すら読み書きはかなり辛い、、当方台湾人故。。。)
0242デフォルトの名無しさんNGNG
先に英語を読めるようになったほうがいいと思うがどうか。
0243デフォルトの名無しさんNGNG
>>242
今は日本に居るので、日本語を覚えるのが急務だったもので…
中1の時に引っ越したのでこっちで英語の勉強をするような余裕がなかったです。(高校では騙し騙しその場しのぎで単位取ってたし
無事大学は入れたもののその後どうしようかと・・・(汗
やはり先に英語の勉強した方が良いですかね。
一応技術関係の話は日本で覚えたので日本語の方がわかりやすかったりします。
0244デフォルトの名無しさんNGNG
技術英語なんて英語力と言うより気合と専門用語のボキャブラ勝負だ。
コンピュータ用語なんてほとんど元は英語だから、知ってる単語だけ
拾って読んでも意味は通じる。
0245デフォルトの名無しさんNGNG
https://sourceforge.net/projects/stun/
http://freshmeat.net/projects/stund/?topic_id=20%2C87%2C809%2C150%2C151

英語はともかくgoogleくらい使えるようになれ
0246デフォルトの名無しさんNGNG
>>245
英 語 は と も か く と 言 い な が ら、 英 語 の ペ ー ジ の

リ ン ク を 張 る ア ナ タ っ て 素 敵。 
0247デフォルトの名無しさんNGNG
Cのプログラムは読めるんじゃねえの?

> って事は、どういうパケットを送ってるの?STUNは

は分かるよ。
0248デフォルトの名無しさんNGNG
簡単にいえば、NAT下で、TCPのConnect要求を出すと、
(コネクションパケットの)DstIP:DstPort から Routerへきた
パケットについて、SrcIPへ転送するような設定がされるわけだな。

これがUDPの場合、Connectionが云々できないわけで、NATルータとしても、
「外に出したUDPのDstPortについては、無条件でSrcIPに転送する」という
バータリーな対応に成るわけ。何故、DstIPを無視するかは知らない。
だから、特別なルータ指令パケットというものはない。

だから、初期の穴開け時だけサーバを介すれば、二者間で直接通信ができると。
こんな理解でいいのかな?
0249デフォルトの名無しさんNGNG
C++の入門本などに載っている問題を載せたら問いてくれますか?
解答例のない本を買ってしまって・・・独学で勉強してるんですが
全く分からなくて困っています。
0250デフォルトの名無しさんNGNG
スレ違いです。
0251sageNGNG
まぁまぁ、そう言わずに・・・
0252デフォルトの名無しさんNGNG
厨がよってきたぞ
0253デフォルトの名無しさんNGNG
ホントだ、>>252 がいるもんな。
0254sageNGNG
ヾ(≧▽≦)ノギャハゥ

ぅけるぅ
0255デフォルトの名無しさんNGNG
>>249
ぼるじょあがC/C++の宿題を片づけますYO! 19代目
http://pc2.2ch.net/test/read.cgi/tech/1073566342/
0256デフォルトの名無しさんNGNG
質問。
Winsockでファイルの転送をする場合
sendだと文字しか遅れませんよね?
ファイルを文字列へエンコードしてから転送すれば良いのでしょうか?
0257デフォルトの名無しさんNGNG
データ問い合わせ型プログラムでUDPを使おうと思ってるのですが

<サーバー(Port1000)>--------<クライアント(Port0)>

と言う感じで、クライアント側がNATでポート0の場合
クライアントからサーバーへのデータ問い合わせは可能だと思いますが
それに対してデータを返す時、コネクション型ではないため返信不能になるのでしょうか?
DNSの仕組みだといけてるっぽいですが・・・
0258デフォルトの名無しさんNGNG
NetBios名をつかった通信はできるのでしょうか。
プロトコルはNetBeuiのみで、です。
0259デフォルトの名無しさんNGNG
>>256
> sendだと文字しか遅れませんよね?

よくわからんが、socketはバイナリしか扱えないよ。

>>257
ポート0ってどこのローカル用語?
0260デフォルトの名無しさんNGNG
>>259
ポートが開いてないって言う意味でしょ。
一般ユーザーが良く使う言葉

使用例)
ポート0同士では接続出来ない。
0261デフォルトの名無しさんNGNG
っていうか、数レス前にポート0通信って話が出てるジャン
STUNやらの話題で・・
0262デフォルトの名無しさんNGNG
ほんと意味不明な命名だな。
0263デフォルトの名無しさんNGNG
じゃあ>>257の Port1000 ってのは一体何なんだ?
ポート番号1000なのか、それともまたわけわからん意味でもあるのか?
0264デフォルトの名無しさんNGNG
友達同士の雑談じゃねえんだからまともな用語を使えよ。
0265デフォルトの名無しさんNGNG
なんでそんなに突っかかる必要があるんだ…
Port0って用語は>>257が定義したわけじゃないだろ
0266デフォルトの名無しさんNGNG
不正確な表現で混乱するのはよくないな。
>>264 に賛成。
0267デフォルトの名無しさんNGNG
↓Port0と同じ意味のまともな用語
0268デフォルトの名無しさんNGNG
やらないか?
0269デフォルトの名無しさんNGNG
>>256
> sendだと文字しか遅れませんよね?

バイナリだと (* 遅れない *) とでも思ってんのか ? (藁
0270デフォルトの名無しさんNGNG
>>258
名前付きパイプとかメールスロットを使え。
0271デフォルトの名無しさんNGNG
>>265
>>257はPort0とPort1000を同列に扱っているがそれでいいんだろうか?
0272デフォルトの名無しさんNGNG
Port0 ごときで、何騒いでいるんだろう...。
知らなきゃ (or 気に入らなきゃ) 無視すればいいだけなのにねぇ...。
0273デフォルトの名無しさんNGNG
もはやPort0は市民権を得た、標準の用語だよ。
時代に後れた人たちは厄介だねえ・・・
0274デフォルトの名無しさんNGNG
>>272
お前もな。
0275257NGNG
あの〜
ポートの事でお騒がせしてしまったようですが
どうなのでしょうか?

ちなみにサーバー側のポート1000は何でも良いのですが
とりあえず開いていてNATを越える事が出来る状況という事で
クライアント側のポート0はNATで遮られてるという意味で・・・
0276デフォルトの名無しさんNGNG
他のポート使えば?
0277デフォルトの名無しさんNGNG
>>273
そういうセリフは、そのキーワードがRFCに載ってから言ってくれよ。
0278デフォルトの名無しさんNGNG
別にここ 2ch だしー。
0279デフォルトの名無しさんNGNG
draftくらいで許してやれ
0280デフォルトの名無しさんNGNG
port0ってWinny用語じゃないの?
0281デフォルトの名無しさんNGNG
>>275
データグラムにおいてもサーバー側がポート開いていれば問題ない
ストリームと一緒
0282デフォルトの名無しさんNGNG
ポートの話はUnix板か犬糞板でやってくれ。
0283デフォルトの名無しさんNGNG
お前ら下らん論議するなよ
話題ズレまくり

>>275
DNSが何故結果を返せてるか考えてみ
必ずしもコネクションしなければ返せないわけではない。
まぁ、bindのソースでも見てみる事をお勧めする。
0284デフォルトの名無しさんNGNG
質問です。
今組んでるプログラムで、1つのアプリケーションの中で
DirectPlayとWinSockのTCP&UDPを使いたいんですけど
ポートを共用する事は可能でしょうか?
0285デフォルトの名無しさんNGNG
TCPの接続はな、双方のIPアドレス、ポート番号の四つ組で識別する。
だから、TCPに限って言えば、一つのポート番号をどれだけの接続で利用しても問題ない。
でなければ、複数のクライアントを同時に相手できないでしょ。
0286デフォルトの名無しさんNGNG
>>257,>>275
普通のルータならNAT越えの時に記憶するので、UDPのアンサーはクライアントに
戻ってくるよ。
0287デフォルトの名無しさんNGNG
"port0"とかいう奇怪な用語で問題になっとるのは、
UDPにしてもTCPにしても外からコミュニケーションが始まるときのことじゃろ。
0288デフォルトの名無しさんNGNG
パケットいじって Port を 0 にしてUDPパケット送ったらどうなるの?
0289デフォルトの名無しさんNGNG
>>288
作ったように動くだろうね。
0290デフォルトの名無しさんNGNG
http://www.iana.org/assignments/port-numbers
0/tcp Reserved
0/udp Reserved
ほーReservedか。
0291デフォルトの名無しさんNGNG
>>285 >>286

NATは、UDPを「4つ」の組で識別しているのだろうか?
0292デフォルトの名無しさんNGNG
>>291
こんな感じじゃない?

送信元IP,送信元ポート,送信元ポート(ルータ),送信先IP,送信先ポート,プロトコル,TTL
0293292NGNG
ついでに、TCPのプロトコルスタックでソケットを識別するために使う情報は

自分のIP,自分のポート,相手のIP,相手のポート

だと思う。

ルータのNATとは別物だけど、FTPを通す為とかでセッション管理もしてるだろうし、
やってる訳では無いのでよく分かりません。
0294291NGNG
UDPで、外→内へのパケットの場合、NATは、実は外側IPのチェックはしていないって話はないですか?
0295デフォルトの名無しさんNGNG
本来してるけど、利便性のためにあえて許可したって感じでしょ。
Linux(2.2まで)のNATだと標準で許可してなかったよね。
0296デフォルトの名無しさんNGNG
>291
UDPも4つ。
動作中のルータの変換テーブル表示させれば判る。
タイムアウトがあるからコネクションレスのUDPでも変換エントリはちゃんと消える。
タイムアウトが短かすぎるとDNSの名前解決も失敗することがあるよ。

>294
上の通り、NAT/IPマスカレードの動作としてはそうだな。
相手とかフラグとかチェックするのはフィルタの仕事だと思うぞ。

外側というのがルータのWAN側アドレスのことなら、
自分宛のパケットじゃなければ無視すると思う。
ふつう届かんし。
0297デフォルトの名無しさんNGNG
パケットフィルタについて質問なんですが。
IPアドレスのマッチングってどのように行っているのでしょうか?

パケットの格納用構造体作成
memcpy(&構造体メンバ名, p, 4); で指定した構造体メンバへIPアドレスのデータを書き込み
↑ p /*pointer*/
ユーザーの指定したIPアドレスを関数を使って32bitバイナリデータに変換
「構造体メンバに格納した値」 == ユーザー入力したIPアドレスを変換したもの
↑のような流れでやっいるのかと思い、実際組んでみたら動かず・・・。
作ってみたヤツ↓
struct {
struct in_addr ip_src; //SourceIP
struct in_addr ip_dst; //DestIP
/*他のパケットの項目については省略*/
}IPv4;

struct ufilter{
unsigned char uip_src[16];
unsigned char uip_dst[16];
/*他の項目は省略*/
}UFILTER;
if(IPv4.ip_src == inet_addr(UFILTER.uip_src))
{ //一致した場合の処理}

structへの不正とメッセージが表記され、無理やり動かすと、パケットデータが入ってないという感じのメッセージがでます。
構造体の中にある構造体へのアクセスの仕方が良くないのでしょうか?(ip_srcのアドレスがキチント取得できてない?)
プログラム始めたばかりなので、至らぬ所多々あると思いますが、よろしくお願いします。
*windows2k、VC6.0でやっています。
*Winpcapは、何やってるか良くわからないので使用していません
0298297NGNG
すいません自己解決しました。

(´・ω・`)メンバの指定の仕方がダメポだったみたいです。
お騒がせしました。
0299デフォルトの名無しさんNGNG
>>294
そりゃ、外/内っていうより、
どちらのIPアドレスを変換する応用/運用なのかによるんじゃない?

プライベートIPアドレスを内側で運用していてってケースが一番多いから、
内側の話ばかりになるんだけども。

VPN + NATの時は双方向変換ありえるよね。
0300デフォルトの名無しさんNGNG
300
0301JJ078078.ppp.dion.ne.jpNGNG
guest guest
0302デフォルトの名無しさんNGNG
微妙に凄いホスト名キター
0303デフォルトの名無しさんNGNG
DIONの那覇市か
0304デフォルトの名無しさんNGNG
凄いホスト名だなw
覚えられやすいホスト名ってのは個人的に精神衛生上あまり好きじゃない
0305デフォルトの名無しさんNGNG
>>304
proxy.***.co.jpとか?
0306JJ078078.ppp.dion.ne.jpNGNG
ただ自分のhostname確認したいから書いただけなんだけどな…
ま、固定じゃないから近いうちに変わるだろう

guest guest
0307デフォルトの名無しさんNGNG
0308デフォルトの名無しさんNGNG
ここで釣りしても良いですか?
0309デフォルトの名無しさんNGNG
餌が悪いと魚から叩かれます。
0310デフォルトの名無しさんNGNG
VC++ 6.0 Win2000です。
LAN上のPC1(win 2000)からPC2(win 2000)をシャットダウンさせたいと思っています。

まずPC2にログインしなきゃいけないようなのですが、ログインできてないのです。
↓これで何が足りないのでしょうか。
NETRESOURCE NetRes;
NetRes.dwType = RESOURCETYPE_DISK;
NetRes.lpRemoteName = "\\PC2\IPC$";
DWORD ret = WNetAddConnection2( &NetRes, "ユーザ名", "パスワード", CONNECT_UPDATE_PROFILE );

retには1231のint値がはいっているようなのです。
WNetAddConnection2の返り値もよくわからない…
0311デフォルトの名無しさんNGNG
>>310
> NetRes.lpRemoteName = "\\PC2\IPC$";

デバッガでこの行の次の行で止めて、NetRes.lpRemoteName の指す先にあんたの思ってる文字列が入っているか確認した方がいいと思うよ。

> WNetAddConnection2の返り値もよくわからない…

MSDN も見ないのか ?

If the function fails, the return value is a system error code, such as one of the following values.
0312デフォルトの名無しさんNGNG
あ、NetRes.lpRemoteName = "\\\\PC2\\IPC$";
にしてました。 ↑の間違い。
返り値については、MSDNみてます。でも1231がどのエラーコードかわからない。。。
switch( ret )
{
case ERROR_SESSION_CREDENTIAL_CONFLICT :
 printf("A");
 break;
case ERROR_ACCESS_DENIED :
 printf("B")
 break;
…
でretがどれかみようとしてるんだけど、どれにも該当してない。。。
retからどのエラーかってわからないし。
0313デフォルトの名無しさんNGNG
>>312
C:\>net helpmsg 1231

ネットワークに到達できません。ネットワークのトラブルシューティングについては、
Windows ヘルプを参照してください。
0314デフォルトの名無しさんNGNG
>>308=>>310?
0315デフォルトの名無しさんNGNG
>>312
> case ERROR_SESSION_CREDENTIAL_CONFLICT :

WNetAddConnection2() はそんなエラーコードを返さないけど ?
いったい何を参考にプログラムを組んでいるのか不思議でしょうがない。

> retからどのエラーかってわからないし。

ちゃんとやるなら、FormatMessage() を使うべし。
とりあえず調べたいなら、ヘッダーファイルを検索しまくるとか、MSDN を検索しまくるとか...。

まあ、ここでも見とけ http://msdn.microsoft.com/library/en-us/debug/base/system_error_codes.asp
0316sageNGNG
ヾ(≧▽≦)ノギャハゥ
0317デフォルトの名無しさんNGNG
何人かつれて喜んでいるようだ。
0318sageNGNG
MSDNは、わざとわからないように書いてあると思います。
お前ごときがいくらがんばっても無駄ってことだと思います。
0319<br> NGNG

0320デフォルトの名無しさんNGNG
韓国の次世代インターネット技術、世界標準に
http://japanese.joins.com/html/2002/1016/20021016172250300.html

韓国が提示した次世代インターネット(IPv6)技術が世界標準として採択された。
0321デフォルトの名無しさんNGNG
また昔の記事を……
0322デフォルトの名無しさんNGNG
質問です。
サーバー&クライアント型のアプリの場合
待ち受けになる側のサーバーは必ずいずれかのポートを開放してる必要があるのでしょうか?
接続する側のクライアントがポートを開放してる場合でも駄目なのでしょうか?
よろしくお願いします。
0323デフォルトの名無しさんNGNG
その通りですヨ。
0324デフォルトの名無しさんNGNG
>>322
ソケットのレベルではサーバ、クライアントで別のコードを書けますが、
TCP/UDPのレベルでは、両者は対称です。どちらが先にSYNを送るかの違い。

Firewallは、先に送った方をクライアントと見做して処理を行いますので、
逆(サーバ側のみ)なら可能ですが、あなたの言っているのは無理です。
0325デフォルトの名無しさんNGNG
>>322
Port0を使えば問題ない
それはwinnyやwinmxで実証済み
0326デフォルトの名無しさんNGNG
それはサーバーとは言わない。
0327デフォルトの名無しさんNGNG
>>325
ヒソ(´Д)ヒソ(´Д`)ヒソ(Д`)ヒソ
0328デフォルトの名無しさんNGNG
>>326
0329デフォルトの名無しさんNGNG
>>325
( ゚д゚)ポカーン




    。 。
   / / ポーン!
(  Д )
0330デフォルトの名無しさんNGNG
>>325=>>328

>>325
(´,_ゝ`)プッ
0331328NGNG
なんでそう思うんだろう。
0332デフォルトの名無しさんNGNG
俺もそういうのはサーバーとは言わないと思うが。
0333デフォルトの名無しさんNGNG
俺も
0334デフォルトの名無しさんNGNG
>>325
(  д )         ゚ ゚
0335デフォルトの名無しさんNGNG
>>310=>>322=>>325=>>308
0336デフォルトの名無しさんNGNG
⊂⌒~⊃。Д。)⊃ po-to0 po-to0 po-to0
0337デフォルトの名無しさんNGNG
>>273=>>325
0338デフォルトの名無しさんNGNG
不特定多数が参加するMMO(というわりには規模がちいさいけど、イメージ的にはそれ)を作っています
マルチスレッドを使おうと思ったのですが、色々訳あって現在はシングル+非同期winsockでやっております

そこで質問なのですが、winsockでconnectを同期せず(connectで止まらず)に行うには
AASyncを使うしかないのでしょうか
recv, sendはソケットのオプション変更で非同期にできたのですが…
プレイヤーがログインしたとき、データベースサーバーにコネクションを張らせたいのです
マルチスレッドにするしかないでしょうか?
0339デフォルトの名無しさんNGNG
非同期ソケットとノンブロックソケットがごちゃごちゃになってませんか。
とりあえずconnectする前にノンブロック設定しておけば、止まることはないけど。

ところでさ、データベースへのコネクションって大抵あらかじめ何本かキープしておいて
それをリクエスト毎に使いまわしたりしないの?
その仕組みだとゲームサーバとデータベースが、同数のコネクション管理しなきゃいけなくなりそうだけど。
0340デフォルトの名無しさんNGNG
がんばってるなぁ・・・
俺なら迷わずDirectPlayだ(駄目だなw
0341デフォルトの名無しさんNGNG
ユーザの処理をさばくのと
DBアクセスをするのは
別スレ群にしたほうがええと思うズラ
0342デフォルトの名無しさんNGNG
GetLastError() と WSAGetLastError() と同じ内容を返すけど
WSAGetLastError() は使わなくっても良いですか?
0343デフォルトの名無しさんNGNG
WSA関連の後はWSAGetLastErrorにしたほうがええと思う
いつ何が起こるかわからんし
0344デフォルトの名無しさんNGNG
>>343 同意。現状同じ値を返してるってだけだからね。
0345デフォルトの名無しさんNGNG
つーかヘルプに書いてあるんだから、勝手に GetLastError() でいいやと思う神経が信じられん。
0346デフォルトの名無しさんNGNG
世の中には結果オーライというコトバもある。・・・時と場合に夜けどね。
0347デフォルトの名無しさんNGNG
世の中には出鱈目って言葉もあるけど、出鱈目にプログラミングしていい訳ではない。
0348デフォルトの名無しさんNGNG
バグがあるとき、出鱈目な部分があると、そこが原因なのかと
疑わなくてはならなくなる。最初からきちんとやっておけと言いたい。
0349デフォルトの名無しさんNGNG
HTTP で,keep-alive って事で待機させているソケットがあります。
前回使ってからかなり時間が経ってるものの,とりあえず connect すると
errno が EISCONN でした。
しかしリクエストを送っても,何もレスポンスが返ってきませんでした。

こんな場合,本当にまだ接続が続いているかどうかを調べるには
select で読み出し可能であるかどうかを調べるのが最適解でしょうか?
リクエストを送る前にも関らず読み出し可能ならば,
それは接続が切られてる事を表し,recv の結果は 0 のはずだって事で。
0350349NGNG
あー,つーかすんません。いきなり質問撤回。
すぐに使い回すかどうかが明らかでないのに
Keep-Alive なんかするな,ていうのがファイナルアンサーですね。

あー,でも HTTP プロクシを作ってる場合だとやっぱり悩みそうな。。。
でも今は HTTP プロクシ作ってるわけじゃないので,やっぱしいいス。スマソコ。
0351デフォルトの名無しさんNGNG
>>350
ところでなんでkeep-alive?
persistentじゃないの?
0352デフォルトの名無しさんNGNG
>>349
あのなあ、どんな時でも、

> しかしリクエストを送っても,何もレスポンスが返ってきませんでした。

を想定して対応する必要がある。これがネットワークプログラミングなわけ。

「簡単に」「必ず」返事が返ってくるかどうか調べる方法があると思うな。
返事はYES, NOに加えて、⊥(bottom)があり得るのがネットワークなのだ。

とお兄さんは言いました。
0353デフォルトの名無しさんNGNG
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回くらいまで耐えることもあり、
全く見当もつきません。

何が悪いのでしょうか・・・?
0354デフォルトの名無しさんNGNG
MSG_PEEKは止めとけ、という話がどっかに有った気がする。
0355デフォルトの名無しさんNGNG
>>354
http://tangentsoft.net/wskfaq/newbie.html#peeking
でしょ。

Winsock、糞スタックの本領発揮。よくこんなのリリースしてる/たよな。
0356デフォルトの名無しさんNGNG
>>355
日本語のページの方が良いかと。
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/newbie.html#peeking

Winsock で MSG_PEEK すると起きる問題って何?
0357デフォルトの名無しさんNGNG
http://support.microsoft.com/default.aspx?scid=kb;en-us;192599
INFO: Avoid Data Peeking in Winsock
http://support.microsoft.com/default.aspx?scid=kb;ja-jp;192599
[INFO] Winsock ではデータのピークは実行しない

この翻訳レベルはどうにかならないものかね……
0358デフォルトの名無しさんNGNG
えー、Winsock の MSG_PEEK はまともに動かないって書いてる分け? 酷いな・・・
0359デフォルトの名無しさんNGNG
>>357
> http://support.microsoft.com/default.aspx?scid=kb;en-us;192599
>
> This is a holdover from Winsock 1.1 compatibility with Unix BSD Sockets.

糞な仕様は、劣化コピーのWinsock 1の方だけだって。

WSARecv()の欠陥、MSDNに堂々と仕様として書いてあるもんな。
Bugとしてfixされる対象ではないらしい…
0360デフォルトの名無しさんNGNG
>>358
いや、はっきりそう書いてないのがこれまた酷い。

マイクロソフトの技術情報はエクスキューズが含まれているので要注意。
0361デフォルトの名無しさんNGNG
>これは、Unix BSD ソケットとの互換性を持つ Winsock 1.1 から残っている機能です
Winsock2でも残ってるってことだろ。
0362デフォルトの名無しさんNGNG
>>353
> 何が悪いのでしょうか・・・?

Winsockです(藁
0363デフォルトの名無しさんNGNG
>>361
調べずに書きますが、(どうせ金輪際使わない機能なので俺は調べる気なし)
Winsock 2 for XPでは、直ってたんじゃないかなあ?

どのプラットフォームならOKか、MSDNに書いてあるよ。> 使いたい人
0364デフォルトの名無しさんNGNG
Winsock2 、つか、ネットワーク廻りの MSDN を日本語にしてくれ >M$
0365デフォルトの名無しさんNGNG
Winsock逝ってよし!
よって、Windowsでわsocketつかうな。
以上。
0366デフォルトの名無しさんNGNG
>>364
↓こんな体たらくでもやはり日本語がいいか…

> なお、この資料は英語版の翻訳であり、日本語環境での確認は行っておりません。
0367デフォルトの名無しさんNGNG
>>365
じゃあ、何使うんだ?w
0368デフォルトの名無しさんNGNG
通信の基本は紙コップと糸だ
0369デフォルトの名無しさんNGNG
mingwだろ(w

peek辺りはワナが一杯だぞ。

SO_RCVTIMEO and SO_SNDTIMEO

When using the recv function, if no data arrives during the period
specified in SO_RCVTIMEO, the recv function completes. In Windows
versions prior to Windows 2000, any data received subsequently
fails with WSAETIMEDOUT. In Windows 2000 and later, if no data
arrives within the period specified in SO_RCVTIMEO the recv
function returns WSAETIMEDOUT, and if data is received, recv
returns SUCCESS.

If a send or receive operation times out on a socket, the socket
state is indeterminate, and should not be used; TCP sockets in
this state have a potential for data loss, since the operation
could be canceled at the same moment the operation was to be
completed.

"使うべきではない"て。作ったんお前らやろ。
0370デフォルトの名無しさんNGNG
>>369
MinGWはBSDスケット入ってないだろ。Cygwinにしとけ
0371デフォルトの名無しさんNGNG
>>369
mingwのソケットってWinsockを使ってないのけ?
0372デフォルトの名無しさんNGNG
>>369
罠 罠 罠に落ちそう♪
誘惑の peek 私をさそう♪
0373デフォルトの名無しさんNGNG
mingwはwinsockを直に使うやろ
cygwinも結局winsockを使うから
どっちも同じだよ
0374デフォルトの名無しさんNGNG
TCP/IPスタックが腐ってんじゃなくて、
WinsockのAPI設計が腐ってるんだから大丈夫じゃねえ? > cygwin
0375デフォルトの名無しさんNGNG
>>374
cygwinがどうなってるか、ちょっとでいいから調べてみよう。
0376デフォルトの名無しさんNGNG
Mozsock.dllを使うと言うのはどうだろう?
0377デフォルトの名無しさんNGNG
Mozockだ。。。
0378デフォルトの名無しさんNGNG
>>376
水溜りを避けて肥溜めにはまるようなもんだ。
0379デフォルトの名無しさんNGNG
>369
「BSD Socketに機能があるから互換性のために実装しとくけど、
 使うのはやめとけ」って話ではないの?
0380デフォルトの名無しさんNGNG
だからお前ら全員Mozock.dllをWinsock.dllにリネームしてシステムに放り込めって!!
幸せになれるぞ!!
0381デフォルトの名無しさんNGNG
今時mozock.dllなんて持ってるヤツ居るのか?
今時winsock.dllなんて使ってるソフトあるのか?
0382デフォルトの名無しさんNGNG
もう伝書鳩でいいよ。ちゃんとRFCになっているし…。
0383デフォルトの名無しさんNGNG
ping ぐらいしか通らないみたいだけどな。
0384デフォルトの名無しさんNGNG
>>379
全然違うぞ。Winsockの方でアホ仕様に。

> the socket state is indeterminate
> TCP sockets in this state have a potential for data loss

有り得ない。

> since the operation could be canceled at the same moment the operation was to be completed.

こんなレベル低い実装は。
0385デフォルトの名無しさんNGNG
すいません。以前LAN上のリモートPCをシャットダウンさせたいで
投稿した者(310)ですがまだ解決しておらず、助けをお願いします。(VC++6.0 Windows2000)

borlandの↓ホームページのTIPSを参考にしてconsole用のプログラムにしようとしています。
ttp://www.borland.co.jp/tips/cbuilder/cb013/ntshut2.html

シャットダウンさせたいリモートPCにWNetAddConnection2で
ログインするところまでできました。

その後、
�@OpenProcessTokenでプロセストークンを取得
�ALookupPrivilegeValueでシャットダウン権限の LUID を取得
�BAdjustTokenPrivilegesでシャットダウン権限を与えて
�CInitiateSystemShutdownでリモートのPCをシャットダウンとやると、
システムエラー5の「アクセスが拒否されました」

になってしまいます。アクセス権限がないのかなと思ったのですが
シャットダウンさせたいPCには ユーザ名/パスワード admin/admin
がいるし、WNetAddConnection2ではadmin adminでログインしています。

何が原因なのかわかりません。なにかアドバイスお願いします。
0386デフォルトの名無しさんNGNG
ログインできたんだったらネットワーク関係ないんじゃねーの?
問題切り分けてから出直してこい。
0387デフォルトの名無しさんNGNG
こんにちは
WINSOCKで、送信バッファをクリアー(ゼロ)にする方法を教えてください。
よろしく、
0388デフォルトの名無しさんNGNG
フラッシュじゃなくてクリア?
無理っぽい気がするけど
その前に設計が変じゃね?
0389デフォルトの名無しさんNGNG
送信バッファのクリアって意味わかんね
どこまで相手に届いたかを無視してぶった切るってこと?
むちゃくちゃだな。
0390デフォルトの名無しさんNGNG
あれのことじゃねーの。nagleの無効化。
0391デフォルトの名無しさんNGNG
nagle の無効化だったら TCP_NODELAY だ。
0392デフォルトの名無しさんNGNG
nagleの無効化って何か意味あんの?
0393デフォルトの名無しさんNGNG
細切れにしたパケットをたくさん、しかも遅延少なく送りたい場合、
しかも、そのコネクションで相手からの応答が少ない場合は有効
0394デフォルトの名無しさんNGNG
それならデータグラムで良いじゃん と思うんだが・・・
0395デフォルトの名無しさんNGNG
telnet/UDP。なんと恐ろしい思想か。
0396デフォルトの名無しさんNGNG
>>387は特にTCPと指定しているわけではないが、
UDPだと送信バッファをクリアー出来るのか?
0397デフォルトの名無しさんNGNG
UDPに送信バッファなんて概念あったっけ?
0398デフォルトの名無しさんNGNG
Diablo2なんかのネトゲーだとUDP使いまくりだよ
0399デフォルトの名無しさんNGNG
ラグいっぱいの悪寒w
破棄パケットだらけじゃないの?
0400デフォルトの名無しさんNGNG
400ゲットするよ
0401デフォルトの名無しさんNGNG
>>400
 ゆ る  ん
0402デフォルトの名無しさんNGNG
>>392
nagle の無効化は、telnetd のように 1 byte ずつ、すぐに送信
しなければならない (エコーバック) 場合に必要。
telnet クライアント側は、エコーバックされる 1 byte に ACK
が相乗り (piggy back) してくるので、Nagle に影響されずに、
すぐに、次の入力を 1 byte 単位で送信できる。

>>394
順序が保証されない。

>>399
リアルタイム性を求められるので、破棄されても OK。
むしろ、再送される方が困る。マルチキャストは UDP しかないでしょ?
0403デフォルトの名無しさんNGNG
inet_addrの戻り値の型がLinuxと違うような気がするんだが…Winsock
0404デフォルトの名無しさんNGNG
uint32_t相当で同じだよ。

IPv6対応にするには、inet_ptonを。
0405デフォルトの名無しさんNGNG
こんにちは。質問させてください。

TCP 接続において、たとえば送信側で

> send( socket, "ABCDEFGH", 8, 0);

とした場合に、受信側で

> recv( socket, buffer, 4, 0);
> (略)
> recv( socket, buffer, 4, 0);

と二回に分けて "ABCD" と "EFGH" に分けて取得できるのは、
TCP の規格 でしょうか?それとも環境依存なんですか?

ご教授願います。
0406デフォルトの名無しさんNGNG
マニュアル読め、ボケが。
0407デフォルトの名無しさんNGNG
>>405
そのような最低限の基礎が理解できてないのに開発するのは大変だよ。
なんかちゃんとした資料読もうね。「UNIXネットワークプログラミング」とか。
0408デフォルトの名無しさんNGNG
TCPの規格とか環境依存とか以前の話ってことだよ。
0409デフォルトの名無しさんNGNG
>>405
TCPはバーチャル・サーキット/バイトストリームです。
あなたが直感的に欲しているのは、SOCK_SEQPACKET(未実装)。
0410デフォルトの名無しさんNGNG
>>405
> と二回に分けて "ABCD" と "EFGH" に分けて取得できるのは、

二回で済むとは限らん。
0411デフォルトの名無しさんNGNG
そういう半端なレスは無意味だろ
0412デフォルトの名無しさんNGNG
これを半端としか取れないとは...。
0413デフォルトの名無しさんNGNG
データの切れ目が分からないのは結構面倒くさい。
データをテキストにして区切り文字つけるとか、先頭にレングス付ける
とかで対応してるけど、毎回セッション張りなおすのもあれだし、
UDP使わずに、他に良い方法とか無いですよね。
0414デフォルトの名無しさんNGNG
>>413
無い。
つーか、そういう処理 (=データの切れ目を解釈して、一塊のデータを送受信) をするルーチン書くのってそんなに面倒か ?
0415デフォルトの名無しさんNGNG
httpなどがどうやってるか考えたことないんだろうかね
0416デフォルトの名無しさんNGNG
質問です。
ビデオチャットを作ろうと思うのですが
別に一部の損失くらいはかまわないので、出来るだけ高速にしたいのでUDPにしようと思います。
そこで、良いサンプルとかありませんでしょうか?
0417デフォルトの名無しさんNGNG
質問に対する回答
「探せばあるかもしれません」
0418405NGNG
レスありがとうございます。
例が抽象的過ぎたようですね。何がしたかったのかというと、

送信側
> char data[10];
> strcpy( data+1, "ABCDEFG" );
> data[0] = strlen( data+1 );
> send( socket, data, data[0]+1, 0 );

受信側
> char buffer[10];
> recv( socket, buffer, 1, 0 );
> recv( socket, buffer, buffer[0], 0 );

このように、データの頭にデータ長を入れたかったんです。それで、
内部的にバッファリングされるのは規格で決まってるのか、自前でいったん
バッファリングするべきなのか。ということが疑問になり、質問した次第です。
バッファリングは必要なんでしょうか?
0419デフォルトの名無しさんNGNG
>>418
sendは一度に何バイト書き込めるか分からないし、
recvは一度に何バイト読み込めるか分からない。

考慮すべきはインタフェースとしてのsend/recvの挙動であって、
内部的な動作を考える必要はないのでは?

先頭にバイト数を書くというのはいいやり方だと思うよ!
0420デフォルトの名無しさんNGNG
>>418
バッファリングはされている。
0421デフォルトの名無しさんNGNG
>>418
自前のアプリ・ライブラリレベルでバッファリングは必要。
そこから4バイト一まとまりで取れたらよこせというAPI経由でパケットを取得する。
0422デフォルトの名無しさんNGNG
>>421
自前のバッファリングなんて必要ないよ。
(>>419が言うようにバイト数書いてあればとりわけ)
fdopenして、fread, fwrite使えばいい。
0423デフォルトの名無しさんNGNG
ハァ ?
0424mmNGNG
すいません。。どなたか助けてください。


・やろうとしていること
IPv6で通信するサーバ・クライアントを作っています。
サーバ側は上手くできたようで、
telnetで確認したところ、ちゃんと通信できました。

んで、クライアント側を作っているのですが、
どうしても、サーバにコネクションが張れません。
おそらく、getaddrinfo の使い方が間違っているんだと思うんですが、
どうも、いまいち分からなくて・・・。。
どなたか、ヒントでも良いので教えてください。


--------------------------------------------------
・サーバ&クライアントプログラムを動かしているマシンの環境
--------------------------------------------------
OS: NetBSD(1.6.1)
IPv6 Address: fe80::20c:29ff:fe07:955e%pcn0

(つづく)
0425mmNGNG
--------------------------------------------------
・プログラム本文(connectを張るとこまで)
--------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>


#define PORT 10000

main(int argc, char *argv[])
{
struct sockaddr_in6 addr;
struct hostent *hp;
struct addrinfo hints;
struct addrinfo *res;

int fd;
int len;
char buf[1024];


if (argc != 2){
printf("Usage: iclient SERVER_NAME\n");
exit(1);
}

(つづく)
0426デフォルトの名無しさんNGNG
宿題は宿題スレで。
0427mmNGNG
memset( &hints, 0, sizeof(hints) );
hints.ai_family = AF_INET6;
hints.ai_flags = AI_CANONNAME;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_socktype = SOCK_STREAM;

getaddrinfo(argv[1], NULL, &hints, &res);

if ( (fd = socket(AF_INET6, SOCK_STREAM, 0)) < 0 ) {
perror( "Failed to create socket" );
exit(1);
}

printf( "Initiated connection to host: %s, port: %d\n",
res->ai_canonname,
htons(((struct sockaddr_in6 *)res->ai_addr)->sin6_port)
);


if ( connect(fd, res->ai_addr, res->ai_addrlen) < 0 )
{
perror( "Failed to connect to server" );
exit(1);
}

close(fd);
}
(つづく)
0428mmNGNG
>>426
え、こっちじゃ不味いですか?
では、宿題スレにいくことにします。
0429426NGNG
別にいいけど。
0430 NGNG
>>429
あ、では、張り直すのも大変なので、
こちらで質問させていただきます。。

(つづき)
--------------------------------------------------
・プログラムの説明
--------------------------------------------------
# ./client fe80::20c:29ff:fe07:955e%pcn0
と、サーバのIPv6アドレスを指定すると、コネクションを張ろうとする。



以上で、終わりです。
よろしくお願いします。
0431mmNGNG
追加で、実行時のエラー表示です。。

# ./client fe80::20c:29ff:fe07:955e%pcn0
Initiated connection to host: (null), port: 0
Failed to connect to server: Can't assign requested address
0432426NGNG
printf( "Initiated connection to host: %s, port: %d\n",
res->ai_canonname,
htons(((struct sockaddr_in6 *)res->ai_addr)->sin6_port)
);

ネットワークバイトオーダーに変換したものを表示させるの?
0433426NGNG
それにgetaddrinfoの第二引数がNULLでしかもその後にポート番号を設定していないような・・・
0434mmNGNG
>>426
connect をする前に、どこへコネクトしようとしているかを確認しているのですが、
これでは、ポート番号は出ないでしょうか?


と言いつつ、今のままだと、↓が反映されるはずないですね・・・。
#define PORT 10000

うーん、普通にIPv4でならクライアントの作り方がわかるんですが、
getaddrinfo を使ったときの、作り方が分かっていないんだと思います。。
0435デフォルトの名無しさんNGNG
>>434
そのPORTマクロがどこにも使われていないYO!
0436mmNGNG
> それにgetaddrinfoの第二引数がNULLでしかもその後にポート番号を設定していないような・・・


http://www.linux.or.jp/JM/html/LDP_man-pages/man3/getaddrinfo.3.html
node パラメータと service パラメータのどちらかは NULL にしてよい (両方同時には不可)。
node には数値形式のネットワークアドレス (IPv4 ならドット区切りの 10 進形式、 IPv6 なら 16 進形式) か、
あるいはネットワークホストの名前を指定する。


ということだったので、NULLでもいいのかと。


>>435
はい。。たしかに使っていないです。。
試行錯誤の残骸です。。_| ̄|○


まず、PORTの指定の仕方が分かっていないですね。_| ̄|○
0437mmNGNG
解決しました。。

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/getaddrinfo.3.html
service は、各ソケット構造体のネットワークアドレスのポート番号を設定する。
service が NULL ならポート番号を初期化しないままにする。

とあったので、

getaddrinfo(argv[1], "10000", &hints, &res);
のようにしたら上手くいきました。


後の部分は、↓を参考にしました。。
http://www.ipv6style.jp/jp/apps/20030617/index.shtml
0438デフォルトの名無しさんNGNG
んじゃageときまっせ
0439デフォルトの名無しさんNGNG
>>438
ありがとう
0440デフォルトの名無しさんNGNG
Windowsのアプリについてですが、
ルータなんかでポートを塞がれてて動作しない場合、
そのポートが何番かを調べる方法はありますか?
0441デフォルトの名無しさんNGNG
ルータのログをみる
0442440NGNG
>>441
なるほど。それで絶対分かりますね。

アプリとかツールレベルの対処もあれば安心なんですが、どうですか?
0443デフォルトの名無しさんNGNG
UPnPにそんなメソッドがあったかもしれない。
0444デフォルトの名無しさんNGNG
状況がわからんのだが
塞がれててこないものを検出するのは無理では?
0445440NGNG
>>444
来ないものでなくて、
自PCから外に繋ぎに行こうとするポート一覧が知りたいでつ。
0446デフォルトの名無しさんNGNG
プログラミング関係ないだろ。他でやれ。
// WinTCPで検索しろ。
0447デフォルトの名無しさんNGNG
// Windumpの間違いでした…
0448デフォルトの名無しさんNGNG
ヲイヲイ、ネットワークプログラミングの初歩は、パケットを眺めることでわ。
0449デフォルトの名無しさんNGNG
>>448
0450デフォルトの名無しさんNGNG
前スレがおちた(T_T)
0451デフォルトの名無しさんNGNG
今Windows2000のクライアントとLinux 2.4.22-1のサーバーで
単純なTCPのサーバー・クライアントソフトを書いてるんですが、
負荷テストをしてると、突然connectが失敗するようになります。
特に複数のクライアントからコネクションを大量に張った時に起こるので
サーバー側でEtherealでモニターしてみたところ、

[TCP Dup ACK xxxx#y] server > client [RST,ACK] Seq = 1 Ack = 65 Len = 0

のようなDup ACKというメッセージ以降はパケットのやりとりが全くなくなることがわかりました。
アプリケーションを強制終了するとそれまでつないでた分のRSTが大量に流れます。

各コネクションは12回、64バイトのパケットを往復させており、
他のコネクションはAckが769で切断されています。

で、質問なんですが、
・Dup Ackというのは再送を要求するためのリクエストではないのか?
 なんでここでとまるのか?
・パケットのやりとりがとまらないようにするにはどうすればいいのか?
どなたかわかるかたがおられましたらご教授お願いします。
0452451NGNG
すみません、失敗しているのはconnectではなく、recvでした。
WSAGetLastErrorの値はWSAECONNRESETでした。
0453デフォルトの名無しさんNGNG
>>451
etherealの'TCP Dup ACK'ってのは、
etherealが同じシーケンス番号のACKを発見したという事。

その例で言うとAck = 65のパケットが直前にあるんじゃないの?
0454デフォルトの名無しさんNGNG
返事しろやゴルァ、って言ってるのにwin側が返事しないから何度も(Dup)投げてんだろ。
win2000側が受けとれてないか、送信できてないんだな。
単にwin側がさばききれずに負荷で死んでんじゃネーノ?

アプリケーション終了させたら繋がってたTCPにRST飛びかうのは当たり前。
0455デフォルトの名無しさんNGNG
あ、linux側が落としてる可能性もあるな。
serverとclientで同時にpacket dumpしといて、
変になった所のデータつきあわせればわかるだろ。
0456451NGNG
サーバー側はJavaで書いてるんですが、なんか色々調べた感じでは、
java.nioで新しく入ったSelectorクラスを生成すると、
たまにブロックすることがあり、ブロックする時にこの現象が起こるようです。
いつも950前後のコネクションで止まっていたので、
試しにサーバー側のプロセスのディスクリプタ数の上限を上げてみたら
3000コネクションはつながるようになりました。

Javaの実装でSelectorで止まるとソケットを切断するとかあるんでしょうか?

>>453
ありました。
そっちのほうはただのACKでした。

>>454
>返事しろやゴルァ、って言ってるのにwin側が返事しないから何度も(Dup)投げてんだろ。
ACKに対して返事ってなくないですか?
ちなみにDUPACKのパケットと同じAck番号のパケットはWindows側にはとどいていました。
0457デフォルトの名無しさんNGNG
>422読んで思ったんだけど
バッチ処理的にブロッキングされてもいいようなアプリ以外で
TCPで送受信用リングバッファ使わないで通信してる人って多いの?
0458453NGNG
>>456
Linger-on-closeのtimeoutが短いんじゃないの?
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/net/SocketOptions.html
0459453NGNG
>>457
俺はリングバッファ必須みたいな言い方の方が違和感あるけどね。
必要に応じて、使い分ければいいんじゃないの?
0460デフォルトの名無しさんNGNG
>>456
Ackとデータ送信は兼用できるだろ。
Ackといっしょに送ったデータの返事がこないから何度も送っている。
0461451NGNG
>>456
試してみたところ、getSoLingerの値は-1(無効)でした。
知らなかったんで、調べてみたんですが、

> SO_LINGER は,データが送信されるか,デバイスの時間切れ (約 8 分) が発生するまで,
> close の内部ソケット削除の部分を実行しないことを指定します。

とありました。
linger-on-closeって明示的にcloseした後の動作を指定する
オプションじゃないんですか?

>>460
けどサーバー側はデータ送信は一度も送っていないんです。
切断されたコネクションでのやりとりは、

C > S SYN (seq=0, ack=0, len=0)
S > C SYN,ACK (seq=0, ack=1, len=0)
C > S ACK (seq=1, ack=1, len=0)
C > S Data+Ack (seq=1, ack=1, len=64)
S > C ACK (seq=1, ack=65, len=0)
C > S RST+ACK(seq=1, ack=65, len=0)

で終わりです。
0462453NGNG
既に存在しないconnectionにTCP segmentが来た時、
linger-on-closeで、タイムアウトが起きた時、
これがRSTの典型的な利用ケースなんだけどね。

>>451
> [TCP Dup ACK xxxx#y] server > client [RST,ACK] Seq = 1 Ack = 65 Len = 0
>>461
> C > S RST+ACK(seq=1, ack=65, len=0)

逆向きなんですが…どっちなんですか?
0463デフォルトの名無しさんNGNG
UNIXのソケットでwinsockの非同期みたいな事をするにはどうしたらいいでせうか;;
シングルスレッドで…
0464デフォルトの名無しさんNGNG
poll使ったdispatcher自分で書け。
0465デフォルトの名無しさんNGNG
>>463
FIOASYNC
シグナルに明るくないならオススメしない

0466451NGNG
>>462
>既に存在しないconnectionにTCP segmentが来た時、
>linger-on-closeで、タイムアウトが起きた時、
>これがRSTの典型的な利用ケースなんだけどね。

両側とも明示的に切断は行っていないんですが、
何かしらの理由で切断されている、ということなんでしょうかね。

>>>451
>> [TCP Dup ACK xxxx#y] server > client [RST,ACK] Seq = 1 Ack = 65 Len = 0
>>>461
>> C > S RST+ACK(seq=1, ack=65, len=0)
>
>逆向きなんですが…どっちなんですか?

すみません、前者が正しいです。

あと全く別の質問なんですが、winsockでUDPでデータ通信をする際に
あるあて先に1パケットで最大何バイト送れるかを調べる方法はありますか?
0467デフォルトの名無しさんNGNG
オレ、LinuxでCでネットワークプログラム書いてる。

ソケットに対して writeして そのすぐあと close したとき
相手に writeした分は 届くの?
フラッシュするとか writeが完了するの待つとか いる?
0468デフォルトの名無しさんNGNG
>>467

TCP/IP の場合?

普通は届くけど、ホントに届いたかどうか、close() しちゃったら、
もう、確かめられない。write() したはいいけど、相手からの応答が無くて、
TCP で再送タイムアウトになったとしても、そのエラーを拾えない。
もっとも、再送タイムアウトになるまで待つ、ってのも気の長い話だけど。

データを送信した後、read() で 0 return するまで待ってから、ソケット
を close() するようなコーディングをよく見かけるな。

あと、「フラッシュする」ってのは何かを誤解していると思われ。
0469デフォルトの名無しさんNGNG
両方がread() で 0 return するまで待ってから、ソケット
を close() するようなコーディングをしていたらどうなるんですか?
0470デフォルトの名無しさんNGNG
shutdownでも使え。
0471468NGNG
>>469
そのアプリケーションがどういう通信をやるのか知らんけど、
通信の最後で、

 write() した側は read() 0 return を待つ
 read() した側は、必要なデータを読み取ったら、close()

とすればいいだろ。

それが嫌なら、>>470 の言うように shutdown() でも使え。

write() して即 close() だと、もし、相手がデータを送って
きたら RST 応答してしまう。
0472デフォルトの名無しさんNGNG
>>466
よっぱらってるんで、

> あと全く別の質問なんですが、winsockでUDPでデータ通信をする際に
> あるあて先に1パケットで最大何バイト送れるかを調べる方法はありますか?

こっちだけ。MTU discoveryで検索。
0473デフォルトの名無しさんNGNG
あ、常にできるわけではない。
PathのnodeがMTU discoveryをsupportしている必要がある。
って事は書いといた方がいいか。
0474デフォルトの名無しさんNGNG
Path というか、基本的に通信相手だけサポート
していれば大丈夫でしょ。

もちろん、途中経路の firewall 管理者が、
「icmp は全部ブロック」みたいな無知な
packet filtering ルールを設定してないこと
ってのはあるけど。
てゆーか、いいかげん、こういう設定勧めている
低レベルなセキュリティ本は滅んでほしい。
0475デフォルトの名無しさんNGNG
>>474
とりあえず読んで。
RFC1191:Path MTU discovery.
RFC1981:Path MTU Discovery for IP version 6.
0476デフォルトの名無しさんNGNG
あ、>>446はIP packet fragmentationを嫌って、
こういうことを尋ねているというのが、暗黙の仮定になってます。
0477デフォルトの名無しさんNGNG
code=4 の icmp メッセージが、RFC792 のものから更新され
ていたのを知りませんですた。RFC792 に RFC1191 の router
requirement と同じことが書いてあると思ってた。
無知スマソ。>>475

v6 の場合は、仮定してもいいよね。そもそもルータが
fragmentationしてくれないし。
0478デフォルトの名無しさんNGNG
IPv6ではPath MTU Discovery必須です。
0479デフォルトの名無しさんNGNG
>>474
>>475
こちらも追加。
RFC2923:TCP Problems with Path MTU Discovery

UDPではPMTUDを使わない(えない)かも。
デフォルトでUDPのPMTUDを切っているOSが多い。

ところでWindowsでDFがすべてのパケットに付いているのは仕様?
0480デフォルトの名無しさんNGNG
どうせ付けるならEvilを付けてほしい:-)
0481デフォルトの名無しさんNGNG
悪は嫌いです
0482デフォルトの名無しさんNGNG
そうですか:-)
0483デフォルトの名無しさんNGNG
GoodとEvilは同じパーティに入れないからなあ
0484デフォルトの名無しさんNGNG
>>483
んなこたない。
ダンジョン内で待ち合わせをすればいい。
0485デフォルトの名無しさんNGNG
でもロードなんかいらないだろ
サムライと忍者で十分
0486デフォルトの名無しさんNGNG
winsockのソースも流出した模様
0487デフォルトの名無しさんNGNG
>>467
SO_LINGER
0488デフォルトの名無しさんNGNG
JavaのURLConnection系ってタイムアウトが実装できないから
使いにくいっていうけど、タイムアウト部を自分で書けば使える
ということなんだろうか。
0489デフォルトの名無しさんNGNG
>>488
JDKのバージョン依存(>1.4)だが、
ttp://java.sun.com/j2se/1.4.2/docs/guide/net/properties.html
0490デフォルトの名無しさんNGNG
>>488
> タイムアウト部を自分で書けば使えるということなんだろうか。

こっちに反応し忘れた。hookがないから駄目。
そもそもSocketにtimeoutがない(< 1.4)。

1. java.*, javax.*, sun.*でないURLConnection系のクラスを使う。
2. 1.4を使う。
のいずれか。1.はConnectionPool系ならtimeoutが付いていることが多い。
0491デフォルトの名無しさんNGNG
>>488
hookがないからというのは具体的にはどういうこと?
いや、タイマースレッドを用意してタイムアウトしたら
URLConnection#disconnectすればいいかとか適当に
考えていたんだけど。

と思って調べてみたらURLConnectionにはdisconnect
がない。HttpURLConnectionだった。
0492デフォルトの名無しさんNGNG
ここの住民にとってはいい教材が手に入りましたなぁ・・・。

「ソース嫁!」が飛び交う悪寒。
0493デフォルトの名無しさんNGNG
Windowsの流出ソースの中のWinsockのソースに何か目新しいものあった?
リファレンスに載ってない隠し機能みたいなのとか
0494デフォルトの名無しさんNGNG
>>493
ソース嫁!
0495デフォルトの名無しさんNGNG
流出ソースって何処で手に入るの?
0496デフォルトの名無しさんNGNG
>>495
ny
0497デフォルトの名無しさんNGNG
>>496
ハッシュ晒せバーカ
0498デフォルトの名無しさんNGNG
>>496
検索キーワードを教えてください
0499デフォルトの名無しさんNGNG
>>497
http://pc2.2ch.net/test/read.cgi/win/1076660087/32
ただしWinny2
0500デフォルトの名無しさんNGNG
ソースって言っても重要な部分は結局tcpip.sysに丸投げで、
tcpip.sysのソースは含まれていないときたもんだ。
0501デフォルトの名無しさんNGNG
>>491
disconnectがconnectをcancelするなんてことは、
documentのどこ読んでも書いてないですよ。実際無理。
0502デフォルトの名無しさんNGNG
帯域制限を実装したいんだけど。
たんにSendToにぶち込むバッファーの量を絞ってやればいいだけの話?
0503デフォルトの名無しさんNGNG
>>502
そんなもん、下のレイヤーにやらせておけば?
0504デフォルトの名無しさんNGNG
>>502
うん

>>503
おいおい
0505デフォルトの名無しさんNGNG
>>502
どの程度帯域制限したいかによるけど、
bitrate計算して、その分sendtoも遅らせたりする必要が出てくるでしょ。
0506デフォルトの名無しさんNGNG
Linuxで動いてるサーバーにTCPのコネクションを超大量に張ってたら
途中からSYN-ACKが返ってくる時間がクソ遅くなってくる。
2万セッションくらい張りたいんだけど、なんか設定できるところない?
0507デフォルトの名無しさんNGNG
>>502
サイズよりも間隔だろ
0508デフォルトの名無しさんNGNG
>>506
とりあえず、
http://www.kegel.com/c10k.html#kernel
辺りを。
0509デフォルトの名無しさんNGNG
あ、それから、当然だけど、一つのサービスで20Kセッションなら、
acceptをどうやっているかなど、アプリの構造もかかわってくる。
0510デフォルトの名無しさんNGNG
>>508
英語じゃないの。
0511デフォルトの名無しさんNGNG
>>242-244
0512506NGNG
>>508
サンクスコ。ちょっと読んでみたけど面白かった。

>>509
漏れが書いたのは多分>>508で言うところの最初の
"Serve many clients with each thread, and use nonblocking I/O and level-triggered readiness notification "
の奴で、acceptしているスレッドはaccept次第ワーカースレッドに全部仕事を任してる。

send/recvのやりとりはそれほど発生しないので、普通にselectでさばけてるんだけど、
acceptでブロックしてる時間が異様に遅い。
スニッフィングしてみたら、synがクライアントから送られて、syn-ackが返ってくるまで3秒かかってたりする。
acceptしなくてもlistenしてれば自動的にsyn-ackは送られますよね?
0513506NGNG
よく見てみたらsyn-ackが返って来る間に色々やりとりがあった。

サーバーからただのackが返って来て、
クライアントがrstを送って、
サーバーがackを返してる。
で、3秒後にクライアントがsynを送って、
それに対してsyn-ackが返って来た。

なんでこんなよくわからないことしてるの?
0514デフォルトの名無しさんNGNG
>>513
もっとよく見ろ。
その ACK は、その SYN とは全然関係ないコネクションの
ACK だろう。

単にサーバ側アプリケーションの accept() 処理が追いつかず
にバックログキューが溢れて、SYN が破棄されているだけ。
で、クライアント側の SYN の再送で救われている。

できる限り、サーバ側アプリケーションのバックログ値を
大きくしてやれ。
0515506NGNG
>>514
>その ACK は、その SYN とは全然関係ないコネクションの
>ACK だろう。
両側のポートは一緒なんだけど、違うコネクションってことはあるの?

>できる限り、サーバ側アプリケーションのバックログ値を
試してみます。
ありがとうございます。
0516506NGNG
バックログの値を20000にしてみたけどやっぱり同じ現象が発生する。
クライアント側では3つプロセスが動いていて、
それぞれが一つずつ接続をしてるだけだから同時に3つしか
キューに入らないはず。

どんどん絶望的な気分になってくる…

orz
0517デフォルトの名無しさんNGNG
メールクライアントを作っているのですが、簡単なテストサーバみたいなものは
ないでしょうか?POP3サーバとかじゃなくて、

手打ちデータなどをクライアントに返せるようなサーバがほしーです。
ベクターを探してみましたが見つかりませんでした。

なにか知っていたら教えていただけるとうれしいです。
0518デフォルトの名無しさんNGNG
>>517
OSくらい書こうや
0519デフォルトの名無しさんNGNG
>>517
それをつくるのも勉強のうちじゃないの?
0520517NGNG
失礼しました。OSはWindows98かWindows2000かLinux Redhat9でお願いいたします。
0521デフォルトの名無しさんNGNG
>>520
>手打ちデータなどをクライアントに返せるようなサーバ

って何よ
0522デフォルトの名無しさんNGNG
>>521
常に同じデータを返すってことでしょ。
0523デフォルトの名無しさんNGNG
echoじゃだめなんか。デフォルトでつぶしてルかも試練が
0524デフォルトの名無しさんNGNG
tcp over udpなソースってどこかにあったりしませんか?
0525デフォルトの名無しさんNGNG
>>524
airhookとか。

死ぬ程糞だけど。
0526デフォルトの名無しさんNGNG
>>506

OSは?
backlog の検索にhashを使ってないタコな
OSも世の中にはあるぞ。OSを乗り換えた方が
いいかも。
0527デフォルトの名無しさんNGNG
Winsockでプロクシサーバを作ろうとしています。
複数のソケットを作って、WSAASyncSelectを使って非同期通信しています。
それで、各ソケットごとに受信・送信の状態などを覚えておかないといけない
と思います。

で、そのために、HWNDにGetWindowLongやGetPropでするようなことを
SOCKETでもできますか?できるならそこに構造体のアドレスを入れて
おけばいいですよね。

(WSAASyncSelectで各ソケットとウィンドウを1対1に対応させれば出来るん
ですが、ウィンドウひとつでできるならそのほうがいいので。)

それとも、スレッドを使ったほうがいいんでしょうか?
0528デフォルトの名無しさんNGNG
>>526
Linuxって思いっ切り書いてますがな。
ディストリビューション関係あるの? カーネルは同じでしょ
0529デフォルトの名無しさんNGNG
>>528
Linuxにもバージョンがある
0530デフォルトの名無しさんNGNG
preforkして複数のプロセスでacceptしてみれ。
でも改善されたらラッキー、くらいだな。
0531デフォルトの名無しさんNGNG
>>506>>513
iptablesが動いているって事はないですかあ?
0532506NGNG
>>526
カーネルは2.4.22で、ディストリはdebian使ってる。
早く2.6にしたほうがいい?

>>531
今見たら入ってた。

#iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

ipchainsはないみたい。
0533514NGNG
>>516
> 両側のポートは一緒なんだけど、違うコネクションってことはあるの?
古いコネクション。そのために TIME_WAIT なんて状態が存在する。
が、今回のケースでは関係ない気がする。回線トレース見てみないと
なんとも言えんなぁ。

>それぞれが一つずつ接続をしてるだけだから同時に3つしか
>キューに入らないはず。

お前、バックログキューを全く理解していないぞ。

バックログを 20000 にした、って、どうやったか、具体的に
書け。listen() の第 2 引数を 20000 にしただけじゃあ、
OS 側の上限に負けるぞ。
0534デフォルトの名無しさんNGNG
listen、引数大きすぎてもエラーにならないもんなあ(w
0535506NGNG
>>533
>> 両側のポートは一緒なんだけど、違うコネクションってことはあるの?
>古いコネクション。そのために TIME_WAIT なんて状態が存在する。

あー、確かに。
ただ、一つずつconnectしていってもエラー返さずずっとブロックしてるから
別のコネクションってことはありえないと思う。

>>それぞれが一つずつ接続をしてるだけだから同時に3つしか
>>キューに入らないはず。
>お前、バックログキューを全く理解していないぞ。

accept後のデータのやりとりは別スレッドに任せてるから
connectにacceptが間に合ってない、ってことはないと思う。
クライアント側は何度かデータのやりとりしてるからほぼ間違いないと思う。
acceptすればキューから外れると思ってたんだがこれは正しい?

>バックログを 20000 にした、って、どうやったか、具体的に
>書け。listen() の第 2 引数を 20000 にしただけじゃあ、
>OS 側の上限に負けるぞ。
第二引数を20000にしただけですた。
OSのほうの設定もやってみます。ありがとうございます。
0536533ではないがNGNG
>>535
> acceptすればキューから外れると思ってたんだがこれは正しい?

そりゃそうなんだけど、acceptはsingle threadedなんでしょ。
だったら、一つ捌いている間にどんどんたまっていくよね。

> accept後のデータのやりとりは別スレッドに任せてるから

これをやっている間にも。

> connectにacceptが間に合ってない、ってことはないと思う。

自身たっぷりだが、有り得ないことじゃないよ。

0537533だがNGNG
>>535
>accept後のデータのやりとりは別スレッドに任せてるから
>connectにacceptが間に合ってない、ってことはないと思う。

accept() 後の話はかんけーねーだろ。
accept() ってのは、結構重い処理なんだよ。

クライアント側もシリアルに回してるのに SYN+ACK が返る
のが遅いのであれば、バックログ溢れなのかどうか疑わしく
なってくる。

とりあえず、サーバ側で netstat -s を定期的に採取して、
バックログキュー溢れが発生していないか確認してみろ。
今 Linux が手元にないから、netstat -s のどこを見れば
いいか説明できない。スマソ。誰か、フォローよろ。
FreeBSD だったら "listen queue overflows" のところね。

後は、さっさと、そのアヤシイという回線トレースを晒せ。
0538デフォルトの名無しさんNGNG
>>506
> accept後のデータのやりとりは別スレッドに任せてるから
> connectにacceptが間に合ってない、ってことはないと思う。
> クライアント側は何度かデータのやりとりしてるからほぼ間違いないと思う。

ここで一つ疑問なんだが、「何度かデータのやりとり」(特にサーバーからのデータを受信)を
しないと次のconnectは呼び出さないの?
たしか、サーバー側でacceptしなくても"3-Way Handhsake"が終わればconnectは制御を
戻すから、もしそうでないならキューがあふれる可能性あるよね。
0539533ではないがNGNG
>>530は読めてるのかな〜。
0540デフォルトの名無しさんNGNG
>>539
糞レスと判断したかレスアンカーがないから無視したんだろ。
0541506NGNG
返事送れてスマン。

まずバックログの話だけど、
# sysctl -w net.ipv4.tcp_max_syn_backlog="5000"
で増やして、listenの引数のほうも4000とかにしてみたけど、
同じ現象が発生した。

>>536,>>537
accept直前で文字出力してacceptに入ってることは確認してるんだが、
結局クライアント側からの再送の3秒分止まってる。
ちなみにクライアント側でconnectする前に2500msのSleepを挟んだら
クライアントは5500msくらいの時間止まるようになった。
2500msのsleepを入れてるのにあふれる、ってありえる?
0542506NGNG
synからのダンプは、

19:06:06.672731 192.168.123.61.xtel > 192.168.123.19.19876: S 1640009458:1640009458(0) win 65535 <mss 1460,nop,nop,sackOK> (DF)
19:06:06.675614 192.168.123.19.19876 > 192.168.123.61.xtel: . ack 1398628608 win 5840 (DF)
19:06:06.675642 192.168.123.61.xtel > 192.168.123.19.19876: R 1398628608:1398628608(0) win 0
19:06:06.690803 192.168.123.61.1308 > 192.168.123.19.19876: . ack 705 win 64831 (DF)
19:06:06.791364 192.168.123.61.1312 > 192.168.123.19.19876: . ack 705 win 64831 (DF)
19:06:08.559930 802.1d config 8000.32:cf:fc:3e:e4:8c.8001 root 8000.32:cf:fc:3e:e4:8c pathcost 0 age 0 max 8 hello 2 fdelay 5
19:06:09.394346 0.00:00:74:6b:2b:c7.4100 > 0.ff:ff:ff:ff:ff:ff.452:ipx-sap-nearest-req 4
19:06:09.606638 192.168.123.61.xtel > 192.168.123.19.19876: S 1640009458:1640009458(0) win 65535 <mss 1460,nop,nop,sackOK> (DF)
19:06:09.609082 192.168.123.19.19876 > 192.168.123.61.xtel: S 1754744741:1754744741(0) ack 1640009459 win 5840 <mss 1460,nop,nop,sackOK> (DF)
19:06:09.609179 192.168.123.61.xtel > 192.168.123.19.19876: . ack 1 win 65535 (DF)
19:06:09.609576 192.168.123.61.xtel > 192.168.123.19.19876: P 1:65(64) ack 1 win 65535 (DF)
19:06:09.612497 192.168.123.19.19876 > 192.168.123.61.xtel: . ack 65 win 5840 (DF)
19:06:09.615356 192.168.123.19.19876 > 192.168.123.61.xtel: P 1:65(64) ack 65 win 5840 (DF)
19:06:09.615513 192.168.123.61.xtel > 192.168.123.19.19876: P 65:129(64) ack 65 win 65471 (DF)

3行目でよくわかんないRSTが送られてて、8行目でSYNが再送されてる。
この後サーバークライアント間でパケットが何回か往復して、
また同じようなSYN,ACK,RST,SYN...ってのが出る。
0543506NGNG
connectした時の最初のsynからのダンプは、

19:06:06.672731 192.168.123.61.xtel > 192.168.123.19.19876: S 1640009458:1640009458(0) win 65535 <mss 1460,nop,nop,sackOK> (DF)
19:06:06.675614 192.168.123.19.19876 > 192.168.123.61.xtel: . ack 1398628608 win 5840 (DF)
19:06:06.675642 192.168.123.61.xtel > 192.168.123.19.19876: R 1398628608:1398628608(0) win 0
19:06:06.690803 192.168.123.61.1308 > 192.168.123.19.19876: . ack 705 win 64831 (DF)
19:06:06.791364 192.168.123.61.1312 > 192.168.123.19.19876: . ack 705 win 64831 (DF)
19:06:08.559930 802.1d config 8000.32:cf:fc:3e:e4:8c.8001 root 8000.32:cf:fc:3e:e4:8c pathcost 0 age 0 max 8 hello 2 fdelay 5
19:06:09.394346 0.00:00:74:6b:2b:c7.4100 > 0.ff:ff:ff:ff:ff:ff.452:ipx-sap-nearest-req 4
19:06:09.606638 192.168.123.61.xtel > 192.168.123.19.19876: S 1640009458:1640009458(0) win 65535 <mss 1460,nop,nop,sackOK> (DF)
19:06:09.609082 192.168.123.19.19876 > 192.168.123.61.xtel: S 1754744741:1754744741(0) ack 1640009459 win 5840 <mss 1460,nop,nop,sackOK> (DF)
19:06:09.609179 192.168.123.61.xtel > 192.168.123.19.19876: . ack 1 win 65535 (DF)
19:06:09.609576 192.168.123.61.xtel > 192.168.123.19.19876: P 1:65(64) ack 1 win 65535 (DF)
19:06:09.612497 192.168.123.19.19876 > 192.168.123.61.xtel: . ack 65 win 5840 (DF)
19:06:09.615356 192.168.123.19.19876 > 192.168.123.61.xtel: P 1:65(64) ack 65 win 5840 (DF)
19:06:09.615513 192.168.123.61.xtel > 192.168.123.19.19876: P 65:129(64) ack 65 win 65471 (DF)

3行目でよくわかんないRSTが送られてて、8行目でSYNが再送されてる。
この後サーバークライアント間でパケットが何回か往復して、
また同じようなSYN,ACK,RST,SYN...ってのが出る。
0544506NGNG
>>538
サーバーからのデータ受信をするまで送受信を10回くらいしてる。
だからacceptされてるはずなんだけどなぁ…。

>>539
スマン、自分宛だと気づかなかった。でpreforkで検索してもapacheの設定の話ばっかりで、
manで調べても見つからない。ポインタキボンヌ。
0545デフォルトの名無しさんNGNG
>>542
サービス名変換してないトレースして欲しいに。xtel って何番だ?
それから、トレース晒すなら、どこで採取したかも書け。

> 3行目でよくわかんないRSTが送られてて、8行目でSYNが再送されてる。

よくわかんなくはないぞ。2 行目の謎の ACK に対する RST だ。
192.168.123.61 側には該当コネクションが存在しないから
RST 応答していると思われ。多分、1 行目の SYN を受けた段階では、
192.168.123.19 側には、まだ

 192.168.123.19:19876 <-> 192.168.123.61:xtel

という古いコネクションが残ってると思われる。だから、ここで
古いコネクションの ACK を返している。

お前、クライアント側のプログラムで、以下のようなことをやっ
てないか?

- connect() 前に明示的に bind() している。
- SO_REUSEPORT オプションを使っている。
0546545NGNG
>>545 のつづき。

3 行目で RST を受けたので、このタイミングで 192.168.123.19
の古いコネクションが消滅。

8 行目の SYN の再送に対して 9 行目で 192.168.123.19 側から
SYN+ACK が帰されてて 10 行目の ACK でコネクション確立。

4 〜 7 行目は関係ないな。

古いコネクションの時からのトレースがあれば確証が得られる
んだけど。

0547545NGNG
>>544
> サーバーからのデータ受信をするまで送受信を10回くらいしてる。
> だからacceptされてるはずなんだけどなぁ…。

accept() しなくてもコネクションは確立するんだよ。
3 way handshake でのコネクション確立が完了して、
ようやく、アプリケーションの accept() が解ける。
だから、回線上にデータのやりとりが流れることと、
accept() が終わっていることは別の話。サーバ側から
のデータ (PUSH ビットが立ってるやつ) が流れてたら、
それは、accept() が終わってるってことだけどな。
それ以外は TCP がやり取りしてるデータだからアプリ
ケーションは関係ない。

0548545NGNG
明示的に bind() してないのに、古いコネクション
とかぶっちゃうとしたら、ANY ポートの範囲が異様
に狭い、ってことはない?
偶然採取できている、別コネクションのデータをみると、
どうやら、このマシン (192.168.123.61)、ANY ポートの
範囲が 1024 〜 5000 になってる気がする。
イマドキそんな腐った OS は捨ててしまえ。ちゃんと、
IANA に従えと。
0549545NGNG
もし、古いコネクションが残ってることが原因なら、
とりあえず、サーバアプリケーションは、データの
やりとりをして最後にソケットをclose()する時に、
read() が 0 return するのを待ってから close()
するようにしろ。つまり、クライアント側がコネクション
をクローズしたことを確認してから、サーバ側も close()
する。

そうすれば、サーバ側には TIME_WAIT のコネクションが
残らないから、この問題は発生しない。サーバアプリケ
ーションの常識。覚えとけ。

0550デフォルトの名無しさんNGNG
>>544
preforkは、サーバ起動時にあらかじめ(pre-)いくつか子プロセスをつくっておくこと。
Apache1.3.x(のStandAloneモード)がその一例。
0551506NGNG
>>545
激しくすまん。このdumpはクライアント側でとったもの。
192.168.123.19がサーバーで、19876は固定のポートでクライアントの1313番(xtel)はエフェメラルポート。

> - connect() 前に明示的に bind() している。
それしてる。ただポート番号は指定しない(0)で適当に取らせてる。これやばい?

> - SO_REUSEPORT オプションを使っている。
SO_REUSEADDRは使ってる。SO_REUSEPORTは使ってないわ。

> accept() しなくてもコネクションは確立するんだよ。
ごめん、説明が悪かった。
クライアントはサーバーからのデータをrecvで待ってる。
クライアントはsend,recvを繰り返して、最後のrecv後に
次のconnectを呼んでる。

> 明示的に bind() してないのに、古いコネクションとかぶっちゃうとしたら、
> ANY ポートの範囲が異様に狭い、ってことはない?
いっぱいコネクション張ってみたら
4963の次に1026番ポート開いてた。
5000以降は使ってないのか。

試しにクライアントのローカルポートを30000-50000にして
つないでみたけど、結果は同じだった。ショボーン

>そうすれば、サーバ側には TIME_WAIT のコネクションが残らないから、この問題は発生しない。
テスト中に中断するためにクライアントをCTRL-Cで止めてるんですが、
これはまずいっすか?

>>550
あー、プロセスじゃないけどスレッドはあらかじめ作っておいてあるわ。
0552デフォルトの名無しさんNGNG
質問。

LANで送受信したIPパケットの個数を知りたい(取得したい)んですが、
どうすればいいですか。
0553デフォルトの名無しさんNGNG
>>552
O S く ら い 書 け
0554デフォルトの名無しさんNGNG
>>553
OS無くてもいいじゃん
オレならパケットモニタを買って来てぶち込む
0555545NGNG
>>551
>ただポート番号は指定しない(0)で適当に取らせてる。これやばい?
いや。かまわん。それなら ANY ポートが振られるから。

> 試しにクライアントのローカルポートを30000-50000にして
> つないでみたけど、結果は同じだった。ショホ゛ーン
何がどう同じだったのか書け。それでも同じように謎の ACK が出て
たのか? 古いコネクションの ACK が流れてる可能性がある、という
仮説なんだから、ちゃんと回線トレース確認汁。

> テスト中に中断するためにクライアントをCTRL-Cで止めてるんですが、
> これはまずいっすか?
そーゆー話はどーでもよくって、サーバ側がどういう作りになってる
か説明汁。TIME_WAIT が残るような作りなのかどうか。
0556506NGNG
>>555
度々すまん。

>何がどう同じだったのか書け。
>それでも同じように謎の ACK が出てたのか?
>古いコネクションの ACK 流れてる可能性がある
クライアントのプログラムを必ず30000から順番にポートを使うようにさせたら
一度テストプログラムを動かしただけだと問題ないんだけど、
二度目に起動するとSYN-ACKじゃなくてACKが返ってきてた。
サーバーは全コネクションで同じポート使ってるし、
クライアントは一度目と同じようなポートをbindしてるから全く同じソケットペアになってる。
古いコネクションのほうのACKか、っていうのは判断できる?

>そーゆー話はどーでもよくって、サーバ側がどういう作りになってる
>か説明汁。TIME_WAIT が残るような作りなのかどうか。
サーバーはソケットをaccept後にrecv, send, recv, recv, {recv, send}*10という処理をしてる。
recvの前にはselectしていて、5秒でデータが来なかったらclosesocketしてる。
この後はselectでソケットがシグナルされて、recvの戻り値が0以下の時に切断してる。
送受信してるデータは全部64byte固定で、サーバー側は64byte単位で読み込んでる。
0557506NGNG
あとクライアントが1000コネクション張った後に一気に1000回closesocketを呼ぶと
サーバー側でnetstatで見ると800個くらいESTABLISHEDのコネクション残ってた。
100ms間隔でclosesocketしたらほとんど消えてた。

Establishedなつもりのソケットペアと同じソケットペアでsynが送られたから、っていうのが原因?
0558デフォルトの名無しさんNGNG
>>556
>古いコネクションのほうのACKか、っていうのは判断できる?
全ての回線トレースがあれば、シーケンス番号と ACK 番号の
繋がりから判断できるだろ?
だから、古いコネクションの時からのトレースを確認しろと
言っている。

>この後はselectでソケットがシグナルされて
意味がわからんぞ。
0559デフォルトの名無しさんNGNG
実はサーバー側で蟹さんとか使っていて、パケット落としまくっ
てるだけじゃないのか?
0560デフォルトの名無しさんNGNG
>>506理解力なさ過ぎ。
>>545の話をちゃんと咀嚼して理解してやって。
0561545NGNG
>>559
(蟹は別にして) その可能性も否定できないね。
以前のコネクションでクライアントからの FIN
を取りこぼしてたとしたら、こういう状況になる
かもしれん。

ただ、その場合、クライアント側では FIN の再送
を繰返し、FIN+ACK が得られるまで FIN_WAIT_1 or
FIN_WAIT_2 状態で残るはずだから、何度か後の
connect() 時に同じポート番号が使われた、という
点の説明がつかない。SO_REUSEADDR を使うことで、
クライアント側で FIN_WAIT_1 or FIN_WAIT_2 で残
っているポート番号を bind() することは可能だが、
それと同じコネクション対になる相手に対して
connect() しようとした所で、EADDRINUSE エラー
になるはず。

とりあえず、netstat -s や netstat -i での確認を
しようとしない >>506 に乾杯!
0562デフォルトの名無しさんNGNG
蟹?
0563デフォルトの名無しさんNGNG
  ∧||∧     \    │   蟹 警報! ! |  /
 (  ⌒ ヽ      \   └―――──―――┘ /“corega FEther PCI-TXC Plus
  ∪  ノ        \     ヽ(´ー`)ノ    / 】“ELECOM LD-10100S
   U U        \    ∧∧∧∧∧ / 易】“ GreenHouse GH-ET100RT
 オンボードが蟹だった \<     カ  >【安易】“駄メルコ LGY-PCI-TXD
v(・ω・)v v(・ω・)v v(・ω・)v<      二 .>【安易】“プラネッ糞 FW-110TX
v(・ω・)v v(・ω・)v v(・ω・)v< 悪   チ  >【安易】“哀王 ET100-PCI-L2
―――――――――――‐< 感  ッ  >―――――――――――――――――――‐
 蟹チップ___マンセー`ヾヽ< !!!!!  プ  > 蟹は蟹であると見抜ける人でないと  |\
    ,r''´  ,ォく ̄^       〉、<     の >(ハイエンドなLAN環境を実現するのは)難しい
 /     / ノ !        / { } ∨∨∨∨∨ \     / |/|           __ \  /
./       し' ノ、   , -、 {  `′ /         \   \ 丿 __     '"ゞ'-'  | |
{ ヾ;、.   _,.ィ「! }-ィ゙ /〉}、ヽ,  ‐/              \  | | '"-ゞ'-'____| | __//
ヽ、 ~ ,r'ソ  ト-'′ `┬'^い, }  /  ∧∧   ミ ドスッ \\\| | ̄ ̄ ::::::::   ̄ ̄\/
.( 'ー')j/  ヾj   jツ   i / ,ゝ/  (   ,,)┌―─┴┴─‐`く      ( ,-、 ,:‐、    |/\
. [`〔」ノ     `'ー'゙    {  `7  /   つ   RealTek   \              |/\
  `'y′            [ニ7 〜′ /´ └―─┬┬─―─ \  __,-'ニニニヽ .   |/\
   〉             } /   ∪ ∪         ││ ε3     \ ヾニ二ン"     |/\
  (  蟹. REALTEK ノ/             ゛゛'゛'゛        \_____/
0564デフォルトの名無しさんNGNG
俺のはLGY-PCI-TXCなんだが…蟹?
0565デフォルトの名無しさんNGNG
>>564 SiS
0566デフォルトの名無しさんNGNG
>>549
多分忘れると思うので、また後で教えてください。
0567デフォルトの名無しさんNGNG
ワロウタ
0568デフォルトの名無しさんNGNG
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-4.html#ss4.11

これ読んだけどわかりにくい
SO_REUSEADDR と SO_REUSEPORT との違いは何ですか?
2chらーにもわかるように解説ヨロ
0569デフォルトの名無しさんNGNG
このスレと http://www.kt.rim.or.jp/~ksk/wskfaq-ja/ の御かげで
Winsock を使ったサーバアプリが無事完成致しました。
この場を借りてお礼を申し上げまつ。 m(__)m
0570デフォルトの名無しさんNGNG
>568
・TIME_WAIT状態のポートへのbindを許可する(bind出来るのは1プロセス)
・1つのポートに複数のプロセスが同時にbind出来るようにする

と書いてあるように見えるけど。
0571デフォルトの名無しさんNGNG
>>568
SO_REUSEPORT はマルチキャストのためのオプション。
つまり、UDP で使う物。TCP には関係ない。
確かに引用されている FAQ には「UDP」の文字が出て
こないから、シロートには分かりづらいかもしれない。
マルチキャストを知っていれば自明なんだけど。

SO_REUSEADDR は、TCP のコネクション対が全く同一
にならなければ、ローカルポートが同じコネクション
も存在可能にするオプション。SO_REUSEADDRを設定
していても、コネクション対が全く同一になるコネク
ションは同時には存在できない。そのようなコネクシ
ョンを作ろうとするシステムコール (bind(), connect())
は EADDRINUSE エラーになる。
0572デフォルトの名無しさんNGNG
超遅レスに思えたけど、まだ一日経っていないのね。
0573568NGNG
>>571
(゚∀゚)サンクスコ
0574デフォルトの名無しさんNGNG
socket関数で、 0 が帰ってくるときがあるんだけど
こりゃーいったい何を意味してるのかな
0575デフォルトの名無しさんNGNG
sd = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP );
これでsd==0になることってあるの?
0576デルファイの名無しさんNGNG
こんちわ。

いま、DOSベースでTCPIPのパケットをとばす方法をさがしてます。
DOSのアプリで、シリアル通信をしていたのを、TCPIPでやりたいと言う
要求があるのです。

WindowsベースではWINSOCK使ってチャットみたいなことをした経験は
あるのですが、DOSでどうやったらいいか途方に暮れています。

昔、よくLANMANでファイル共有なんかさせていたので、とりあえずLANMAN
のシステムコールとかAPIの資料をさがしてるんですが、なかなか目的のものが
見つかりません。

ここらへん、参考になる資料とか、サイト、使えるモジュールなど(有償でもかまい
ません)はないでしょうか。

よろしくおねがいします。
0577デフォルトの名無しさんNGNG
>>575
0を閉じればありうる。
0578デフォルトの名無しさんNGNG
IBMのWebBoyとかフリーのTEENとか
0579デフォルトの名無しさんNGNG
DOSでSMB使いたいとか言い出さないでね
0580デフォルトの名無しさんNGNG
>>576
ネットワークプログラミング相談室 Port4
0581デフォルトの名無しさんNGNG
>>577
(゚∀゚)サンクスコ
まさにそのとおりでした
0582デルファイの名無しさんNGNG
おはようございます。

>578
Linx をちょっと漁ってみてますが、、、ソースだけではちょとつらいです。。。。
そこら辺もちょっと攻めてみようと思います。

>579
いへいへ、TCPIPでチャットみたいな事ができればいいのです。制御系のPCで、
機械制御してるのでWindowsはつかえなくてDOS使ってるところで、LANで通信させたいもので。

>580
ありがとうございます。いっぺんみてみます。。。
0583デフォルトの名無しさんNGNG
古いところでは、↓こんなのも。simtel.net: 昔の超有名サイト。
http://www.eunet.bg/simtel.net/msdos/tcpip.html
0584デフォルトの名無しさんNGNG
send が失敗すると2分後くらいに recv が -1 を返すんですが、
この時間って変更可能なのでしょうか?
0585デフォルトの名無しさんNGNG
ちゃんと説明して。
0586デフォルトの名無しさんNGNG
全く無関係アプリのバグ
0587デフォルトの名無しさんNGNG
>>584
応答のあるものなら2分なんて待たずに
さっさと捨てるべし
0588デフォルトの名無しさんNGNG
ttp://x68000.startshop.co.jp/~68user/net/

↑を見ながらHTTPクライアントを制作していますが
WebサイトによってGETの挙動が違うようで悩まされています。

<ケース1>
pc2.2ch.netに接続して"GET /tech/subject.txt HTTP/1.0"を送ると
Not Foundになってしまい、
"GET http://pc2.2ch.net/tech/subject.txt HTTP/1.0"
だと取得できます。

<ケース2>
www.ff.iij4u.or.jpに接続して"GET /〜ch2/bbsmenu.html HTTP/1.0"を送ると
ページを取得できますが"GET http://www.ff.iij4u.or.jp/~ch2/bbsmenu.html HTTP/1.0"
だとAccess Deniedで拒否されてしまいます(ケース1と逆)。

<ケース3>
taruo.netは"GET /e/ HTTP/1.0"でも
"GET http://taruo.net/e/l HTTP/1.0"のどちらでも取得できます。

どのケースもサーバはApacheでした。
参考にしているサイトによるとGETメソッドはpathを指定するようです。
つまりケース2と3の挙動が正しいようなのですが、
なにか勘違いをしているようでしたらご指摘下さい。
0589デフォルトの名無しさんNGNG
一部、チルダが全角に化けたり、/e/のあとに余計なlが入ってしまいました。
すみません。
0590デフォルトの名無しさんNGNG
Host:
0591584NGNG
>>585
LANケーブルを抜いてsendすると、sendは成功するけど 2 分後くらいに
コネクションが切れます。2 分以内にケーブルを刺しなおすと送信できるんです。
なんて気の長いタイムアウト値なんだ・・・ということが言いたい。

>>587
さっさと、close(socket) してしまえって事?
リトライしても送信バッファに溜まるだけですよねー。
0592デフォルトの名無しさんNGNG
タイムアウト値を調整するより途中でキャンセルできるインターフェースを作っとけばいいんじゃないの。
何作ってるのか知らないけど。
0593デフォルトの名無しさんNGNG
>>588
Hostヘッダ付けれ
0594デフォルトの名無しさんNGNG
>>591
2 分なら短い方だ。たいがいの OS では、
TCP 再送タイムアウト時間は 10 分近い。
気に入らないなら、TCP の再送タイムア
ウト時間を短く変更すればいい。

けど、システム全体に影響するから、普通
はそんなことやらない。そのアプリケーション
で、一定時間内に相手から応答がなければ、
エラー処理にするように作るのが普通。

「リトライ」はダメでしょ。お前は TCP を
なんだと思ってんだYO。
0595デフォルトの名無しさんNGNG
> 気に入らないなら、TCP の再送タイムア
> ウト時間を短く変更すればいい。

>>594は分かって書いてんだろうけど誤解を招きそうな予感。

http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#peer_death
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-4.html#ss4.7
0596584NGNG
一定時間、相手から応答が無ければ shutdown() してまえ。でええの?

>>594
>「リトライ」はダメでしょ。お前は TCP を
>なんだと思ってんだYO。

そ、そうなんですか。。。
元々 RS232C で実装されていたものを Ether Net + TCP/IP に変えたですよ。
首くくって出直して来ます・・・ _| ̄|○
0597デフォルトの名無しさんNGNG
>>588
Host:はさんざんがいしゅつだから
ケース2について補足しておくとmod_proxyの仕業
> 参考にしているサイトによるとGETメソッドはpathを指定するようです。
AbsoluteURLを指定する書式はHTTP/1.1では正しい。
0598594NGNG
>>596
> 一定時間、相手から応答が無ければ shutdown() してまえ。でええの?
だーかーらー、それで「ええ」のかどうかは、そのプログラム
書いてるお前にしか判断できないでしょ。
そのコネクションは、もうだめぽ、と判断するんなら、素直に
close() すれば。わざわざ shutdown() することに意味はない。
0599デフォルトの名無しさんNGNG
>>590,593,597
ありがとうございます、解決しました。
散々がいしゅつだったのですね、過去ログはPort8スレしか読んでいませんでした。
0600584 NGNG
>>598
え〜、タイムアウトでリトライだめぽならコネクションの安楽死しか無いでしょ〜。
0601デフォルトの名無しさんNGNG
「猫でも分かるネットワークプログラミング」を読んで勉強してるんですが、
分らないことがあるので質問させてください。
とりあえずTCPチャットをサンプル通りに打ちこみ、
自分の一台のパソでサーバとクライアントを両方起動してたところ、
LAN側のローカルIPとかホスト名を指定した場合は上手く通信できたんですが、
グローバルIPを入れると通信が確立できませんでした。
自分のグローバルIP(らしきIP)にpingをうってみたら
やはり応答がないみたいなんですが、なにか根本的に勘違いしてるんでしょうか?
ヤフーなので固定IPではないらしいんですが、
実際昨日調べてからずっとかわってないみたいなので、その辺は問題ないと思うのですが、、。
ド素人なので場違いなようで申し訳ないんですが、
何か理解のヒントになるようなことでも良いので助言をいただけたらと思います。
環境はWIN2000とVC++6です。
0602デフォルトの名無しさんNGNG
その「グローバルIP」は実はルータのインターフェースに付いているという
落ちではないだろうな。
0603601NGNG
>>602
すいません、、ちょっと意味が理解できないであります。
家のなかでデスクトップとノートをルータで繋いでるんですが、
その間では通信できましたし、一台のPCの中でも出来ました。

グローバルIP(と思い込んでいるIP)は
「確認君」などのグローバルIPチェックサイトで調べた物なんですが、
それじゃまずいのでしょうか?
そのルータのインターフェースに付いているIPというのは
確認君などで見れるIPアドレスとは違ったものなんでしょうか。
0604デフォルトの名無しさんNGNG
落ちましたな。御後が宜しいようで。
0605デフォルトの名無しさんNGNG
>>603
何が起きても責任は持てないが、そのルータのフィルター機能を全て
無しにして味噌。
0606デフォルトの名無しさんNGNG
>>605
(・∀・)ニヤニヤ
0607デフォルトの名無しさんNGNG
脳豚入れてるので無問題なりぃ。
0608601NGNG
>>604
ありがとうございます。
やっぱりなんかすごくバカな事を聞いてるんでしょうか。
そりゃ出来なくて当たり前、ってことでしたら、
なぜ出来ないのかというのを
何となくのイメージでよいので理屈で理解したいのですが。。

>>605
ありがとうございます。
よくわかんないのでとりあえずいったんルータを外してみようかなと思ってるんですが、
なかなか面倒そうであります。

このままの環境ではルータを挟んでる関係で
グローバルIPを使っての自分から自分への送受信はできないけど、
クライアントの方を友達とかに渡して
外から繋いでもらえばできるんでしょうかね?
今日は遅いんで明日にでも試してもらおうと思ってるんですが。
0609デフォルトの名無しさんNGNG
>>608
マジレスすると、そのチャットソフトで使ってるTCPポートを開いて
ローカルなIPへ通すような設定をルータにしないと無理。

ルータの説明書を読んで味噌。Web鯖を外部へ公開する方法とか
書いてあるはずなので、その方法と同じやり方で出来るはず。

ちなみに漏れはルータなんか使ってないのでグローバルから
素通し。あひゃひゃひゃ。
0610デフォルトの名無しさんNGNG
初級ネット板へでも行って、ポートマッピングについて教えて貰うといい。
0611デフォルトの名無しさんNGNG
ぶっちゃけグローバルIPが割り当てられていないPCで
ゴローバルIPのテストをするのは不可能
プロキシでも使わない限り

#ローカル環境の話ね、友達に穴つついてもらうのはOK、FTPのプログラミングでハマる人よく見るので蛇足ながら
0612デフォルトの名無しさんNGNG
>>611
ルータを作ればいいじゃん
0613デフォルトの名無しさんNGNG
閉じた環境ですべて設定してしまえばいいじゃん
0614デフォルトの名無しさんNGNG
しかしプライベート/グローバルIPだのNATだのよくこんな頭悪い仕組みを思いつけたもんだ。
0615米国防省NGNG
最初はこんなにインターネットが広まるなんて思ってなかったもん。
0616デフォルトの名無しさんNGNG
アメ公は腐るほどIPぶん取ってるくせに・・・
0617デフォルトの名無しさんNGNG
IPv6割り当ててくれるプロバイダはいつ登場するんだろう?
0618デフォルトの名無しさんNGNG
>>617
うちUSENだけど素でカメみえるよ。
ほかにもIPv6実証実験に参加してるプロバイダは結構あるとおもう。
0619デフォルトの名無しさんNGNG
クライアントが全て対応するか、
全てのISPがv4v6ゲートウェイやってくれないと、
v6だけでサービス立ち上げるわけにはいかないけどね。

>>614
というか、今でも頭の悪いプロトコル考えている奴らの方が…ICQとか…
0620デフォルトの名無しさんNGNG
おまいらネットワークプログラミングの前にネットワークを勉強しる!
0621デフォルトの名無しさんNGNG
>>620
先生!どこで勉強すればいいですか?
0622デフォルトの名無しさんNGNG
現場しかありません
0623デフォルトの名無しさんNGNG
>621
3分間Networkingをキーワードにぐぐりなさい。
そして隅から隅まで目を通し頭に叩き込みなさい。
0624デフォルトの名無しさんNGNG
ところでさ・・
IPv6とか、いまいち実感わかんのだけど・・・
結局目に見えたメリットはどんなのがあるの?
グローバルIPアドレスが増えるので、各PC1台ごとにグローバルIPアドレスを割り振る事が出来る
って聞いた事あったけど、結局グローバルIPアドレスを追加するには追加料金要るし・・・
0625デフォルトの名無しさんNGNG
IPv6なら人の細胞一個一個にIPアドレス振っても余るらしいよ
0626デフォルトの名無しさんNGNG
LAN内のプライベートIPから外のグローバルIPへ変更しなくても良くなるんだよね
0627デフォルトの名無しさんNGNG
>>624
下半分は基本的にMACアドレスからの生成だから、IPv4とは違って
PC増えたからって追加料金はないと思うぞ。
0628デフォルトの名無しさんNGNG
マルチキャストを使うとWinnyの転送効率が上がりそうだな。
0629デフォルトの名無しさんNGNG
>>628
何故?
ブロードキャストじゃねーぞ。

>>627
そりゃサービス内容によるんじゃないの?
0630ヽ(´ー`)ノNGNG
>>627
>>624 のような素人さんを騙す企業は出そうだな。

>>628
工夫すればできると思うけど、あんまり恩恵無いんじゃないかな。

スレ違い。
http://pc.2ch.net/test/read.cgi/unix/1002269333/
0631デフォルトの名無しさんNGNG
select() を使ったサーバのソースって何処かに落ちてない?
0632デフォルトの名無しさんNGNG
>>631
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man2/select_tut.2.html
0633デフォルトの名無しさんNGNG
>>632
早速教えて戴いてアリガトン
0634デフォルトの名無しさんNGNG
636 :ヽ(´ー`)ノ :04/02/28 16:08
>>633
> この板はプログラムを作る人のための板です。
mp3 のリッピングにせいを出す前に、ローカルルールを読む知恵ぐらい付けたらどうだね。


637 :デフォルトの名無しさん :04/02/28 16:11
>>636
MP3をさらにリッピングするのか?
PC初心者板へお帰り。
0635デフォルトの名無しさんNGNG
4引数selectのexceptfdsに入ってるハンドル、OOBを読み捨てればいいと思うんだけど何書いとけばいい?

perl5.8.3で IO::Socket と IO::Select 使ってるけど、Cとかの話でもいいからキボン
0636デフォルトの名無しさんNGNG
selectなんて使うの?
0637デフォルトの名無しさんNGNG
使いますよ。Win32のActivePerlです。
0638デフォルトの名無しさんNGNG
>>635
> OOBを読み捨てればいいと思うんだけど何書いとけばいい?

この文章の意味がわからんのだが。
「いいと思うんだけど]ってのは何なんだ?
0639デフォルトの名無しさんNGNG
>638
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select_tut.2.html
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/newbie.html#oobdata
0640デフォルトの名無しさんNGNG
MSG_OOBをrecv()しなくて無視するとどうなるのだろ?
ソケットバッファがオーバフローであぼーんか?

0641デフォルトの名無しさんNGNG
処理系の実装によるが、悪意のある接続先にOOBデータを送られ続けると
バッファが満杯になりデータを読めなくなるかもしれない。
ソケットにOOBINLINE を設定すればとりあえず問題ないけどね。(単にクライアントが壊れた入力を流してるように見えるだけ
0642デフォルトの名無しさんNGNG
>>640
OOB メッセージは 1 つしか滞留しないから、無問題。
基本的に 1 byte しか緊急メッセージとして扱わないのが、
普通の処理系。 >>641 は妄想。
0643デフォルトの名無しさんNGNG
>>642
0644デフォルトの名無しさんNGNG
C&Perlの簡単な例なら
ttp://x68000.startshop.co.jp/~68user/net/
0645デフォルトの名無しさんNGNG
>642
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/lame-list.html の7番
0646デフォルトの名無しさんNGNG
>>645
『Telnet アプリケーションで』って書いてあるが。。。
0647デフォルトの名無しさんNGNG
>>646
それがどうかした?
0648デフォルトの名無しさんNGNG
相手が送ってきたOOBを放置してたら通常のデータを読めなくなるのはtelnet以外のプロトコルでも同じ
0649デフォルトの名無しさんNGNG
Winsock でお勧めの本、
ありますか? 
    ありますか?
0650デフォルトの名無しさんNGNG
>>623
ありがとう
0651デフォルトの名無しさんNGNG
>>649
「あるあるあるあるあるーーーー」

ちゃーらーらーらーらー
0652デフォルトの名無しさんNGNG
お勧めっていっても一冊しか出てないし
0653デフォルトの名無しさんNGNG
>>652
お前は書名しか読めないのかよ
0654デフォルトの名無しさんNGNG
書籍ネタはスレ違いだし
0655デフォルトの名無しさんNGNG
nagle って、なんて読めばいいのでしょうか?
ナグル、ネイグル、ネァグル、ノグル
さすがに、殴れ、ではないだろうとは思いますが。
0656デフォルトの名無しさんNGNG
>>655
ttp://www.geocities.co.jp/Playtown-Spade/4875/conquest/kerunaguru_1.html
ケルナグール研究サイト
0657デフォルトの名無しさんNGNG
>>649
WinSockのおすすめ本。


WinSock2.0プログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4797306882/

TCP/IPによるネットワーク構築〈Vol.3〉
http://www.amazon.co.jp/exec/obidos/ASIN/4320029992/

猫でもわかるネットワークプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4797323604/

0658デフォルトの名無しさんNGNG
>>655
「なぐる」と読む。
0659デフォルトの名無しさんNGNG
>>655
ガッ
0660デフォルトの名無しさんNGNG
>>658
ありがとう!
0661デフォルトの名無しさんNGNG
ブロックソケット=同期、非ブロックソケット=非同期 と書いてある本があるけど
ブロックソケット=同期、非ブロックソケット≠非同期 ですよね?
0662デフォルトの名無しさんNGNG
はいそうです。
一般的にasynchronous communicationというのは、
requestとreplyが分離されているような通信スタイルのことです。
「非同期」と訳されることが多いのですが、ネイティブは「非同時性」のつもりで話しています。
「非同期」は定着してますが、はっきり言って誤訳です。
0663デフォルトの名無しさんNGNG
read() でデータが来るまで待たされる          ⇒ ブロック
read() でデータが無いとステータスが返る        ⇒ 非ブロック
read()? を実行しても忘れた頃にデータが返って来る ⇒ 非同期

であってるの?
0664デフォルトの名無しさんNGNG
そんなところです。
分散コンピューティング、分散アルゴリズムの本を読むと、
かなり詳しく概説してあります。
0665デフォルトの名無しさんNGNG
分散アルゴリズムってこの本ですか?

分散アルゴリズム アルゴリズムシリーズ
亀田 恒彦 (著), 山下 雅史 (著)
http://www.amazon.co.jp/exec/obidos/ASIN/4764902257/qid=1078325089/sr=1-5/ref=sr_1_10_5/250-3543094-7533840
0666デフォルトの名無しさんNGNG
>>665
それは、キューイングセオリー屋さんの書いた本なのでちょっと違います。
高いけど日本語だと↓がだんとつのお勧め。

分散オペレーティングシステム UNIXの次にくるもの
前川 守 (編集), 清水 謙多郎 (編集), 所 真理雄 (編集)
http://www.amazon.co.jp/exec/obidos/ASIN/4320025709/
0667デフォルトの名無しさんNGNG
非同期云々ごときでんなもん薦めんでも
0668666NGNG
そりゃ、そうかも。
0669デフォルトの名無しさんNGNG
>>666
キューイングセオリー屋ってなんすか?

>UNIXの次にくるもの
Plan9 とか。
0670デフォルトの名無しさんNGNG
>>666
きゃ〜、今月は本代を2マソも使ったのに・・・ホスイ
0671デフォルトの名無しさんNGNG
>>670
いろいろ勉強し出すと本代ってどんどん増えてくよね。
図書館行っても糞だし。
近所の大学の図書館にはわりといろいろあるけど…
0672デフォルトの名無しさんNGNG
TCPとWinSockでペイントチャットを作ってます。
絵を描いた時のマウス座標を文字列としてお互い送受信してるだけで、
座標6バイト+文字列尾のNULL文字1バイトの計7バイトのデータなんですが、
どうも見た感じ送信側の速さに対して受信の処理が追いついてないような感じで
送信側の動きがダイレクトに伝わりません。取りこぼしをしているのではなく、
受信側が必死に追いかけてやっと再現されてるような感じです。
にもかかわらず、送受信する文字列のサイズを1024ずつ(使うのは先頭7バイトのみ)
にしてみると、なぜか滑らかに伝わります。
でかいサイズを同じ頻度で送受信するので普通に考えると負担が増す思うのですが、
これはなぜでしょうか。。。
0673デフォルトの名無しさんNGNG
ある程度パケットが溜まってから送信する設定になってるから
0674デフォルトの名無しさんNGNG
>>672
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/intermediate.html#nagle-desc
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/intermediate.html#disable-nagle
0675672NGNG
ありがとうございます。
お馬鹿な〜って症状なんでしょうか。
ネットゲー作ったりするときなんか出来るだけ送受信データを小さくする
ように努力するもんだと思ってたんですが、
小さくしすぎてもパフォーマンスに影響するんですか・・・
(誤読してないとすれば。)
わけわかんなくなってきました。
0676デフォルトの名無しさんNGNG
Nagle アルゴリズムをオフにしてパケットのバッファリングを殺せって事だよ。
0677デフォルトの名無しさんNGNG
>>675
データを小さくするってのは正解だけどそれだけじゃ失格。
各データを使うタイミング情報を付けるなどの工夫するから期待する動作になる。
0678デフォルトの名無しさんNGNG
それより、672は、TCP使ってたの?
UDPにするのは常識だと思うが
0679デフォルトの名無しさんNGNG
>>678
UDPでマトモに相手側に描画できるか?
エラー処理とかしてたらTCPの方が良いような・・・
0680デフォルトの名無しさんNGNG
UDPにするのが常識ねぇ…
0681デフォルトの名無しさんNGNG
>>678
UDPにするのも一つの案だとは思うけど、常識か?
動画を見るだけならUDPとかで多少パケット落としながらでも
良いけど、絵を描くとなるとあまり情報が欠落しても困るような…。

試してみる価値はあると思うけど。
0682デフォルトの名無しさんNGNG
>>672
本当にリアルタイムに相手側に反映させる必要があるのかどうかをまずは検討した方がいいよ。
インターネットなんていい加減な環境でまじめにやろうとすると結構しんどいから。

今はたぶん同一のマシンかLANで隣のマシンに並べてテストしてるからラグが
はっきり見えるだけでインターネット越しだったら全然気にならないかもしれないし。

あるいは単に描画がカクカクするのが気になるだけなら
受信パケットをローカルのキューにためておいて
描画に適当なウェイと入れて(例えば最速で0.1秒に1ドット)表示するようにすれば
見た目上は滑らかに描画されてるように見えるかもしれないし。
0683デフォルトの名無しさんNGNG
>>681
> 試してみる価値はあると思うけど。

>>672=675にはまだ早いんじゃないかな。酷くなる一方だと思う。
0684デフォルトの名無しさんNGNG
WindowsのターミナルサービスはTCPで画面描画やってる罠。
0685デフォルトの名無しさんNGNG
X-Window もVNCもそうだよ。
あのへんは描画コマンドを送ってるからパース仕切れなくなると困る。

ただUDP使ってる動画ストリーミングプロトコルにはそれはそれでそれなりの理由があるよ。

>672
本当のリアルタイムはインターネットだとムリ。
googleやyahooにpingして遅延がどのくらいあるのか見て、
どの程度の遅延が許容できるのか考えた方がいい。
俺ならマウスを押してから離すまでのストロークを記録して、ある程度長くなった時点で送るね。
もちろんTCP_NODELAY
0686デフォルトの名無しさんNGNG
age
0687デフォルトの名無しさんNGNG
>>685
>ただUDP使ってる動画ストリーミングプロトコルにはそれはそれでそれなりの理由があるよ。
なんにしてもペイントアプリにUDPは向かないよ。
もしUDP使った場合一通り送って取りこぼした情報再送するようになるから
最初に歯抜けの線が表示されて後から抜けた部分が補完されてしまってカコワルイ。

>俺ならマウスを押してから離すまでのストロークを記録して、ある程度長くなった時点で送るね。
>もちろんTCP_NODELAY
これだけだとカクカクするのは直らないでしょ。描画開始のラグが減るだけで。
パケットにGetTickCount使った時間情報仕込んでおくといいのかも。
0688デフォルトの名無しさんNGNG
>>685
>俺ならマウスを押してから離すまでのストロークを記録して、ある程度長くなった時点で送るね。
これが一番分かりやすくて良い方法なんじゃないかな>>672
0689688NGNG
>>687
>パケットにGetTickCount使った時間情報仕込んでおくといいのかも。
これは当然仕込んでおくと思って>>688を書きました。
0690デフォルトの名無しさんNGNG
>>688
>これが一番分かりやすくて良い方法なんじゃないかな>>672
5秒かけて線引いた場合、相手側に表示が始まるのは5秒後で終了するのは10秒後だろ。
あまり賢いやり方ではないな。
0691デフォルトの名無しさんNGNG
>>676 じゃダメなの?
たまにインターネット越しに X 飛ばすけど、それ程問題を感じてないなぁ。
0692デフォルトの名無しさんNGNG
>690
なんで同じ速度で線を引くんだ?
0693デフォルトの名無しさんNGNG
あと「ある程度の長さになったら」ってのも理解してないよな。時間とか距離とかストロークの区間とかで判断できるじゃん
0694デフォルトの名無しさんNGNG
>>691
負荷で不可。個人使用なら実害はないだろうけどさ。

>>693
>あと「ある程度の長さになったら」ってのも理解してないよな。
>時間とか距離とかストロークの区間とかで判断できるじゃん
1ドットごとにsendしとけばそこらへんは時間またはサイズを見て
WinSockが勝手にやってくれるんだから二度手間。
0695デフォルトの名無しさんNGNG
だいたいUDPと大文字でタイプする時点で釣りだろ。
0696デフォルトの名無しさんNGNG
頭文字だからいいんじゃないの?
つかこれも釣りか?
0697デフォルトの名無しさんNGNG
>>696
全角文字のことを大文字と言う人が結構いるものだ。
0698672NGNG
どうも、色々ありがとうございます。
やっぱり手描きチャットなんで、作るんだったら
相手の腕の動きの生々しさまで伝わってくるようなものを作りたいです。
なので>>672に書いた通り、真面目に座標一つ拾うごとにsend・recvして
テストしていたわけなんですが(ローカル環境で)、
どうも見た感じ送受信のタイミングがずれるみたいだったので、
座標を拾ったりsendする間隔をtimeGetTimeで大きくして補完する
というのも試してみました。が、やっぱり見た目がちょっといまいちな感じでした。

それから今度は同じローカル環境で単に1024バイトとかデカイ文字列に入れてみたら
座標一つ拾うごとの送受信でもなぜか上手くいったので(座標は先頭の数バイトに一個だけ。)
友人宅と繋いでテストしてみたんですが、相手の描いた絵はこちらに滑らかに伝わってきたものの、
こちらの絵が相手には点々でしか伝わらなかったようでした。
こりゃデータサイズが大きいしこっちの上りが遅いからかなぁ、とか適当に結論付けたのですが、
TCPなのに取りこぼしってするんですかね?(実はこの辺すらよくわかってなかったり。。。)

とりあえずタイミングをずらす原因となっているオプションを切り替えてみるのと、
時間情報と合わせて拾った何個かの座標を一括して送り相手側で再生する方法を
試してみようと思います。
0699デフォルトの名無しさんNGNG
>>698
> 座標を拾ったりsendする間隔をtimeGetTimeで大きくして補完する
> というのも試してみました。が、やっぱり見た目がちょっといまいちな感じでした。

なんてやる前に、

> とりあえずタイミングをずらす原因となっているオプションを切り替えてみるのと、

をやりなよ。NO DELAYでね;-)
0700デフォルトの名無しさんNGNG
700
0701デフォルトの名無しさんNGNG
listコマンドを行うと↓のような形式で表示されるのですが
drwx---r-x 7 qqq hpusers 4096 Nov 20 14:25 .  �@
drwx---r-x 8 qqq hpusers 4096 Oct 4 2002 ..  �A

この時に、日の後は時間や年になっているのですが、
�@の場合の年は何年か?�Aの場合の時分は?
と、悩んでおります。
この謎を教えてください
0702デフォルトの名無しさんNGNG
この板のこのスレを選んだ基準は?
0703デフォルトの名無しさんNGNG
ls --full-time
0704デフォルトの名無しさんNGNG
>>701

FTP の LIST コマンドのことだと推測。
つか、人に推理ゲームさせないで最初から書きなさい>>701

質問に対する答えは
(1) 過去の6ヶ月以内の日付(GNU ls の場合)
(2) 表示されないため、そこから知ることは不可能

代案は
1. MDTM が実装されていればそれを使う。
2. オプションが渡せれば --full-time (GNU ls の場合)
0705ど素人NGNG
ネットワークの達人のみなさま。教えてください。
いまソケット(TCP)でプロセス間通信をしようとしています。
サーバとクライアントがいて、クライアントからの電文をサーバで受け、応答します。
この場合、C->Sへの電文が喪失したり、その応答が喪失したり、タイムアウト後に送れて届いたりといったことは
発生するのでしょうか?TCPは相手にできる限り届けるプロトコルということをどこかで読みました。
すると喪失したら再送はTCPが責任をもって行うのでしょうか?
それともアプリで応答がない場合はもう一度送るなどの処理を入れるのでしょうか?

よろしくお願いします。
0706デフォルトの名無しさんNGNG
>>705
>>2
0707デフォルトの名無しさんNGNG
>>705
遅れることはある。再送は責任もってしてくれる。
0708デフォルトの名無しさんNGNG
>>707
注:届かない時は届かない


まぁ、俺も未だかつて見たこと無いんで真偽のほどは分からんが、
会社の上司から「実際にあった」と聞いた。
0709デフォルトの名無しさんNGNG
>>708
届かないときは recv() に -1 が返って来るけど
何のエラーもなく届かなかったってこと?
0710デフォルトの名無しさんNGNG
>>694
ストローク単位だと圧縮できるじゃん。
0711708NGNG
>>709
その通り。
ここらへんはRFCでも定義されてなかったと思うから、実装によって挙動は違うかもしれない

少なくともBSD系では、送り側の配送失敗は明示的にエラーが出ない。
で、そんな場合でもコネクションは切れてないから受信側でもエラーは検出できない

すると、バイトストリームの途中がぽっかり抜けて受信されて、途中からデータがおかしくなる。
結局どう解決したかと言うと、全MSGの頭にSignature付けて毎回確認したそうな。

まぁ、普通は完全におかしなデータ受け取った時点でコネクションを
切るけど、その時はそれができなかったんだとさ。

#嘘言ってたら突っ込みよろしく( ̄▽ ̄)ノ
0712デフォルトの名無しさんNGNG
write(socket,buf,1024)としたのに戻り値が1023以下ということはあったはず。
のでwrite()の戻り値をちゃんとチェックすれば大丈夫じゃなかったっけ?
0713708NGNG
>>712
それは送信バッファに入らなかった時じゃないか?
TCPは送信バッファに入った後に、再送も含め配送の処理を行うから
そこでエラー起きると、writeの戻り値じゃ判断つかないと思う。
0714デフォルトの名無しさんNGNG
>>713
だとしたら、それはTCPスタックのバグだろう。
0715デフォルトの名無しさんNGNG
>>711
そんなことはありえない。送受双方が同時に糞スタックでない限り。
実装ごとに違うのではなくて、まともな実装としては認められないものでしか起き得ない。
仕様を読めば分かる。seq#が先に進まないから。
>>712
そう。
>>712
もしそんな危機的なことが起きたら、接続が切られます。糞スタックでない限り。
>>713
ですね。
0716デフォルトの名無しさんNGNG
ああ、みなさん。いろいろレスありがとうございます。
とりあえずまとめてみます。
理論上は、
1 電文が喪失した場合はTCPが再送してくれるが届かないこともある。そのときは受信側でrecvが-1を返すので判定できる。
2 電文が遅れて到着することがある。
3 write(send)の戻り値は送信バッファに格納できたバイト数であり送ったバイト数ではない。

アプリケーションとしては

1への対処:(C->Sに要求を出したと仮定)
サーバでrecvの戻りが-1だった時はNGを応答する。
クライアントはそのNG応答を正しく受け取った場合、送りたかった要求を再送。
正しく受け取れなかった(recvが-1を返した)場合はやっぱり要求を投げなおす。

2への対処:
サーバやクライアントが遅れて到着したものを受けて誤動作しないよう、TCPの上の
層(アプリ)でシーケンス番号を割り振ってチェックする。おかしいのははじく。

といったところでしょうか。(うーん。なんかまちがってそう)
0717デフォルトの名無しさんNGNG
>>716
> 2への対処:
> サーバやクライアントが遅れて到着したものを受けて誤動作しないよう、TCPの上の
> 層(アプリ)でシーケンス番号を割り振ってチェックする。おかしいのははじく。
補足:
TCPソケットはストリームなので同一ソケット中でデータが前後することはない。
ありえるのは複数のソケットに書き込みしたとき、順番通りに到着するとは限らないってこと。
0718デフォルトの名無しさんNGNG
>>716
> (うーん。なんかまちがってそう)

全然ダメです。>>1のFAQから勉強し直しです。
0719デフォルトの名無しさんNGNG
>>716
>1 電文が喪失した場合はTCPが再送してくれるが届かないこともある。
この曖昧な書き方、やっぱり解ってないんじゃない?
TCPを使っているなら必ず届くまで再送してくれる。
もしいつまでも届かない場合があったならば、それはTCPの問題ではなくネットワークの問題。
途中でADSL回線がぶちきれたとか、ケーブルが抜けおちたとかさ。
このときTCPが異常を発見できれば、発見した方(またはsend、recvの両方)で-1が返る。
0720デフォルトの名無しさんNGNG
エラー処理なんか考えなくていいよ
0721デフォルトの名無しさんNGNG
>TCPを使っているなら必ず届くまで再送してくれる。
>もしいつまでも届かない場合があったならば、それはTCPの問題ではなくネットワークの問題。

という表現も曖昧じゃない? はっきりとTCPタイムアウトについて説明した
方がいいと思う。
0722デフォルトの名無しさんNGNG
質問スレにも書いたんですが
スルーされてしまったのと、こちらのスレで聞くほうが適切だと思ったので再度質問させてください。

WinSockでWSAAsyncSelectを使い
イベント受信で処理するサーバープログラムを組んでるんですが
複数の接続がある場合、個々の接続に対応するにはどうすれば良いのでしょうか?
その時のsocketにそのまま返せばOKですか?
0723デフォルトの名無しさんNGNG
>>722
マルチ氏ね。
しかも、>1や過去ログも読めないのかよ。二回ほど氏ね。
0724デフォルトの名無しさんNGNG
>>711
send() が失敗して recv() に -1 が返ってくるのはかなーーーーり遅いので
何も返って来ないと勘違いしてるだけでは? 10分以上掛かるんじゃないかな。

>>719
send() が失敗したときに send() にエラーが返って来ましたっけ?
0725デフォルトの名無しさんNGNG
>>722
FD_ACCEPT が来たら accept() すれば良いだけでわ?
でソケットを取得したら、FD_READ, FD_WRITE で WSAAsyncSelect() にぶち込むか
スレッドでも作れば?
0726デフォルトの名無しさんNGNG
DNSのような問い合わせに対して返すシステムを組んでます。
返すデータもIPアドレスなので、少量なのですが
UDPの方が良いかな?と迷ってるのですがどうなんでしょうか?
一応数万の問い合わせが有るシステムなのですが・・・・

ただ、問い合わせにあまり失敗されてレスポンス悪くなっても困るんでTCPにすべきなのか迷ってます。
助言お願いします。
0727デフォルトの名無しさんNGNG
プロトコルを選ぶ基準が…
0728デフォルトの名無しさんNGNG
HTTPにして複数台サーバ立ててLBしたほうが運用上も楽かもしれんよ。
0729726NGNG
レスどうもです。

う〜ん、実はHTTPでやった方が楽と言う気も確かにして来ました。
もう少し考えて見ます。
どうもありがとうございました。
0730デフォルトの名無しさんNGNG
一応数万の問い合わせ/sec
0731デフォルトの名無しさんNGNG
数万/secって・・・そりゃどの方法を使っても厳しいと思うが。
つか商用サイトか?だったら2ちゃんなんかで相談するのは間違ってるぞ。
0732726NGNG
え〜と、問い合わせする可能性のあるクライアントが数万と言うだけで
それらが同時に問い合わせする事は考えにくいです。
0733デフォルトの名無しさんNGNG
待ち行列理論
0734デフォルトの名無しさんNGNG
>>730
と
>>732
で言ってることが全然違うのに笑った
0735726NGNG
>>734
>>730は俺じゃないっすw
0736デフォルトの名無しさんNGNG
そもそもDNSってなんでUDPなの?
0737デフォルトの名無しさんNGNG
>>736
UDPの方が高速で軽いから
DNSのような少量のデータで、特に信頼性もいらないような通信だと好都合
0738デフォルトの名無しさんNGNG
っていうか、TCPにしたら、IPアドレスより容量のでかいヘッダをつけなければならなくなって
理不尽だと思うw

中身より高価な財布を持つくらい不毛
0739デフォルトの名無しさんNGNG
10バイトのデータを TCP でやりとりしている漏れの立場は・・・
0740デフォルトの名無しさんNGNG
10バイトだろうが1バイトだろうが、簡単に落ちたら困る場合はTCP。

DNSもネームサーバ間のブロック転送だかでデータ量が多くなると
TCP使うんじゃなかったっけか。
0741デフォルトの名無しさんNGNG
Winnyって、通信は非同期式なんですかねー?
0742デフォルトの名無しさんNGNG
アプリがsocketをどう使ってるは知らんが、通信はTCPだ。
0743デフォルトの名無しさんNGNG
>>741
nyをブロッキングでやってたらどれだけThread作らねばならん事やらw
ログみりゃ分かるけど、あれを全て独立したThreadでやってたらシステム�dじまうぞ
0744デフォルトの名無しさんNGNG
む・・・、今同期式でいちいちスレッド起こして作ってるんだが、非同期式に変えた方がいいのかのー・・・。
とりあえず一通りできて、パフォーマンスやばかったら考えよう。。
0745デフォルトの名無しさんNGNG
>>744
とりあえず動くまではそれでいいと思うYO!
0746デフォルトの名無しさんNGNG
同期、非同期、ブロック、非ブロックは区別して書いてくれ。
0747デフォルトの名無しさんNGNG
nyはselect()使ってるっぽいなぁ。
0748デフォルトの名無しさんNGNG
わからないとこがあるので、教えてほしいのです。
ソケット+マルチスレッドな簡単なサーバソフトを作りたいのですが、以下のところでつまっています。
わかる人、助言ください。
環境はSolarisです。
途中はちょっと省きます。

main{
socket作成
bind
listen
while(1){
  /*アクセプト*/
sock2=accept(XXX);
  /*スレッドへ処理を移行*/
pthread_create( NULL,NULL,func, sock2);
  /*ソケットをクローズして待ち状態にする*/
close(socket);
}
}
void func(socketの型 sock){
sockを用いた処理
exit(0);
}
で、スレッドへ移行して、処理をさせる場合、acceptで取得したsock2をどう渡したらいいかわかりません。
また、このとき、スレッドを何個も処理させるためにはどうしたらいいのでしょう?
よろしくおねがいします。
0749デフォルトの名無しさんNGNG
pthread_createの4個目の引数でしっかり渡してるじゃん。
0750デフォルトの名無しさんNGNG
狐憑き自動筆記か? 自分で応えてるじゃん

>>736
domain 53/tcp nameserver # name-domain server
domain 53/udp nameserver

TCP使いたければどうぞ。
0751デフォルトの名無しさんNGNG
最近思った
ソケットプログラミングって、初めはコンソールで作ると簡単だ とどの入門書にも書いてるが
WindowアプリでWSAAsyncSelect()でイベント駆動にした方が簡単ジャン

って思うんだが・・・・
0752デフォルトの名無しさんNGNG
イベント駆動にどの程度慣れているかの問題だと思われ
0753デフォルトの名無しさんNGNG
↓のSUN RPC For Windows NT/95/98/2000/ME/XP/CEに関する質問なんですが、ここで良いのでしょうか。
違うようなら板またはスレッドを教えてください。
ttp://netbula.com/oncrpc/
0754デフォルトの名無しさんNGNG
そういえばTCP/IP以外の質問もしていいのか・・・
0755748NGNG
>749
レスありがとう。

pthread_create( pthread_id* ,pthread_attr_t*,void* func(void *),void* arg);

pthread_createの4番目の引数は void *argで定義されているため、
値渡しができないと思うのですが。
で、下のはポインタの間違いでした。

void func(socketの型 *sock){
sockを用いた処理
exit(0);
}

sockをポインタで渡すと、呼び出されたfuncの中で値をコピーする必要がある
と思うのです。しかし、スレッドで呼ばれているので、次の瞬間には、別のアクセスが
来て、コピーする前にsockの中味が変更してしまう可能性があると思うんです。

また、acceptで取得したsockに伴うsockaddr_in構造体を渡してあげなければ、
funcの中でソケット通信ができないのではないでしょうか?

このようなとき、マルチスレッドでソケット通信した場合、スレッドはいくつくらいまで
同時に処理できるでしょうか?
(listenで用意した数よりも多くできますか?)

よろしくお願いします。
0756デフォルトの名無しさんNGNG
>>755
intをポインタにキャストして渡す。

#ある入門サイトを見るとそうやっているんだよなぁ・・・
0757デフォルトの名無しさんNGNG
>>753
どんと来いや。
0758デフォルトの名無しさんNGNG
>>756
> intをポインタにキャストして渡す。

そうすると、ANSI C的にはお行儀が悪いので、(多くの処理系では無問題)
intの値をメモリ上に持ってそのアドレスを渡す。
0759デフォルトの名無しさんNGNG
>>755
> sockをポインタで渡すと、呼び出されたfuncの中で値をコピーする必要がある
> と思うのです。しかし、スレッドで呼ばれているので、次の瞬間には、別のアクセスが
> 来て、コピーする前にsockの中味が変更してしまう可能性があると思うんです。

What is "sockの中味"?

> また、acceptで取得したsockに伴うsockaddr_in構造体を渡してあげなければ、
> funcの中でソケット通信ができないのではないでしょうか?

違います。OSのカーネルについてかなり誤解があります。
カーネルは単なるライブラリじゃないです。

とにかく、

pthread_create( NULL,NULL,func, &sock2);

void func(int *sockp){
*sockpを使った処理
exit(0);
}

をやってみろ。とにかく
0760デフォルトの名無しさんNGNG
mallocしたほうがいいだろうねー
受け取った側で中身取り出したあと、free

>>755
おまいはスレッドの勉強と
ソケットの勉強を
別々にもうちょっとやりなされ
0761755NGNG
レスしてくれた方々、ありがとうございます。
とりあえず、コンパイルして実行してみます。
0762デフォルトの名無しさんNGNG
すみません。winsock2.0についてお聞きします。
ローカルマシンでサーバアプリケーションを起動し、クライアントアプリケーションもローカルマシンで実行して接続するサーバアドレスを127.0.0.1にすると正しく動作するのですが、
LAN上のマシンでサーバを走らせ、LANのアドレスで接続すると、接続はうまくいきますが、127.0.0.1で実行したときと異なる結果になってしまいました。
このアプリケーションは、サーバの画面をキャプチャして、そのバイト配列をクライアントに送信するというものです。
127.0.0.1で実行するとしっかりとキャプチャ画像が送られてきました。
しかしLANアドレスでやるとクライアントが固まります。
おかしいなと思いデバッグしてみました。
すると、データの受信部(recv関数)でクライアントが永遠に待機状態になっていました。
バイト配列は途中まではちゃんと送信されていました。
サーバはデータの送信の終了を知らせるメッセージ"OWARI"を送ることになっているのですが、これが届いていません。
なぜ127.0.0.1ではうまくいくのでしょう。
問題のソースは次に張りますのでよろしくおねがいします。
0763デフォルトの名無しさんNGNG

/サーバ/
int BytesSent;
int bufLen = w*3*h;
BYTE* b ;//ビットマップのバイト配列
do
{
BytesSent = send(connectedSocket,(char*)b,bufLen,0);
b += BytesSent;
bufLen -= BytesSent;
}while(bufLen>0)
send(connectedSocket,"OWARI",strlen("OWARI"),0);

/クライアント/
BYTE* b//DIBのバイト配列へのポインタ;
int BytesRecv;
bool flag = true;
char bytes[1024+1];
ZeroMemory(bytes,1025);

while(flag)
{
BytesRecv = recv(soc,bits,1024,0); //←しばらく受信するとここでとまります
bits[BytesRecv]='\0';
string str=bytes;
if(str=="OWARI")
break;
memcpy(b,bytes,BytesRecv);
b += BytesRecv;
}
0764デフォルトの名無しさんNGNG
急ごしらえなので、使わない変数や無意味なフラグがあって見辛くてすみません。
0765デフォルトの名無しさんNGNG
>>763
> BytesRecv = recv(soc,bits,1024,0); //←しばらく受信するとここでとまります
> bits[BytesRecv]='\0';

bits→bytesの誤りか?

> string str=bytes;
> if(str=="OWARI")

なぜ"OWARI"がバッファ先頭にあることを仮定しているのだ?
それからな、str=="OWARI"はないだろ? strcmpしろよ。

C言語の修行し直してからまた来なさい。
0766デフォルトの名無しさんNGNG
非常に参考になりました。どうもありがとうございます。
0767デフォルトの名無しさんNGNG
C++のstringだとしたら == でもいいぞ
0768デフォルトの名無しさんNGNG
stringだろ?w
==でいいじゃん
0769デフォルトの名無しさんNGNG
俺も765と同じつっこみをしようと思ったが、すぐうえのstring str=bytes;を見てやめた。
0770753NGNG
環境
・OS Windows2000 SP4 MS VC++6.0インストール済みのところに以下の手順で、ONC/RPC for Windowsを
インストールしました。

1)ttp://netbula.com/oncrpc/ より ONC/RPC for Windows V1.14.3のインストーラをDLし、
 デフォルトでインストール。
2)コマンドプロンプトで以下を実行するとエラーメッセージが表示されます。
 C:\oncrpc\test>..\bin\rpcgen cou.x
 C:\oncrpc\bin\rpcgen.exe: unable to open cpp32: No such file or directory

rpcgen.EXEが CL.EXEを使用するということなので、環境変数PATHにVCのCL.EXEの存在する
ディレクトリを設定しています。
まだなにか設定が必要なのでしょうか?
0771762NGNG
やっとできました。
結局、w h の文字列長を先に1バイトづつ送ってやってから、縦横のサイズをあらわすデータを受け取ることでズレを解消しました。
しかし、TCPは原始的で面白いですね。
0772デフォルトの名無しさんNGNG
「TCP が原始的とは(ry」と言うオヤジが出てくるのに 30 フレーム。
0773デフォルトの名無しさんNGNG
TCP が原始的とは(ry
0774デフォルトの名無しさんNGNG
ライブラリ任せのどこが原始的なのかと
0775デフォルトの名無しさんNGNG
>>770
ONC/RPCとやらは使った事ないからよーわからんが、エラーメッセージ
に出てるcpp32.exeってBorland C++とかじゃないのか?
付属ドキュメントがあるなら隅々までよく読んでみろ。
0776753NGNG
>>775
ありがとう。
付属ドキュメントないから、バイナリエディタで rpcgen.exe見てみたら、
Borland C++用に作られたものでした。
他のwin32用の添付バイナリもBorland C++で作成されてました。
しょうがないので付属ソース変更して VC用に作ります。
0777デフォルトの名無しさんNGNG
sendの戻り値が0ってことある?
0778デフォルトの名無しさんNGNG
>>777
OS によってはある。
0779デフォルトの名無しさんNGNG
>>772
俺なんて糸電話だぜ!
パケロス・パケ化け激しすぎ
0780デフォルトの名無しさんNGNG
バカ野郎、俺の使っている伝書鳩は
最近遠距離通信を自粛するようになっちまって
パケットが届かないんだよ。
0781デフォルトの名無しさんNGNG
ここは「優秀な伝書鳩の育て方」について議論するスレになりますた
0782デフォルトの名無しさんNGNG
質問です。
どうも理解出来ないところで例外が発生してしまいます。

UDPのSOCKETを返すクラスを作成し
NET_SET *netset;
netset->UDP_SET(hWnd);
と言うコードをBOOL InitInstance()の中に書いたんですが・・・

メンバ関数を呼び出す所で例外が発生してしまいます。
0783782NGNG
ちなみに以下がクラスの内容です。

SOCKET NET_SET::UDP_SET(HWND hWnd)
{
SOCKET listen_sock;
SOCKADDR_IN saServer;
int nReturnCode;
WSADATA wsaData;
WORD wVersionRequired = MAKEWORD(2,1);

/******************************************/
/**********WinSock DLLを初期化する************/
/******************************************/
nReturnCode = WSAStartup(wVersionRequired, &wsaData);
if (nReturnCode != 0 )
{
//エラー通知
return listen_sock;
}
//要求したバージョンを利用できるかどうか確認する
if (wsaData.wVersion != wVersionRequired)
{
//要求したバージョンを利用できない事を通知
WSACleanup();
return listen_sock;
}
/******************************************/
/**********WinSock DLLの初期化完了************/
/******************************************/
0784782NGNG
/******************************************/
/*************SOCKETを作成する**************/
/******************************************/
listen_sock = socket(AF_INET, SOCK_DGRAM, 0);
if ( listen_sock == INVALID_SOCKET)
{
//エラー
WSACleanup();
return listen_sock;
}
/******************************************/
/*************SOCKETの作成完了**************/
/******************************************/

0785782NGNG
/******************************************/
/*************非同期処理に指定***************/
/******************************************/
nReturnCode = WSAAsyncSelect(listen_sock, hWnd, SM_EVENT,
FD_CONNECT|FD_CLOSE|FD_READ|FD_WRITE
);
if ( nReturnCode == SOCKET_ERROR)
{
//エラー
closesocket(listen_sock);
WSACleanup();
return listen_sock;
}

saServer.sin_port = htons(IDS_PORT);
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = INADDR_ANY;

if( bind(listen_sock, (LPSOCKADDR)&saServer, sizeof(struct sockaddr)) == SOCKET_ERROR)
{
closesocket(listen_sock);
WSACleanup();
return listen_sock;
}
return listen_sock;

}

以上です。
よろしくお願いします。
0786デフォルトの名無しさんNGNG
質問の仕方すら知らないのかね?
> どうも理解出来ないところで例外が発生してしまいます。
> メンバ関数を呼び出す所で例外が発生してしまいます。
0787デフォルトの名無しさんNGNG
失礼。例外はあのわけわからんメッセージね。

NET_SET *netset; // ←
netset->UDP_SET(hWnd);
0788デフォルトの名無しさんNGNG
例外といっても色んな種類があると思うのだがどうなんですか?>マ板のみなさん
0789デフォルトの名無しさんNGNG
>>788
マ板で聞けよ
0790デフォルトの名無しさんNGNG
>>789
相手にするな&つまらん事でAGEるな
0791デフォルトの名無しさんNGNG
正確に呼び出し部分のコードを書いたほうがいいのでは?

ポインタ宣言だけして、いきなりメンバ関数を呼び出してるように見えてしまう。
0792デフォルトの名無しさんNGNG
>あのわけわからんメッセージ
ってどれやねん。
0793デフォルトの名無しさんNGNG
>>792
>>788
0794デフォルトの名無しさんNGNG
>>792
あのメモリ保護違反の奴(メモリがreadに……)

NET_SET *netset; // ←
netset->UDP_SET(hWnd);
を見てそう思った。
0795デフォルトの名無しさんNGNG
というか、ネットワークプログラミングじゃなくて、初級プログラミングですね。
0796デフォルトの名無しさんNGNG
エントロピーとかハミング符号化とかがまったくわかりません
どなたか情報理論に関するお勧めな本知ってたらおしえてください
すれ違いでごめんなさい
0797デフォルトの名無しさんNGNG
>>796
くだらねぇことでageるな
0798デフォルトの名無しさんNGNG
>>796
ハミング符号化を行うとデータ量を1/3に出来る。
これを商品化に成功したのが花王。
0799デフォルトの名無しさんNGNG
>>798
本について聞いているんですよ。
0800デフォルトの名無しさんNGNG
スレ違いの質問してるくせにずいぶんと偉そうだな。
0801796NGNG
>>799
はちがう人ですよ
0802デフォルトの名無しさんNGNG
>>801
どうでもいいけどスレ違い
0803796NGNG
おしえてよ
0804デフォルトの名無しさんNGNG
テーハミング符号化
自分の都合の良いように真実を書き変える非可逆圧縮方式。
0805デフォルトの名無しさんNGNG
>>796
「アドレス00000000に対する違反が起きました。」か?
0806デフォルトの名無しさんNGNG
1●CLIE ◆GodOnnFcO.が何か書き込んでも放置で。
0807デフォルトの名無しさんNGNG
> 1●CLIE ◆GodOnnFcO.
qb系のサーバのコテハンみたいだけど、まじでウザい。

>>796
スレ違いの話題を延々続けるお前には理解不能かと思われ。
0808デフォルトの名無しさんNGNG
qbではない。ロビーだかラウンジだかそのへんの固定。
いずれにしろ駄コテ。相手にする価値なし。
0809デフォルトの名無しさんNGNG
WSAAcceptを使って、接続時にデータを渡せるのだが、
これを実装できた人いる?
0810デフォルトの名無しさんNGNG
WSAConnectも
0811デフォルトの名無しさんNGNG
質問の仕方がなってないな
0812デフォルトの名無しさんNGNG
初めてネトゲつくりに挑戦するので作り方知らないので教えてちょ。

環境:winsock 2.0 OS:windows2000
メッセージのFD_WRITEについてなんですが下の実装見てください。TCPを使ったネットワークゲームの根幹を作ってます。
スペースのため簡略化してあります。

class client
{
public:
vector<my_message> messages;
SOCKET sock;
void SendData(){};//messagesに溜まっているメッセージを1つづつ送信しては削除する
void AddMessage(my_message msg){messages.push_back(msg);}
};
vector<client> clients:

//switch
FD_WRITE:
for(int i=0;clients〜)clients[i].SendData();//WPARAMと同じソケットを持つプレイヤーオブジェクトをforで探して、データ送信メソッドを呼び出す
//送信するメッセージが無ければ何もしない。
//

こうやったときに、送るべきメッセージが無かった場合そのままsendせずに通過してしまうので、再びFD_WRITEが送られてくることは無いのだ、と私は考えています。
ということは、以後clientオブジェクトに送信すべきメッセージが追加されても、FD_WRITE通知は来ないのでforループでマッチせず、データ送信メソッドを呼び出せなくなります。
この実装方法だとやはり問題があるのでしょうか。
clientクラスにboolで送信可能かどうかを示す変数でも持っておいて、フレームをアップデートするときにその値を見て送信メソッドを呼び出すべきでしょうか?
その場合も何か問題はありますか?
0813karaNGNG
age
0814デフォルトの名無しさんNGNG
>812
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/intermediate.html#asyncreliable
0815デフォルトの名無しさんNGNG
>>814
なるほど。FD_WRITEは単なるメッセージなのですね。
わかりました。どうもありがとうございました。
0816デフォルトの名無しさんNGNG
っていうか、サーバー側でWSAAsyncSelect()使う意味ある?
確か、Window移動させたりすると、FD_ACCEPTとか応答関係全く動かなくなるんだよね?
0817デフォルトの名無しさんNGNG
>>816
非同期モードを使わない場合、各ソケットの送受信のためにスレッドを大量に作らなければならないと聞きました。
現在普及しているようなネットゲームのサーバでは同期モードを使うのが一般的なのでしょうか。
0818デフォルトの名無しさんNGNG
> 非同期モードを使わない場合、各ソケットの送受信のためにスレッドを大量に作らなければならないと聞きました。
どこで聞いたんだよそんなデタラメ
0819817NGNG
この板です。

>>25 
>>32
>>33
>>34
>>37

私の読解力不足かもしれません。
でも今考えてみたら、1万もコネクションは無いんです。24〜300ぐらいを想定してます。
しかし、同期モードでやる場合、各ソケットごとにスレッドを作らないとsend recvで固まってしまいます。
300ぐらいならスレッド作っても大丈夫なんでしょうか。
0820817NGNG
もしかして、ioctlsocketですか?
ブロッキングと非ブロッキング、同期と非同期は区別しろとよく見かけましたが、これがまさにそうだったんですね。
0821デフォルトの名無しさんNGNG
いや、、何もWSAAsyncSelectでイベント駆動型にしなくても良いじゃん
>>816の言うようにイベント駆動型だと、Window弄ってたりするとその間まったくnetwork関係のイベント発生させれないんだし
鯖の場合不向きのような・・・
0822デフォルトの名無しさんNGNG
Windowの再描画などのイベントより
ネットワーク関係のイベントの方がずっと優先度が高いので
ネットワークイベントのメッセージがたくさん来ると
ボタンも押せないしWindowの移動も出来なくなるのだが。

だからサーバー動作向きというわけではないが。
0823デフォルトの名無しさんNGNG
>>822
ADSL以上の回線のかちゅがまさにその状態ですね
0824デフォルトの名無しさんNGNG
>WSAAcceptを使って、接続時にデータを渡せるのだが、
>これを実装できた人いる?

できた人いたらサンプルソースキボヌ。
プロシージャ関数に、WSAconnectで指定されたデータを受け取れると思うのだが、
受け取れないので。
0825デフォルトの名無しさんNGNG
>>819
IOCPつかっちゃだめかな?
Win9x系だと動作するか妖しいけど…

沢山アクセプトしても自分で立てて設定した数のワーカースレッドで
全ての送受信の管理できるから便利だよ。
でもゲームで使って使いやすいかどうかはしらないけどねー。
0826デフォルトの名無しさんNGNG
UIスレッドと通信スレッドは分けろよ...
0827デフォルトの名無しさんNGNG
>>819
select()使えよselect() !
0828デフォルトの名無しさんNGNG
>>825
IOCPのサンプルコードのあるサイトないですか?
0829デフォルトの名無しさんNGNG
>>828
>825ではないが、
GetQueuedCompletionStatus, CreateIoCompletionPort
こいつら検索かければそれっぽいページがひっかかると思う。
俺は日本で見つからなかったから海外サイトからサンプルひろったよ。

まぁ、ゲームに適しているかは知らないけど、
Win2Kで沢山のソケットの送受信を管理したいなら、
スレッド300個起動よりはIOCPの方がスマートだとは思う。
0830デフォルトの名無しさんNGNG
FileXC
http://www.filexc.com/indexj.html
や
Skype
http://www.skype.com/skype.ja.html
では、
「UPnP対応・未対応に関わらずどんなNAT/ファイアウォールがあっても接続できる」
「すべてのファイアウォール、NAT、およびルータに対応 ? コンフィギュレーションは一切不要!」
となっているのですが、このような技術はどのようにして実現されるのでしょうか?
ルータの設定等を行わなくても手軽にP2P通信できる技術に興味があるので知りたいです。
0831デフォルトの名無しさんNGNG
>>830
IDirectPlay8NATResolverと同じ考え方なんじゃない?
どっか外部サーバーにアドレスを登録させて、その情報を使ってUDPで通信って感じでさ

NAT or FW背後のクライアントだけで、相互接続させるのはさすがに無理だと思うよ。
0832デフォルトの名無しさんNGNG
>>830
さすがに、最初に接続をコーディネイトするサーバは必要。
コーディネイト後は、両者にUDPに暗黙の穴を空けて、直接P2P通信。
0833デフォルトの名無しさんNGNG
>>831-832
レスありがとうございます
アドレスを管理するサーバが必要なのは納得できるのですが、
UDPで暗黙の穴をあけるというのは、どのような手法でしょうか?
ルータの外からはUDPもたいてい遮断されると思うのですが、
特別な方法があるのでしょうか?
0834デフォルトの名無しさんNGNG
>>833
UDP hole punching
0835デフォルトの名無しさんNGNG
>>834
833じゃないけど
その技術前々からやりたいな と思ってたんですが・・・・
良い資料ないですかね?
少しWinsockのUDPでの通信プログラムを実装出来る程度の技術では無理でしょうか?
もっと低レベルの部分弄らないといけないのかな・・・
0836デフォルトの名無しさんNGNG
簡単に説明すると

ポート0同士の場合
AとBと鯖のSがあったとする。

Aがポート51(仮想上のポート)からSのポート50へ送信
BがAのポート51へ送信すると、Aのポート50に何故か送信できるってわけ。

実装は簡単でしょ?
0837830NGNG
>>834
UDP Hole Punching に関して調べてみたところ、
http://www.nanog.org/mtg-0402/pdf/francis.pdf
↑こんな資料を見つけたのですが、

〜資料内の語句を使います〜
Bob が ApplicationServer(AS) にパケットを送ったときのポートと、
Bob が Steve にパケットを送ったときのポートが同じでないと届かないような気がするのですが、
合っていますか?
0838830NGNG
おっと、リロードするの忘れてました。
>>836
Aのポート50というのが何のことかと、仮想上のポート51というのがよく分からないです。
よろしければ、詳しい解説お願いします。
0839830NGNG
連カキ失礼します。

>>836 さんの例と似ていたものを見つけました↓
http://www.ht.sfc.keio.ac.jp/~suno/term/2003s/sunet.ppt
この方法だと、ConeNAT 以外の状況では無理だと思うのですが、
解決する方法はあるんでしょうか?
0840828NGNG
>>829
ありがとうございます。

>スレッド300個起動よりはIOCPの方がスマートだとは思う。

select() で 500ソケット管理するアプリを作った漏れはアフォですか?
0841デフォルトの名無しさんNGNG
>select() で 500ソケット
これってパケット来なくてもCPU100%使っちゃわない?
待ち時間長めにとるとレスポンス悪くなるし。
0842デフォルトの名無しさんNGNG
まあ求める物が違うんならどの書き方でも良いんでない?
スレッド300個は300が同時に処理できる代わりに、ススループットも分割されるでしょ。
IOCPはスループットを確保できる代わりに処理が始まるまでの遅延がおこる場合も考えられるし。

まあ通信相手から見たら同じことかもしれんな。
0843デフォルトの名無しさんNGNG
ススルー(・∇・)プット
0844デフォルトの名無しさんNGNG
>>841
待機中にCPUを食ってるってことは無いですが。

>>842
スレッド300個が同時に動くとメモリとCPUの取り合いが起きて
スループットが予測出来ませんよね。
0845デフォルトの名無しさんNGNG
15スレッドに20接続ずつやらせりゃいいんだよ。
何で同じ議論が何回もループすんだか・・・┐(´д`)┌

スレッドはスタックとコンテキストスイッチのオーバーヘッドを生む。
select()系だけだと検査に無駄なオーバーヘッドを生む。
0846デフォルトの名無しさんNGNG
サーバープログラミング?
0847デフォルトの名無しさんNGNG
>>839
最後の感想にワロタ
0848デフォルトの名無しさんNGNG
>>845
非同期API使っとけ
0849デフォルトの名無しさんNGNG
I/Oコンプリーションポート マンセー!
0850デフォルトの名無しさんNGNG
>>845
select()ってそんなにオーバヘッドあるの?
0851デフォルトの名無しさんNGNG
>>845
> select()系だけだと検査に無駄なオーバーヘッドを生む。

selectだと検査に無駄なオーバーヘッドを生む。
poll,kqueueだと検査のオーバーヘッドは少ないが、マルチスレッドと違い並行性が稼げない。
0852デフォルトの名無しさんNGNG
pollはselectと同系統だろ。
本質的な性能の悪さは解決されない。
0853デフォルトの名無しさんNGNG
>>851でちゃんと説明したのに、
>>852でまた単純化逆戻りするのは何故なのだ?

>>3
> C10K ヘヴィーロードサーバ
> http://www.kegel.com/c10k.html

読んだことない人?
0854あふぉNGNG
>>853
英語だから読めん。
0855デフォルトの名無しさんNGNG
>>851

kqueueをpollと一緒くたにされたら、BSD方面の方々が怒るんじゃないの?
epollや/dev/pollと一緒にするならともかく。

kqueue, /dev/poll, epoll に比べたら、pollもselectも50歩100歩だと思う。
0856845NGNG
上の方でスレッドだ、select()だ言ってるの見て書いただけなんで、
細かいとこは突っ込まないでくれ・・・Σ(´�D`lll)

1スレッドでpollingでやってたらリクエスト処理(ディスクI/Oとか)の間は
他の接続の相手できないから、結局はどっかで並行性の問題が生じる。
(OSが適当にスレッドプールして割り当ててくれるんなら話は別)

かといって、大量のリクエストを処理するのに全てスレッドで実装していては
ネットワーク以外のオーバーヘッドが大きすぎるし、最大数が狭められる。

ようするに、単独の手法でやるより、複数組み合わせた方が
スケーラビリティ的にはいいだろう、ってこと。

その分実装は複雑になるから、費用対効果ってとこでしょう。
0857デフォルトの名無しさんNGNG
>>856
それが前提の上で、
select系と一色端にするほど性能が同じじゃないって言ってじゃないの?
http://monkey.org/~provos/libevent/libevent-benchmark.jpg
0858デフォルトの名無しさんNGNG
鯖なんだから、非ブロックで無限ループまわしときゃいい気がするけど…。
あ、想定してるのはMMORPGの鯖ね。
ゲームフレーム単位で動作させるから、非同期とかせずこれでいいかなと。
0859デフォルトの名無しさんNGNG
質問です。
Winsockで
recv()の戻り値って
0またはSOCKET_ERROR(-1)ですよね?
正常受信判定で
if(recv(sock, buf,10000, 0)>0){
こんなコード書いてるサンプルをみたんですが・・・
これだと、判定に使えないような。。。
0860デフォルトの名無しさんNGNG
>>859
マニュアルを見直そう(^o^)
0861デフォルトの名無しさんNGNG
>>859
正常に受信してるなら受け取ったバイト数が返ってくる。

MSDNLibraryにも
----------
 If no error occurs, recv returns the number of bytes received.
 If the connection has been gracefully closed, the return value is zero.
 Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
----------
と書いてあるが?
0862デフォルトの名無しさんNGNG
>>859
受信したバイト数をどうやって知るんだ(笑)
0863862NGNG
ありゃ、遅かった
0864859NGNG
>>860
え〜と、、
『Winsock2.0プログラミング』
の
クイックリファレンスには、戻り値がそう書いてたんですが・・・
調べてみます。
0865859NGNG
どうもです。
なるほど、、そういう事だったんですか!
どうもありがとうございました!!
0866デフォルトの名無しさんNGNG
>>865
『Winsock2.0プログラミング』には
「recv()の戻り値は0またはSOCKET_ERROR(-1)」
って書いてあるの?
0867デフォルトの名無しさんNGNG
>>862
まあ、UDPかつblockingだとパケットは丸ごと読めて、
なおかつ中身見れば終端が分かる時は必要ないから、
あの断片だけでは問題があるかどうか分からなくはないかな?
0868859NGNG
>>866
はい、そう書いてました。
0869デフォルトの名無しさんNGNG
リファレンスはここ見とけ
http://www.linux.or.jp/JM/#search
0870デフォルトの名無しさんNGNG
>>868
ほんとに?「エラーの戻り値は」とかじゃないの?
>>657でお勧めに挙げられてるけど、嘘っぱちか?
0871デフォルトの名無しさんNGNG
俺の持ってるやつは2003年7月11日 第11刷発行だけど

戻り値
0またはSOCKET_ERROR。

って書かれてるね。
0872デフォルトの名無しさんNGNG
うへー、recvは切断かエラーを判定するためだけの関数なのか(笑)
0873デフォルトの名無しさんNGNG
>>871
ありがとう。

>>868
疑ってすまんかった。
0874デフォルトの名無しさんNGNG
>>871
誰も訂正しないのかな(笑)
0875デフォルトの名無しさんNGNG
>>856
>(OSが適当にスレッドプールして割り当ててくれるんなら話は別)
これをやってくれるのがIOCPだと解釈してるんだけど違うのかな…
スレッドプールでスレッド10個立てて、動いていいのは5個までと設定しておけば、
送受信の結果を受け取ると動いているスレッドが5個になるよう調節してくれる。

5個全部埋ってる所に新しい完了の通知がきたら、
既に仕事をしているスレッドがまた通知待ち状態に戻るか、
ブロッキング関数で停止してる状態になったスレッドが発生すると、
その時動いているスレッドの数が5個になるようプールから1つスレッドが動き始める。
一時的に動いているスレッドが6個以上になる事もあるけど、
通知待ちの所でまた5個になるよう調節される。

15スレッドで1スレッド毎に20個のソケットを処理させるって感じではないが、
スレッドプールの数を30辺り、アクティブスレッド数15で設定して、
300個のソケット管理をIOCPに放り込めば同じ事ではないのかなと思うんだけど…。

ちなみにMS御推奨のIOCP使用時のプールとアクティブスレの数は、
プール=プロセッサの数x2 アクティブ=プロセッサの数だったかな…。
アクティブの方をプロセッサの数以上にするとスレッドコンテキストの切り替えで
無駄な時間を取られるのでお勧めしないとか書いてあったと思いました。
でも、動けばいいじゃん、そん位さ、とか思ったり。
0876デフォルトの名無しさんNGNG
>>838
俺は>836ではないが…
ClientA,BとそいつらがA',B'っていうルーターを使ってたとして、
AやBがSとのパケのやり取りでA',B'に開けた動的NATの情報を鯖経由で交換して、
お互いその穴へ向けてパケット送ればNATの壁を越えてUDPの送受信が可能という事では?

動的NATって送信先が変わったら設定変わらないの?とかいう質問はカンベンな。
貼ってあるURLの資料みてこういう意味かって思っただけでNATがどうとかは詳しくないからさ。
0877デフォルトの名無しさんNGNG
しっかし、、
その仕様って有る意味怖いよな。
セキュホになるじゃん。。。
0878830NGNG
>>876
いろいろ勘違いしてたこともありましたが、試してみたところ、
いくつかの環境では送信先変わってもルータのポートは変わらず、
UDPの送受信が可能でした。
他の環境ではどうなるかわかりませんが、
さらにいろいろ調べてみようと思います。
0879デフォルトの名無しさんNGNG
これって、プライベートIPアドレスな人でもOKなのかな?
ISPのNATがそんな簡単に貫通するとは思えないけど・・・
0880デフォルトの名無しさんNGNG
>>875
>プール=プロセッサの数x2 アクティブ=プロセッサの数

1CPUだとアクティブスレッドが1?
シングルスレッド鯖と何処が違うの?
0881デフォルトの名無しさんNGNG
>>880
おいおい
0882デフォルトの名無しさんNGNG
1つのCPUで2つのスレッドを同時にアクティブにする……!?
0883デフォルトの名無しさんNGNG
H.Tなら出来るんじゃない?
0884デフォルトの名無しさんNGNG
そもそもMSは市販PCで作るサーバなんて相手にしてないだろ
つまりちゃんとした自社製品を買(ry
0885デフォルトの名無しさんNGNG
>>882
スレッドプールから起動されるスレッド数の上限と、
>>875の文章ならそう解釈するるのが妥当だろな。
アクティブスレッドの数がプロセッサ数を越えるとコンテキストの書き換えが…
って書いてあるし。

つかMSのサイトに書いてあるっていうから見に行けばいいんだろうが、
>>875も気を利かせてURL位張ってくれればいいものを…
暇だから自分で探してみますかね。
0886デフォルトの名無しさんNGNG
OS:windows2000
言語:MSVC++6.0
 LANで結ばれている別のマシンに登録されているサービスの起動/停止を
行うためのAPIはありますか? また、APIがない場合何らかのコマンドで
実行することは可能ですか?
 


0887デフォルトの名無しさんNGNG
ローカルマシンなら起動/停止するやり方をしてっているのかと・・・
0888デフォルトの名無しさんNGNG
>>886
Windows版に行け。
0889デフォルトの名無しさんNGNG
前に>>812でネットげーについて聞いた者です。
あれから、サーバとクライアントの間でアカウントとパスワードで認証して、サーバがプレイヤの位置情報を送信し、受け取った位置をクライアントの3D空間の視点とするシステムを作りました。
クライアントはキーUpDown情報をサーバに送信し、サーバは受け取ったキー情報からプレイヤの位置を計算します。
サーバは1フレーム計算するごとに全プレイヤの位置を全クライアントに送信します。
すると、1秒間に2回ぐらいしか位置情報が届かず画面がカクカクになってしまいました。
どのように改善すればよいのでしょう。

要約は次のようになります。
0890デフォルトの名無しさんNGNG

Server::NextFrame()
{
//位置情報メッセージを生成して渡す
for(i){
for(j){
Message msg;
msg.vec = client[j] -> GetPos();
msg.type = MSG_POSITION;
client[i]->AddMessage(msg);
}
}
//各クライアントオブジェクトに溜まっているメッセージをすべて送信
for() client[i]->SendData();
//メッセージが来ていたらすべて受信
for() client[i]->RecvData();
ProcessMessage();//受け取ったメッセージの解析 ここでKEY情報を解釈してプレイヤーの位置を変更
}
0891デフォルトの名無しさんNGNG
Client::NextFrame(){
if(GetKeyState(VK_UP)<0){
Message msg;
msg.type = MSG_KEY;
msg.data = VK_UP;
this->AddMessage(msg);
}
Send();//たまっているメッセージを送信
Recv();//到着するメッセージを受信

ProcessMessage();//メッセージを解釈。ここでサーバから来る位置情報を解析して、自分の位置を設定。

BeginDraw();
EndDraw();
Show();
}
0892デフォルトの名無しさんNGNG
sageるな
0893デフォルトの名無しさんNGNG
>>889
>サーバとクライアントの間でアカウントとパスワードで認証して
まさかアカウントとパスワードそのまま送ってないだろうな。

>1秒間に2回ぐらいしか位置情報が届かず画面がカクカクになってしまいました。
さすがにそれは遅すぎ。コード見てないからわからないけどもう少し改善できるだろ。
でも改善は出来るけど遅延の完全な解決は不可能。位置情報以外にも移動する方向を送って
次の位置情報が届くまでは直前の方向に動き続けてつじつまを合わせるようなごまかしを実装すればいい。
0894デフォルトの名無しさんNGNG
>>889
つーかそれじゃ判らなさすぎ。
本当に通信部分が問題でここに来たんだろうね?
描画周りを全てOFFにしても速度は変わらないとか、サーバと実行機は別なのかとか情報が必要かと。

812の内容ってことはFD_WRITEとか使ってんの?
それならメッセージ周りの基礎処理はちゃんと出来てる?とか。
0895デフォルトの名無しさんNGNG
>>889
・通信部分は結局どういう形で実装したか
・通信部分がカクカクの原因だと思った理由
まずはこれを書いてみよ
原因考えたら通信部分に問題ないなら他スレへGO

後接続クライアント数もあった方がいいかも
例にクライアント1つ繋げてそうなったとかだと笑うに笑えない
0896デフォルトの名無しさんNGNG
>・通信部分がカクカクの原因だと思った理由
毎フレーム座標データ交換できないんだからカクカク二なるのは当然。
0897デフォルトの名無しさん NGNG
no_delayに
0898812NGNG
解決しました。
どういうことかといいますと、サーバ側でfloatで送っていたデータをクライアント側でintにして座標に代入していました。
これによって小数点以下が切り捨てられて、間のフレームが落ちたように見えたのです。
クライアントを修正すると、ばっちりスムーズに300フレームで動いています。

相談に乗ってくださった方々、どうもありがとうございました。
これに懲りずに、また詰まった時はお願いします。
0899デフォルトの名無しさんNGNG
('A`)
0900デフォルトの名無しさんNGNG
「猫でも分かるネットワークプログラミング」を読み終えたので
次はTCPで「一対多」のゲームでも作ってみたいと考えています。
しかしプログラミング自体かなり素人なため
どうしてよいものかさっぱり分らず、アマゾンで色々物色していた所、
「雪田修一 著 UNIX ネットワークプログラミング入門」
という本を発見しました。
これってVC++とかWinSockとかを使いたい、
しかもド素人の私のようなものが買って大丈夫でしょうか。
持っている人がいたら内容とかどんな感じか教えて欲しいです。

「TCP/IPによるネットワーク構築III WinsockVer」も買ってみたものの、
難しくてよく分からなかった、、、というレベルです。
0901デフォルトの名無しさんNGNG
>>900

>>657
0902デフォルトの名無しさんNGNG
recvfrom()の5つ目の引数に送信元のSOCCKADDRが入るんですが
送信元のポートとアドレスを知りたいのです
5つめの引数をどうすれば得られるんでしょうか?
0903デフォルトの名無しさんNGNG
>>902
こんな感じで使ってる

struct sockaddr_in fromAddr;
recvfrom(・・・(struct sockaddr *)&fromAddr,&fromAddrLen);

printf("recvfrom %s:%d",inet_ntoa(fromAddr.sin_addr),ntohs(fromAddr.sin_port));
0904デフォルトの名無しさんNGNG
>>903
THX!です。
なるほど、sockaddr_inを使うんですか
どうもありがとうございました。
0905デフォルトの名無しさんNGNG
>>900
全然大丈夫じゃないよ。
それはUNIXの本であって、Winsockは扱ってないよ。
内容自体は良いので、きちんとWinsockの関数に読み替えられる
スキルがあれば問題ないけどね。
0906デフォルトの名無しさんNGNG
>>886
できます。
>>887 のいうようにローカルの操作するのと同じ。
ただし権限のあるユーザーの場合だけ。
0907デフォルトの名無しさんNGNG
Winsock2でUDP使うときってだいたい60KBくらいまで
送れると考えてしまっていいですか?
getsockoptしないで
0908デフォルトの名無しさんNGNG
駄目です。
0909デフォルトの名無しさんNGNG
別にいいよ。漏れは困らないから。
0910デフォルトの名無しさんNGNG
8KBならどうですか?
0911デフォルトの名無しさんNGNG
すべてのヘッダ込みで1.5KBまで
0912デフォルトの名無しさんNGNG
むとぅ
0913デフォルトの名無しさんNGNG
Windows 2000でgetsockoptしたら64KB弱が返ってきたんですけど
この値は意味ないんですか?
0914デフォルトの名無しさんNGNG
64kというのはおそらく送信バッファのサイズと思われ、
1.5kというのは分割されずに遅れる最大サイズということで
0915デフォルトの名無しさんNGNG
>>911
1.5Kってイーサパケットのサイズじゃなかったっけ?
何かで570前後のサイズがIP向けだったと記憶してたが自信ないな・・・
0916デフォルトの名無しさんNGNG
570って最小じゃないか〜?

イーサネットのフレーム長(最大)が1500バイト。
イーサネットフレームの内ヘッダ14バイト、IPヘッダ20バイト。
UDPヘッダは8バイトだっけか。
残りがデータの最大値。

接続形態によっては、たとえばPPP/PPPoEヘッダ等で、もうちょっと減るけどな。
0917デフォルトの名無しさんNGNG
低水準な話はわかんね
0918デフォルトの名無しさんNGNG
SendTo()で60KBくらいのデータは一度に送れるけど、
IPレベルでは500バイトや1500バイトに分割されて送られる、
って感じですか。
0919デフォルトの名無しさんNGNG
そうです
0920デフォルトの名無しさんNGNG
>>916
ttp://www.atmarkit.co.jp/fnetwork/rensai/eth03/ether3_3.gif
etherは
64〜1518です。
1500というのはデータ部の最大です。
この値はプリアンブルは含みません。
0921デフォルトの名無しさんNGNG
単一のスレッドで複数のクライアントと送受信するサーバにおいて
select(...);
for(int i = 0 ; i < clientnum ; i++)
{
 if(FD_ISSET(clientsock[i], &fdread))
 {
 }
 if(FD_ISSET(clientsock[i], &fdwrite)
 {
 }
}
のようなサンプルを見ました。
selectベースだと送信するときもselectで書き込めるかどうかをチェックしないといけないのですか?
上記ソースのようにしないで別のスレッドとかでsendしたらいけないのでしょうか?
0922デフォルトの名無しさんNGNG
送信バッファが埋まってるとsendでブロックされてしまうから事前にチェックすると言うのが元々の趣旨。
別のスレッドにしてブロックされてもかまわないならOK。
0923デフォルトの名無しさんNGNG
なるほど〜。そういうわけでしたか。
ありがとうございます。
0924デフォルトの名無しさんNGNG
>>920
そうか、プリアンブルもフレームのウチだったけか。

最小つーたのはイーサネットフレームではなくてIPの最小保証MTUのつもり。
今確かめたら576バイトのようだ。
0925その1NGNG
クライアントから送られてきた文字列(CRLFで区切り)を受け取って
それを全クライアントに送信するプログラム(要するにチャットです)を
作っているのですが、大まかな感じは以下のとおりです。
言語はC#ですが、多少簡略化して書きます。
プログラムはコンソールアプリケーションです。

メインスレッド
while (true) {
 s = Console.ReadLine();
if (s == "quit")
  break;
 else {
  quit以外は読み捨て
 }
}

ネットワークスレッド

while (flag) {
 ブロックせずにクライアントの接続をaccept

 for (クライアントの数) {
  select
  s = recv
  メッセージ処理(s);//この中で、sの解釈および各クライアントへのsendを行う。
 }
}

0926その2NGNG
このような感じのプログラムで、5、6人でチャット中に、突然
while(flag)内で固まってしまいました。そうなると、クライアントから
何を送っても反応がありません。

ところが不思議なことに、その状態で適当に何かを入力すると、
(つまりメインスレッド内のReadLine()内で処理が行われる?)
突然溜まっていたメッセージが怒涛の勢いで処理されて、再び
ネットワークスレッドが動き出します。
メインスレッドのReadLine()は、改行を打つまで戻ってこないメソッドですが、
単に1文字を打っただけでも、怒涛の勢いで動き出すので不思議です。
同じような現象に遭われた方、いらっしゃいますか?

要するに、一応各クライアントからのデータはサーバーに届いて
いるが処理されないままであり、何か文字を打ってReadLine()を
働かせた瞬間に、ネットワークのスレッドの固まりが解けて、届いていた
メッセージを怒涛の勢いで処理した感じなのです。
0927デフォルトの名無しさんNGNG
> for (クライアントの数) {
>  select

selectの使い方を知らない?
0928その2NGNG
>>927
さっきそのことに気が付きました。selectは一気に判定したい
ソケットを放り込んむものですから、クライアント分回すのは
おかしい(というより非効率的)ですね。
0929その2NGNG
修正してからしばらく様子を見てみます。
0930デフォルトの名無しさんNGNG
激しくスレ違いかもしれませんが・・・
Winsock でサーバアプリを作った場合、Win2k Pro でも10クライアントまでなら
ライセンス的に問題ないですよね?
0931デフォルトの名無しさんNGNG
HSPなんだが
hspsock.dllを使って
sockputでPOST送信したいのだが、CGIが標準入力としてうけとる情報は
どこに書き込めばいいんですか?
0932デフォルトの名無しさんNGNG
>>931
「〜だ」と「〜です」のどちらかに統一してくれ。
0933デフォルトの名無しさんNGNG
まず日本語の使い方や礼儀というものを習って来た方がいいんじゃないでしょうか。
0934デフォルトの名無しさんNGNG
hspsock.dllを使いてsockputでPOST送信しなむ。
CGIが標準入力としてうけとる情報は
いづくにか書き込めばよからむ。
0935デフォルトの名無しさんNGNG
>>930
そのライセンスってドメインやワークグループのサービスに関してだろ。
自前アプリに対しては治外法権だと思うが。
0936デフォルトの名無しさんNGNG
>>930
正直、気にした事がない。
プログラムというか、Windowsの利用規約とかに
詳しいスレに行って聞いた方がよさげな気もする。
0937デフォルトの名無しさんNGNG
>>935
Win2k 鯖の場合は、Windows 認証を利用しないアプリは治外法権なのですが。。
Apacheに対するMSKKの見解でこういうのがあります。
http://www.apache.jp/misc/windows.html

(1)Apacheは「インターネットの情報サービス」であるため、 EULAにおける
 「インターネット情報サービス」に関する規定が適用される

(2)ApacheはEULAの「サーバーソフトウェア」に該当するため、
 『サーバーソフトウェアとしては使用できない』旨の記述がある
 OS(Windows 2000 Professional等)では使用できない

(3)EULAに『サーバーソフトウェアとしては使用できない』旨の記述のない
 OS(Windows XP Professional等)でのApacheの使用は問題ないが、
 「最大接続数」の制限によって端末10台以内からの利用に限られる。

(4)「インターネットの情報サービス」、「ファイルとプリンタの共有サービス」、
 「リモートアクセス」サービスのいずれかの機能を利用するソフトウェア の
 使用には同様の制限が適用される。

(1)(3)(4)項は良いとして、(2)項は Win2k pro の EULA の何処にも書いて無いんですけどね。
0938デフォルトの名無しさんNGNG
>>936
それらしいスレが見つからないのです。
GPLのはあるけど。
0939デフォルトの名無しさんNGNG
Linux使え!
0940デフォルトの名無しさんNGNG
>>930
ここで少しだけど議論の対象になってる
http://pc2.2ch.net/test/read.cgi/gamedev/1072515100/
0941デフォルトの名無しさんNGNG
IISをインターネット情報サービスと訳すからおかしくなるんだ。IISのままにしとけ
0942925,926NGNG
取り合えず暫定的に、selectをやめて単数socketのチェックであるPollを
使ってみたんですが、状況は変わりません。
メインスレッドでReadLine()を刺激してやる(何かしら文字を入れる)と
突然動き出すのが意味不明ですが、気長に見てますのでもしご存知の
方がいらっしゃれば教えて下さい。
0943デフォルトの名無しさんNGNG
>>942
ソース全部晒せ。それが早いぞ。
0944デフォルトの名無しさんNGNG
>>942
根本的にselect()の使い方を間違ってるような気がしますが。
Winsockのサンプルですが参考にしてみてください。
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/examples/basics/select-server.cpp
0945930NGNG
Windowsのユーザ認証機構を使わない独自のサーバだと
接続制限を受けないと解釈するのが正しいようですね。

外 資 系 企 業 の 日 本 法 人 は 何 処 も ア フ ォ ば か り

これも正しい。w
0946925,926NGNG
>>943
>>944
selectをソケットごとにやるというのは明らかに本来の使い方ではないけども
それをやったとしても、非効率的だがそれがおかしい動作の原因にはならない
というのは甘いでしょうか。ただ、本来の使い方からはおかしい以上、もちろんそういう
やり方はやめるつもりです。

いずれにしても頂いたサンプルソースを見させていただいて、問題点を
もう少し切り分けてみて頑張ってみたいと思います。ありがとうございます。
0947デフォルトの名無しさんNGNG
>>946
どこで固まってるかは調べたの?
select(), recv() ?
0948デフォルトの名無しさんNGNG
>>946
select() をソケットごとにやるのと recv() でブロックするのは同じでは?
つまり、select() するのは意味なーいじゃん。
0949930NGNG
と、いうことで Win2k Pro + オレオレ鯖 + MSDE で接続無制限、と。。
0950デフォルトの名無しさんNGNG
>925
チャットプログラムなんだよな。

ネットワークスレッドでのメッセージ処理のConsole.Print(だったけか)
あたりがメインスレッドのReadLineとケンカしてるんでねーの。
0951925,926NGNG
>>947-948
>>925からネットワーク担当のスレッドだけ持ってきたんですが、

while (flag) {
 ブロックせずにクライアントの接続をaccept

 for (クライアントの数) {
  select(そのクライアント) ←今は取り合えずPollに変えました。
  s = recv(そのクライアント)
  メッセージ処理(s);//この中で、受け取ったメッセージを解釈し、全クライアントへメッセージをsendしています。
  Console.WriteLine(処理したメッセージ)
 }
Sleep(1);
}

このスレッド(whileループ内)のどこかで固まっていることは分かります。それでよく調べてみると、
メッセージ処理関数の中で処理されたメッセージは各クライアントにsendされているようです。
(「全ての」クライアントに正常にsendされたかはこれからの調査になるのですが…)。しかし
処理したメッセージを表示するはずの、次行のWriteLine()が動いていないので、もしかしたら
どれかのクライアントへのsendで停止している可能性があります。
でも、不思議なのはsendで停まっているのは理解できるのですが、何故その場合に、適当な
キーをポチッと押して、>>925のメインスレッドないのGetLine()を刺激すると、停止しているのが
何ごともなかったかのように動き出すのか、という部分なのです。
0952デフォルトの名無しさんNGNG
なんか間違えて標準入力の番号でselectしちゃってるとか
0953925,926NGNG
>>950
ありがとうございます。私もその線は怪しいと思っています。
ReadLine()で待ちながら別スレッドで、様々なタイミングでWriteLine()が
何回も呼ばれるので、ちょっと不安があります。
ネットワークとは全く関係ないバグかもしれませんので、このスレで相談するのも
ちょっと気が引けたんですが・・・。ただ、メインスレッドでReadLine()を待ちながら、
ネットワーク担当スレッドで適宜、WriteLine()はしていますが、クライアントごとに
スレッドを作っているわけではないので、WriteLine()に関しては、同時に呼び出される
ことはなく、WriteLine()同士が被ることはありません。
0954925,926NGNG
>>952
C#(Winsock 2.0のラッパーでしょうか)で作成しているので、
標準入力のselectはできないんです。
こういうバグが一番難しいですね。なんせ数時間に1回ぐらいしか
起こらないので…。
レスをいっぱい使用してしまいすんません。
0955デフォルトの名無しさんNGNG
どこで止まってるかをまず完全に見極めないと。
よく分からんけどWriteLine()は動いてるけどフラッシュされてないので
動いてないように見えてる、って可能性もあるし。
0956925,926NGNG
ネットワークスレッドの実行関数Runに、staticキーワードが付いていないことに気付きました。
とても嫌な予感がしてきました……。
0957925,926NGNG
関係無かったようです。
0958デフォルトの名無しさんNGNG
日記スレじゃないんだけど。
0959デフォルトの名無しさんNGNG
UDP socket の recvfrom() で、dest-addrがわからないのは、
意図的な理由があるのでしょうか?
0960デフォルトの名無しさんNGNG
>>959
単に(4BSDの頃の)最初の設計がそうだっただけ。

確かにdstのsockaddrも欲しい時もあるが、dst別に分けたいなら
bindする時にアドレス別にbindしてsocketを必要なだけ作るのがセオリーだな。
0961デフォルトの名無しさんNGNG
>>959
宛先は自分だから知ってるはずだろ。
忘れたらgetsockname(2)でも使えや。

>>959
?
0962((≡゜♀゜≡))NGNG
>>961
自分に割り当てられているアドレスは一つとは限らないからでは。
960が言っているのはINADDR_ANYを使わないで・・・ということだと思う。
0963デフォルトの名無しさんNGNG
>>959
IP_RECVDSTADDR オプションを使えば、dest-addr が分かるよ。

IP_RECVDSTADDR オプションが有効になっている場合、
recvfrom(2) の完了時に帰されるアドレス構造体が、src-addr
ではなく、dest-addr になる。

>>960
どんなセオリーだよ、それ。dest-addr が欲しけりゃ
IP_RECVDSTADDR 使うだろ、ふつー。
0964839のpptの中の人NGNG
さらされ記念ぱぴこ。
0965デフォルトの名無しさんNGNG
>>963
両方ほしい場合はどうするの?
0966デフォルトの名無しさんNGNG
俺は>>960ではないが、
IP_RECVDSTADDR なんてオプションしらなくて、
IP別に受信するならIP毎にソケット作ればいいやん?
と思いついちゃった俺は、無知な上にふつーじゃないんだな… orz
0967デフォルトの名無しさんNGNG
まあ963はネタなわけだが。
0968デフォルトの名無しさんNGNG
IP_RECVDSTADDR ってIPv4でも使えるの?
0969デフォルトの名無しさんNGNG
>>968
使える。
0970デフォルトの名無しさんNGNG
>>962
わーい、ドラえもんだー
0971デフォルトの名無しさんNGNG
メッセージキューを使用して
プロセス間通信のプログラミングを行いたいのですが
別サーバ間でのプロセス間通信は可能なのでしょうか?

このスレで良いのかどうかわかりませんが・・・
スレ違いの場合は誘導していただけると有難いです。
0972デフォルトの名無しさんNGNG
>>971
SVR IPC に多くを求めてはいけません。
おとなしく、socket などを使いましょう。
0973デフォルトの名無しさんNGNG
質問です。
udpで構造体を送りたいのですが
可能でしょうか?
そのまま構造体をまるまる送りたいんですが・・・・
0974デフォルトの名無しさんNGNG
>>973
可能と言えば可能
ただし、環境依存
同じコンパイラで同じ環境で受信しない限り、正しく受信できる保障は無い。

パックすればその問題は解決可能
VC++だと/Zpオプションとか・・・
あと、バイト順序を整える事

0975デフォルトの名無しさんNGNG
次スレ立てれ
0976デフォルトの名無しさんNGNG
自分で立てようとは思わない>>975
0977デフォルトの名無しさんNGNG
代わりにちんこが立った>>977
0978デフォルトの名無しさんNGNG
>>977 ボッキあげ (プ
0979デフォルトの名無しさんNGNG
FreeBSDでg++でコードを書いてるんですが

NET_SET.cpp:36: passing `int *' as argument 6 of `recvfr
int, int, sockaddr *, socklen_t *)' changes signedness

と言うエラーが出ます。
if( recvfrom(sock, buf, strlen(buf), 0, (struct sockaddr *)&from, &fromlen)<=0)
これに何か問題があるんでしょうか?
0980デフォルトの名無しさんNGNG
メール送信ソフトにSMTPサーバーを内蔵したソフトを
作ろうと思ったんですが
相手のサーバーに送るときはどのようにコマンドを
送ればいいのでしょうか?
解説サイトなどありませんでしょうか?
0981デフォルトの名無しさんNGNG
>>973
vc++なら#pragma packを使うと幸せになれる。
他の環境で同じ物があるかどうかはしらね。
0982デフォルトの名無しさんNGNG
>>979
fromlen って int ?
socklen_t って unsigned int・・・
0983デフォルトの名無しさんNGNG
>>982
THXです
キャストして解決しました。
0984デフォルトの名無しさんNGNG
なぜfromlenをsocklen_tにしないんだ・・・
0985デフォルトの名無しさんNGNG
ソケットを使って次スレを立てるにはどうすればよいのでしょうか。
環境はWindowsです。
0986デフォルトの名無しさんNGNG
socketを使ったbrowserで次スレを立ててください。
0987デフォルトの名無しさんNGNG
スレッド周りはsocket APIに含まれていないので
pthreadなりCreateThreadなり使ってください
0988デフォルトの名無しさんNGNG
>>980
RFC2821, 2822は一応読んでからにしてくれ。
0989デフォルトの名無しさんNGNG
>>980
SMTP コマンド
あたりでググればそれはもう沢山出てくると思うが。
0990デフォルトの名無しさんNGNG
まともな回答期待あげ
0991デフォルトの名無しさんNGNG
まともから程遠い質問(>>985)にまともな回答がつくはずもなく。
0992デフォルトの名無しさんNGNG
980なんですが
0993デフォルトの名無しさんNGNG
>>992
みんなまともに答えてくれているが?
0994デフォルトの名無しさんNGNG
>>985
こうやるんじゃヴォケェ!

ネットワークプログラミング相談室 Port9
http://pc5.2ch.net/test/read.cgi/tech/1080658835/
0995socket 995NGNG
ん・・・
0996デフォルトの名無しさんNGNG
Plum
0997デフォルトの名無しさんNGNG
Plum
0998デフォルトの名無しさんNGNG
埋め
0999デフォルトの名無しさんNGNG
埋め立て
1000デフォルトの名無しさんNGNG
↓1001げっとおめでと
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。