1 :
デフォルトの名無しさん ◆OaTCP/IPW6 :
04/12/07 22:57:35
2 :
デフォルトの名無しさん :04/12/07 22:58:03
4 :
デフォルトの名無しさん ◆TCP/IPmFAM :04/12/07 23:00:38
5 :
デフォルトの名無しさん :04/12/07 23:00:44
御免、かぶっちゃった、まかせます。
7 :
デフォルトの名無しさん :04/12/07 23:01:19
乙。
9 :
デフォルトの名無しさん :04/12/07 23:02:14
10 :
デフォルトの名無しさん :04/12/07 23:02:51
11 :
デフォルトの名無しさん :04/12/07 23:05:29
こんなもんかな(・_・)
13 :
デフォルトの名無しさん :04/12/08 01:06:57
なんでクックロビン音頭が
質問です。win9xで動くパケットフィルタを作るのに何か良い方法はありませんか? 調べてもwin2k/XP用の情報しか見つからなかったので。
15 :
前スレ808 :04/12/08 11:06:37
送信する際に、送信パケットの先頭にプレフィックス(2byte)を付ける事にしたのですが、受信の仕方について少し質問があります。 受信する際に、プレフィックス分(2byte)を先にrecv()して、そのデータから次にくるサイズを判断して、そのサイズ分recv()するというコードを組んだのですが、 FAQを読み返すと、silly window syndromeが発生しそうなのですが、こういったコードは止めた方が良いのでしょうか? それと関連して、recv()する際のバッファの大きさというのは、どれくらいが理想なのでしょうか?極端な話、1Mくらい取っても平気なのでしょうか?
大きくしても平気だが、中に1MBぶんのデータが入っているとは限らない。
>そのデータから次にくるサイズを判断して、そのサイズ分recv()するというコードを組んだのですが、 ここが問題
>>16 あぁ、それはわかっているのですが・・・。
えーと、少し言葉が足りなかったみたいですいません。
速度的に、recv()に指定するバッファの大きさで違いが発生するのか知りたかったのです。
>>15 受信部のモジュール化がちゃんとしていれば、
後から幾らでも書き換えられるから気にすることはない。
>>19 silly window syndromeの分は理解しているとして、
バッファーが大きいと遅くなるかって事か?
ならんよ。仮想記憶上のメモリ食うのは食うけど、速度とはほとんど無関係。
>>17 ということは、やはり、ある程度の大きさのバッファにrecv()した後に、
最初の2byteを見て、その後に続くバッファを切り分ける方法で良いのですかね?
って、書き込む前にリロードしたほうがいいですね。
>>20 ありがとうございます。
今回のプログラムの場合は送信側が、1/60秒間隔で送る仕様なので、あまり気にしない事にします!
>>21 速度は、無関係なのですね!ありがとうございます。
24 :
デフォルトの名無しさん :04/12/08 13:43:40
>>22 今回問題無さそうだけど、Unix系のプラットフォームなら、fdopen と setvbuf で
バッファ管理をライブラリに任せてしまえば手間要らずで簡単だと思う。
>>22 なるほど、そういった方法もあるのですね。
余裕があったらやってみたいと思います!
ありがとうございました。
>18 Winsockで具体的にどうやるんですか?もう少し詳しく聞かせてください。
winpcap&windump使っとけ
ミニファイルサーバー作ってるんですが サーバー側で while(){ send(char buff) } クライアント側で while(){ reeive(cahr buff) } みたいなルーチンで大丈夫なんでしょうか? なんか失敗することがあるんですが
>>29 > reeive(cahr buff)
> なんか失敗することがあるんですが
馬鹿は無理してレス付けないでいいですよ。
32 :
デフォルトの名無しさん :04/12/09 14:08:43
>>29 send や recv のドキュメント読めばだいたい書いてあると思うけど。
受け取った中身自体は、TCPの場合だいたい信頼するのが普通。
チェックしろという要件があるなら、自前でCRCでもつけとく。
33 :
デフォルトの名無しさん :04/12/09 14:12:42
受信の失敗の心配してねえんだよばか
>>29 関数の戻り値を全てチェックして発生しうるエラー全種類に対して適切な対応しろ。
以上。
35 :
デフォルトの名無しさん :04/12/09 16:09:21
前スレ最後の方でアホな質問をしていた者です。さきほどは失礼しました。 バイナリデータを含むBYTEデータを送信してみたところ受信した結果と違いがありました。 /* 送信側 */ BYTE buf[1024]; buf[0] = 0x00; buf[1] = 0x00; buf[2] = 0x01; // 10進で1 buf[3] = 0xAO; // 10進で160 buf[4] = … long rtn = send(soc, buf, sizeof(buf), 0); /* 受信側 */ BYTE data[1024]; long rtn = recv(soc, (char *)data, sizeof(data), 0); /* 受信結果 */ data[0] = 0 data[1] = 0 data[2] = 1 data[3] = 148 buf[4] = … 受信データの3バイト目に148が入っていますが、 送信データの3バイト目は160です。 なぜ送受信したデータに違いが発生してしまうのでしょうか? recv()の戻り値の受信バイト数は送信バイト数と異なっていました。 おかしいと思い送信の仕方や使用するデータ型をcharに変えたりしましたが 状況は変わりませんでした。 本当に困っています。どなたかアドバイスお願いします。
理由添えずにさらしてるだけなのはただの中傷
39 :
デフォルトの名無しさん :04/12/09 17:58:48
ネットワークルプロルラリングにはRubyが最適!
>>36 Perl使ってるから。
Rubyを使わない奴はただのDQN
>>37 勉強はしてるんですが・・・
>>40 マジですか w
前スレにはこれについてのカキコは無いですよね?
ポイントだけでも教えて。
webDAVに関してですがjakarta slideは SSLやproxyに対応していますか?
44 :
デフォルトの名無しさん :04/12/09 18:20:02
知らない奴はレスしないで下さい。ウザイだけですから
Rubyは採鉱言語
Ruby!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>>42 Cのデータ型を勉強したほうがいいでしょうか?
>>47 >send(sock, net_byte+data, sizeof(data)+4, 0)
net_byte+data
ってなに?
>>48 ポインタに整数を加算しようとしていますからおかしいです。
send()でBYTE型を使いバイナリデータを送信し、
recv()で受信するとバイナリデータが壊れている(違う数値になっている)
のは私がデータ型を分かっていないからなんでしょうか?
BYTE buf[1024];
long rtn = send(soc, buf, sizeof(buf), 0);
BYTE data[1024];
long rtn = recv(soc, (char *)data, sizeof(data), 0);
連続書き込み失礼します。 メモリウィンドウで送信したデータと 受信したデータを比較しましたが、やはりバイナリデータの部分だけ 壊れていました。一応報告まで。
その配列のデータが本当に受信したものなのかただのゴミなのか区別してるのか? rtnを越えた部分のデータはゴミだぞ。
>>49 データのIOについてよく分かってないなら、まずネットワークへの出力より先に
ファイル出力で試しをやってみたら?writeも似たような書式なわけだし。大した
差はないけど、ネットワーク絡みの問題を避けて、基本部分のチェックができる
から。
0とOの区別がつかないなら眼科に行ったほうがいい。
54 :
デフォルトの名無しさん :04/12/09 20:13:43
>>49 =35
51が正しい指摘してるよ。
送った分だけ受信するには、送ったバイト数受け取るまでループして受信を続けなくてはならない。
つーかsocketのAPIなんて数少ないんだから先にリファレンス嫁と。
質問です。 ソケット・ディスクリプタを別の実行プログラムに引き渡す方法として、 値をそのままプログラム引数で引き渡してやるとRedHat、Windows 2000/XP で正常に動作してるようなのですが、これは正しい方法でしょうか? <プログラム起動側> sock = socket(AF_INET, SOCK_STREAM, 0); ・・・bind,listen,acceptした後、send,recvを実行・・・ char cmdbuff[512]; #ifdef WIN32 sprintf(cmdbuff, "start hogehoge.exe %d", sock); #else sprintf(cmdbuff, "hogehoge %d &", sock); #endif ・・・ <プログラム起動側> main関数のargcで受け取ったソケット・ディスクリプタの値をSOCKET変数 に代入し、それを使ってsendやrecvしても問題なく動く Linuxならdupした後、forkの子プロセスからexecする方がいいのでしょうか? また、Windowsでは、ソケット・ディスクリプタをプロセス超えて複製する 正しい手順などあるのでしょうか?
すいません、少し訂正です。 <system関数で別プログラムを起動する側> sock1 = socket(AF_INET, SOCK_STREAM, 0); ・・・bind,listen sock2 = accept(sock1, (LPSOCKADDR)&addrLocal, (size_t*)&addrLen); acceptの後、sock2を使ってsend,recvを実行・・・ char cmdbuff[512]; #ifdef WIN32 sprintf(cmdbuff, "start hogehoge.exe %d", sock2); #else sprintf(cmdbuff, "hogehoge %d &", sock2); #endif ・・・ <system関数起動される側> main関数のargcで受け取ったsock2の値をSOCKET変数に代入し、それを使って sendやrecvしても問題なく動く
GyRCI1IjdSNiI3khKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEq ISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqGyhC
>>56 なにを持って正しいとするか。
動けばいい、ならば動作すれば正しい。
作法が重要、ならば正しい作法で。
上司が大変、ならば退職届を書く。
>>59 役だたねぇ回答乙。オナニーは自宅でやれな。
>>56 前のほうの質問。
fork して exec すれば引き継いだり dup で複製したり確実にできる。
system関数はシェル起動までは引き継がれるだろうが、
その先どうなるかシェルが何なのか解らないとわからない。
後のほうの質問。
CreateProcessで作るプロセスには bInherit を指定して、ハンドルを引き継がせることができる。
このときはハンドルの値も同じ。(system とか exec はデフォルトで TRUE だっけ?)
関係ない他所様プロセスにハンドルを渡したい場合は、DuplicateHandle or WSADuplicateSocket。
女房のボインに毒を塗ったら 翌日隣の家の親父が死んだ
>>59 ,
>>63 ID が出ない事をいいことに人の番号を騙らないで下さい!!
なんか雰囲気悪いですね、このスレ。
>>63 でもチョトだけワロタ
>>28 winpcapはキャプチャだけじゃなくて、パケットを破棄したり書き換えたりできるんですか?
>>65 おまえには一生無理だ
そのレスがどれだけアホなものかをわかったとき
お前は死ぬ
死ぬんかいw
>>66 パケットフィルタリングしたいと言っているのに pcap を紹介する
馬鹿さ加減を 14 は揶揄したかったんでしょ。
>>62 Linux側、確実に動く方法で書き換えました。
WSADuplicateSocketの情報も助かりました(このAPI知りませんでした)。
どうもありがとうございました。
>>62 > その先どうなるかシェルが何なのか解らないとわからない。
POSIXではsystem(3)は/bin/shを起動するものと決まってるんだが。
だいたいシェルが何かわからないんじゃsystemの引数も書けないだろ。
>>56 > main関数のargcで受け取ったソケット・ディスクリプタの値をSOCKET変数
> に代入し、それを使ってsendやrecvしても問題なく動く
close(2)せずに子プロセスで同じディスクリプタ番号使えばもちろん問題ないわな。
>>71 >>56 はdupした後は親の方でclose死体と言っているので
その答えは無意味。
某A社の通信ライブラリを使ってて,そこにはこんな感じのAPIがあるんだけど int sendData(const void *data, int length, int *sleep); 戻り値 OK .. エラー無し WOULDBLOCK .. 非ブロック処理続行 IOSLEEP .. スリープ可能 ERROR .. その他エラー 「スリープ可能」って,どういう意味だかピンとくる人います? この値が帰って来たら,何をすればいいんだろう?
>>73 それだけの記述から正確な意味や意図が汲み取れるわけないだろ・・・
やっぱりなあ(;´Д`)いやそうだとは思ってたですよ。 一昨日,上に相談したんだけど,「ちょっと待っててね」ばかりだし。。。 リファレンス読んでも「スリープ可能」しか書いてないし。。。 サンプルコードもないし。。。 あー。。。
逆汗汁
>>72 最後のひとつがcloseされるまで使えるよ
マトモな実装なら、とりあえずsleepをNULLにすればIOSLEEPは戻らない。
81 :
デフォルトの名無しさん :04/12/12 14:00:43
♪
非同期か同期か
83 :
デフォルトの名無しさん :04/12/13 10:48:26
ストリームソケットで質問です。 char buf[ 600] = {0}; //bufに値を入れる。 memcpy( buf, ???, sizeof( ??? ) ); send( buf, 600 ); とクライアント側で送信。 char buf[ 600] = {0}; int iLen = recv( buf, 600 ); とサーバー側で受信。 これを連続して行っているのですが、recv()の戻り値が600以下で返ってくる場合があります。 send()って、バッファサイズに指定したサイズを一気に送るのではないのでしょうか?
あ、すいません、FAQにありました。 スレ汚しスマソ。
基本中の基本だ
下記の感じでHTTPクライアントを作ったのですが、 GETではうまく取得できてもPOSTではうまく取得できません。 ネットでも結構調べてみたのですが、POSTのサンプルを見つけることが できませんでした。使用言語はCです。ご教授お願いできないでしょうか。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <winsock2.h> #include <io.h> #define BUF_LEN 255+1 // 一時退避のサイズ // argc 引数の総個数 // argv 引数の文字列を指すポインタの配列 int main(int argc, char *argv[]){ // 変数宣言 int s; // ソケットのためのファイルディスクリプタ hostent *hostent; // ホスト名と IP アドレスを扱うための構造体 sockaddr_in sockaddr_in; // ソケットを扱うための構造体 servent *servent; // サービス (http など) を扱うための構造体 WSADATA wsadata; char send_buf[BUF_LEN]; // サーバに送る HTTP プロトコル用一時退避 char host[BUF_LEN] = "Localhost"; // 接続するホスト名 char path[BUF_LEN] = "/"; // 要求するパス unsigned short port = 0; // 接続するポート番号 char host_path[BUF_LEN]; // ホストのパス名 char *p; // /の位置格納ポインタ int errCode; // エラーコードを格納 char recv_buf[BUF_LEN]; // サーバから受け取る HTTP プロトコル用一時退避 int numrcv; //recvのエラーコード獲得
// 初期化を行う関数
if (WSAStartup(MAKEWORD(2, 0), &wsadata)) {
printf("WSAStartup関数失敗です\n");
return -1;
}
if ( argc > 1 ){ // URLが指定されていたら(引数2個目がURLになる)
if (strlen(argv[1]) > BUF_LEN-1 ){
fprintf(stderr, "URL が長すぎます。\n");
return 1;
}
//
http:// から始まる文字列で
// sscanf が成功して
//
http:// の後に何か文字列が存在するなら
if (strstr(argv[1], "
http:// ") && // argv[1]の先頭から
http://を探す sscanf(argv[1], "
http://%s ", host_path) && // %sにhost_pathを読み込む
strcmp(argv[1], "
http:// " )){ // argv[1]が
http://なら処理をする p = strchr(host_path, '/'); // ホストとパスの区切り "/" が含まれているか
// 先頭から/を探しポインタの位置を返す
if ( p != NULL ){
strcpy(path, p); // "/"以降の文字列を path にコピー
*p = '\0'; // ポインタを初期化
strcpy(host, host_path); // "/"より前の文字列を host にコピー
} else { // "/"がないなら=
http://host という引数なら
strcpy(host, host_path); // 文字列全体を host にコピー
}
p = strchr(host, ':'); // ホスト名の部分に ":" が含まれているか
// 先頭から:を探しポインタの位置を返す
if ( p != NULL ){
port = atoi(p+1); // ポート番号を取得
if ( port <= 0 ){ // 数字でない (atoi が失敗) か、0 だったら
port = 80; // ポート番号は 80 に決め打ち
}
*p = '\0'; // ポインタを初期化
}
} else {
fprintf(stderr, "URL は
http://host/path の形式で指定してください。\n");
return 1;
}
}
printf("
http://%s%s を取得します。\n\n", host, path);
// ホストの情報(IPアドレスなど)を取得して、hostentにセット */
hostent = gethostbyname(host);
if ( hostent == NULL ){
errCode = WSAGetLastError();
fprintf(stderr, "[%s] から IP アドレスへの変換に失敗しました。エラーコードは%dです\n", host,errCode);
return 0;
}
memset(&sockaddr_in,0,sizeof(sockaddr_in)); // 構造体をゼロクリア
sockaddr_in.sin_family = AF_INET; // アドレスファミリ 固定で決まっている
// IPアドレスを示す構造体をコピー
// 指定されたバイト数をhostent->h_addrから&sockaddr_in.sin_addrにコピーする
memcpy( &sockaddr_in.sin_addr,hostent->h_addr, hostent->h_length);
if ( port != 0 ){ // 引数でポート番号が指定されていたら入れる sockaddr_in.sin_port = htons(port); } else { // そうでないなら getservbyname でポート番号を取得 servent = getservbyname("http", "tcp"); if ( servent != NULL ){ // 成功したらポート番号をコピー sockaddr_in.sin_port = servent->s_port; } else { // 失敗したら 80 番で固定 sockaddr_in.sin_port = htons(80); } } // ソケット生成 if ( ( s = socket(AF_INET, SOCK_STREAM, 0) ) < 0 ){ errCode = WSAGetLastError(); fprintf(stderr, "ソケットの生成に失敗しました。エラーコードは%dです\n",errCode); return 1; } // サーバに接続 // SOCKADDR 構造体は、Windows ソケット通信に参加しているマシンの // IP (インターネット プロトコル) アドレスを格納するのに使います。 if ( connect(s, (struct sockaddr *)&sockaddr_in, sizeof(sockaddr_in)) == -1 ){ fprintf(stderr, "connect に失敗しました。エラーコードは%dです\n",errCode); return 1; } // HTTP プロトコル生成 & サーバに送信 sprintf(send_buf, "GET %s HTTP/1.1\r\n", path); // send_bufにGET path HTTP/1.1の文字列ができる \r行の先頭へ移動 // send(接続されたソケット,送信すべきデータへのバッファへのポインタ,,バッファのバイト数,オプション設定) send(s, send_buf, strlen(send_buf),0); // 送信 送信オプションの指定はしない printf("送信内容1:%s\n" ,send_buf);
sprintf(send_buf, "Host:%s:%d\r\n", host, port); // send_bufにHost: host;portの文字列ができる \r行の先頭へ移動 send(s, send_buf, strlen(send_buf),0); // 送信 送信オプションの指定はしない printf("送信内容2:%s\n" ,send_buf); sprintf(send_buf, "\r\n"); // send_bufに\r行の先頭へ移動 send(s, send_buf, strlen(send_buf),0); // 送信 送信オプションの指定はしない printf("送信内容3:%s\n" ,send_buf); // 受信して表示 while (1){ // recv(接続されたソケット,受信データへのバッファへのポインタ,バッファのバイト数,オプション設定) // 受信したバイト数が戻り値 numrcv = recv(s, recv_buf,sizeof(recv_buf)-1,0); if ( numrcv > 0 ){ recv_buf[numrcv] = '\0'; printf("受信内容:%s\n" ,recv_buf); } else { break; } } // ソケットのクローズ closesocket(s); // Winsockの後処理 WSACleanup(); return 0; }
wgetのソースでも読めば?
GPL!GPL!
こんなところに長々と何レスも使って見にくいソース貼るなよ そんなに長いソース見てもらいたいならどこかにファイルで上げろ
すみません。開発環境を書くのを忘れていました。 WindowsXP SP2で、C++ビルダー6.0で開発しております。 Unixだと結構書き直しがいるみたいでしたので。 Unixのようですが一応wgetとGPLも調べて参考にさせていただきます。
libcurlでも使ったら楽だ。
95>>配慮に欠けておりました。申し訳ありません。
etherealで、ブラウザがPUTしている時のパケットを覗き見て参考に。 自分のプログラムとの違いを調べてみれば? その前にHTTPのRFCはちゃんと読んで欲しいが。
hoge.tgz eNq9WNtrG1cafzf4fzhVsTPjjmMpUChObFZJ3DTUudlKk67teGVpLA2VR2JmbJOkLugc2NqOrUi2 HENh+xBCIWq2y1ISL7TJ0hKndZHpS8guIWkWFhy7D4tCH3YpfdjvO+fMRbbcpJRd8GV05rtfft93 9LJhJjLjSZ0csJ2kkd2b7m5uejlwZhlmasdhMmOMbDucNEw7m3hn37ZjKRGOkvqoYerk4OnXh3t7 jpN9r776SoR0dJDp7wsflr4r12iVxdgh9jYSw3HcSiXI9H+KZVotzc99WSy7pxPydOlW4YPlZ7RW mKQr7F3gXGTnaLV8YfkZSjBMh4zFDVPBB5SlkUQ6bpE2lDAwpF7k4pa+LZaLW3N3BL29H+1hg+wk G2EpWqW36ROwymG/AemX2Cg7yM6y42yWTbBzzU3prO3owNUmHwTzBSBJXfmc3iNHTxIWZWk2x87S 2vRNek2Imx8sXS1Vm5swWPFk0ho2TBJ4rjehEZ9uTXC18kEwxPIDzGJniZJ2nByhX9OvVNKI+0x/ 9HA0FiWTdjwZd+L7MVQ8LrZuJodHxkcHZH6GfLlZulZaplvkjVgMXJpg8yzF+til5ZybOSkC4+Cx ky4S6s0m4hk8DXFhxYelP9MVuuXGSLLl4k66jq1DkC9PXMpz8hw729w0btpGytSTxE5nLYfk8E8X CdcLfhesTZXvz//ecwu1D9dpCKQJcguyPUPacvxdB61Of7MwPmuUB9yyEuWhW9ahbFIXAo6wGVDW B79pWkNaT6WlJyZ2jeR1+rTwA/1TYePn44nqzPExKzGBzCgRbA2onM0s3pF9cnlm9seZz2ht3qbX Zh9gmxijRIE89ztxyxnPKceib/acOdF3WNmnkbCqkVaZe1Ul0AQ56G9nVAn5DCik8JeyTVfpyqAZ UqFGLN0Zt0zSHoHnKd5doEJ0aDeJEPUieni6r5dWCpMLm/RT+j29S69C5T1VeK+emvvyykNaQYo1 qM0tVUgAcMnopsI7MjKkgiwZsnaU2dw0Ko0DvIHYayQEAgitLKxAsm/QR3Qlf7DeQGkfGINt0An/ ecBNoN2ScLHKX9t2Im6Ogqzijbl/05v0bj1Tde6fdG3mNr0umSqlW/OPscLA+Kee7fDj2g62SeaQ SlpbiUQqeEOrxY3FCpohCWhtIUZXoI+5CTsFtNghzS9bV1qLTde8Q1pb/Io+nv+QfgdiHCsxlmtg B1FFWlw7Kq5+cOHy9PIfaA0dwmTmoJFQTNpSPBUa2dOxRw32yj3sFVq9tFH8O93EJoXozT6CyIpc b9HrPIaut8LPmz4wY0/R2tJ99J2XT4681EWOn+7t5blGA3LnFaE7JzSDkumv59/zoZ5jBaFr0C52 HjquDU3fMxjeIwx1ddVET3hC0atgTF3hdINulk4ExCNJQPwU0TO2Ti665BWI3VWMXz4vgykY7sHp NV7ovDx+TqtQVeovVRuoa5AMyENnXR5gtFSXyksVukZCnc/JQecvzIEE1biTNZTcKxGp1gNVGLUb
AnYEL1IfAAyW/Q+o8QFgBoSIKCgCbEMYgTl0PR8NE3qHfoGI4Kl5Lbxd/jqcQTzmpumT0ir9K4/I 81I85adpN8BYJ4FsdYgSqs79rvAJXeVwBe1P/wjmfUqv7gIoUz5Oel3aYhMREOCXUAS8IuEaERnn 2XBnzeV/LT1Tjp70dgKc0Z6Eu/moXCOgHn6Ls5+0dfg7RhdJ6Q5+GDlvxsd0XhoonifCIwqkUs4q YARgP6I7vXHb6bGsrKUg2444DbTYQxwr67aWB1Bq386u0DU+DtDNm/R2/mDd7FtvScpBIV2XmgNB DIsgjuljtu4orYFlRwtrtnFBz4Il/qEq6k5sLLTGBmBA4tIVrduZ9tqGOTwaHzMy58HJ6OvDR4/3 xESNSPP53vYemyVzq5DkVaiqR1CBvE94XgKpqBU+oiueQtmOQOJNs9ssC4WXgg6vyWi3d6eH0RQM Wut2u/gL2dcCZcF5xATSkFTbJlMjgQOYkClRS8G+e8nvOw48q4E22jGEF3+C562d4ZONmHaypq3g B9QSBD36GeyPqy7qYQ3i0ilqkNTplNDgLqdd9bSibaBCQk4iF/IK16X2MYjjiBjJYHdQvpuVXXyQ otq7bX6yzQ9ZvyASEaZ8H6oBauI5AXktrHrdLxpZbuXFW8Ub0gPwAZWDGKhsWYQa6T9x6M3h/lhf T/QYrlxEJQd4tn5xW/pXEdT5on24swP9vchd6HFl5gdoa/Tw4T6339bz0TOGmcxO2p6/C98Uj4Hu UzNfcKiE/mFT7C22SKuyj4giUBlEZzh0+UutGrgD4ZbMl6gqSEuBHA6bMpKJrGnqCUexNb5bjScc 71ZE2tQ60CCNMAPRb7e1UcomvzqA3N9taztmhrQGbkrFY1BYrgnyVgVGHOmJwRbHuTsieyODFodM fzNwSekaUvIp5dJ6G0oFLPwYbg6DFmz7YrF8MP1w8ROx04IAhV+FBGLJ7GloEYT9b/RjNgo2nkNY BzgbQXzkz3Kmapp3WnXhTmNHwdO32Ptssfh4YVPFDgctkCTfM7nFuweqFhYOoV7+x5dBqxya1iH8 gCn+UEWqxX8s6/RkZ4sNcSGaJ43jXoNwvgEICcSdLUkZSTl3OYrVx5OT8vf78fULRPN/6+SpF3aS u7bdnf+3uX2NzEVQ/QHqCgBhabDwUXPTZNrI6ESJYAPy13hpbVSOyPacQnyROvQN8Gdz5coTurmQ aW4SV2dAWW4ERMa9k7vrhvtZbY9oYW8eSbZuCdbeRV6cD7mLqB8jtABj5EbIE7s/uJWOWHr8HW+U 1H3DBIvNPITi7eamRCZr63KQ2KIggPKM+FINL6R4Z+Pf3xzK6HET7vU7N6z/Asib6Pk=
>>86 POST するデータ本体を send していない。
POSTするデータのContent-TypeもContent-Lengthも送っていない。
そういうの無しでPOST動作可能なのCGI相手なら、上手く動くでしょ。
一般的にはPOSTでContent-TypeもContent-Lengthも無しで「うまく」動くCGIは無いと思うけど。
>>102 x-www-form-urlencoded 前提の CGI プログラムなら
大抵 Content-type なしで動くでしょ。別に薦めているわけじゃないけど。
part11でちょっとだけ出ていた通信手段としてDBを使うってネタなんだけど、 この場合の信頼性に関して情報が欲しい。 そういう設計を許すべきかどうかについて判断をする必要があるんだけど、 データの変更が他のクライアントへ反映されるタイムラグや ネットワークの帯域の飽和時の挙動などの不安要素が大きいんで悩んでる。
webベースでのシステムのときに検討の候補になる程度 それ以外の用途には検討すらされない
>>104 > データの変更が他のクライアントへ反映されるタイムラグや
RDB使うかどうかに関係しない。
やっぱ反対するのがデフォですか? それだとダメって言うときの決定的なセリフが見つからなくて 理屈こねられるとどうにも。
その前に、DBを使わないと、 > データの変更が他のクライアントへ反映されるタイムラグや > ネットワークの帯域の飽和時の挙動などの不安要素が大きいんで悩んでる。 が解決する理由を述べよ。 ODBCやJDBCを使ったシステムは、 > 通信手段としてDBを使 っていると考えることができる。 Information integrityをDBに任せる設計。
>>108 データの変更を通知する場合、ソケットなら相手がフリーズしていれば
確実にタイムアウトするけれども、DBなら相手が止まっていても
データの挿入やNotify通知は入れられる。
そして、closeできた時点で相手がrecvしたことが分かる。
commitされるなら問題ないじゃない。
>>109 > ソケットなら相手がフリーズしていれば
> 確実にタイムアウトするけれども、
…
>>110 受信すべき相手が死んでいても正常に送信できるのはやばくないかな?
「接続中」 という表現で想像するのはどっち? 接続処理をしている状態か、接続が完了し通信可能な状態か
>>113 インタフェース・メッセージとしてなら処理中の意味が強いのでは?
connecting...
の訳語として
ネットワーク動作の説明として文章の中に登場するなら後者の意味が強いかも
>>112 そりゃcommitされないでしょ。DBのトランザクション分からないの?
>>113 connectingとconnected。接続中は両方。
>>115 いや、データを受け取るべき相手が停止していて、
DBだけが動いてればcommitするでしょ。
目的がデータをDBに入れることではなくて、
DBを読み込んでいる相手に伝えることだとまずいでしょ。
仮にだ、 エレベータを監視するプログラムA 玄関のドアロックを監視するプログラムB があるとして、 「エレベータが一階で停止したら玄関のドアロックを開く」 これを実現するプロセス間通信の手段が 「オラクルでinsert into ドアコマンド(命令) values ('OPEN')」 だったら変だと思わない?
>>116 普通は「リクエストをDBに登録したら、先方はその応答をまた登録する」っていう設計になってると思う。
んで、一定の時間内に応答が無ければエラー処理。
まともなRPC使ってる人にしてみりゃDB経由ってのはバカらしいことが多いんだけれども、
いろいろな事情で接続性の低いアレコレをつなぐときにはよく用いられていると思う。
>>116 相手の読み取り確認をDB使ってやれば?
まともな分散処理やってる人にしてみりゃDBの処理は分散処理に良く合うことが分かる。 処理完了確認、ACK処理が極めて重要な位置を占めるから。 具体的な分散システムの例だと、OO初期の研究で有名なリスコフさんのArgusなど。 トランザクションRPCを基本処理としている。
2相コミット
なんだか、「歩いて10分の隣町に地下鉄を乗り継いで一時間で到着」な感じ。
新宿から丸の内線で池袋まで行くとそんな感じになるね。
このスレって低水準I/Oばっかで、他は弱い人多いのかな。
要件にもよるんだろうけど、データの整合性や一貫性が重要な場合で、
DBMSを使わないことなんてありえないと思う。同程度の水準を自分で
書くなんて不可能とは言わないまでも、そうとう厳しいんじゃないの?
1リクエスト(1メッセージ)の応答時間がミリ秒単位を求められていて、
DBMSに問い合わせている時間がない、って場合はともかく、
複数台のサーバーで共有する場合なんかは必須になるでしょ。
DBMSだと基本的に毎回クエリ投げる形になっちゃうけど、キャッシュ
(専用DBMSやEJB等)で解決できる場合も少なくないだろうし、安易に
ファイルベースを選択するのもどうかと思うぞ。
>>122 それが必要になるのが、データの整合性の確保なんだよ。
トランザクションや2PCの考え方は理解してるの?
>>124 場合によっては重要なのは借方と貸方の整合性じゃなくて
相手の状況の確認と命令の確実な伝達なんだって。
火災報知機CPUからドアロック制御PCへ開けという命令がきた場合、
必ず即座に開錠しないと人が焼け死ぬでしょ。
>>125 > 借方と貸方の整合性
> 相手の状況の確認と命令の確実な伝達
同じ概念で包括的に考えられると気づけ
まあDBでなんでもってのも馬鹿げているけど、
>>109 みたいな安易な考え方も設計上の問題は大きく、
実装じゃなくて、仕様自体不安定になりやすい。
問題はデータの更新の他プロセスへの反映が何秒後になるか予測できないことだな。 ソケットであれば少なくとも相手がlistenしていることは即座に確認できるわけで。
>>124-127 なんかそれぞれが目的や方向性の違う話をしているような希ガス。
もう一度、要件定義を整理してみようよ。
>>104 >part11でちょっとだけ出ていた通信手段としてDBを使うってネタなんだけど、
>この場合の信頼性に関して情報が欲しい。
>そういう設計を許すべきかどうかについて判断をする必要があるんだけど、
>データの変更が他のクライアントへ反映されるタイムラグや
>ネットワークの帯域の飽和時の挙動などの不安要素が大きいんで悩んでる。
つーか元のコメント自体がかなり抽象的なのによくここまで話が発展するなあ という傍目の印象
>>130 だってサブシステム間の通信にDB使うなんて、ごくあたりまえに実装されてるもん。
ちょっと大規模なシステムのSIやらコーディングやらした人ならすぐピンとくる。
>>114 connectingが「接続中」だとすると、connectedはなんて表現しましょうか。
接続維持中? なんかけったいな感じがするし・・・
>>132 connection established
に対して「接続確立」とかあるけど
ネットワーク系の用語はケース毎に置き換えで対応してる感じだし
正確さとか明解さを重視すると英語そのままになる
「つなげています」→「つながりました」(つながっています?) 「接続しています」→「接続しました」 「接続を開始します」 「接続の準備中です」
>>133 なんか、ウソでもいいからJISあたりに規格無いものかな
あえて日本語にする場合は、接続処理中、接続中、切断処理中、切断中とかにしてるなぁ。
137 :
デフォルトの名無しさん :04/12/15 16:13:38
C言語です。IPアドレスを指定して、そのIPアドレスを持つホストが起動しているか を確認するプログラムを作りたいのですが、どうやって起動しているか判断すればいいのでしょうか?
こたえがかえってこなかったら
C言語さんこんにちは。
141 :
デフォルトの名無しさん :04/12/15 16:24:09
>>137 ポート全スキャンして、反応があるかどうかを確認する。
142 :
デフォルトの名無しさん :04/12/15 16:25:10
UDPでファイルの送受信をしているのですが、画像など,100KBくらいを超えたデータになると受信できなくなります。 理由としてどのようなものが考えられますか? ちなみに,パケットサイズは160としています。
一部が欠けて困るようなデータをUDPにするなと何度言わせれば・・・ しかもサイズ160って・・・
「受信できなくなります」じゃ状況がいまいちわからん
145 :
デフォルトの名無しさん :04/12/15 17:01:16
例えば,「a」を1000個くらいテキストファイルに書いて送ると,受信側では10個くらいになってしまっているんです・・・。
UDPはデータが減っても文句は言えない
それどころかabcdefgになっても文句は言えない
さらに1500個になっても文句は言えない
149 :
デフォルトの名無しさん :04/12/15 17:32:19
なぜUDPを選択したんだ?
簡単そうとでも思ったんじゃない?
あ、どうもUDPです。
どうせものすごい勢いで送りまくってるんだろうな。 送信元PCのバッファから外に出て行ってない悪寒。
>>152 お前がUDPか!
何回言えば分かるんだ。
今度IPも連れてきなさい。
ああ、またUDP君、怒られてるぅ 僕に頼めばいいのにぃ マターリ砲発射! _| ̄| (((●コロコロ
UDPとTCPの中間みたいなプロトコルないかねぇ? データグラム型でデータの保障アリの・・・
>>156 それはUDPだろ
データの管理は自分でサポートしなければいけないだけで
158 :
137 :04/12/15 23:40:59
>>138 答えが返ってこなかったらとは具体的には何を実行して答えを待てばよいのでしょうか?
>>139 プログラム中でpingとかできるんですか?
>>140 こんばんわ
>>141 ポートスキャンすればいいということでしょうか?もしサーバが起動していなくても
ポートスキャンは可能なんでしょうか?
UDPって言ってるんだから、PF_INETで PF_INETにSOCK_SEQPACKETは無いだろ? 順序保障されたDGRAMがほしければRTP使えば? ってのをどこかで見たおぼえはある。
>>158 > プログラム中でpingとかできるんですか?
pingは単なるraw socket programです。
163 :
デフォルトの名無しさん :04/12/16 17:28:25
SOCK_STREAMで一度に遅れるのは何バイトまでですか?
RPC使えば?
ローカルで動くパケットフィルタを作るためにはどんな方法がありますか? そのPCに届いたパケットのIPをチェックして特定のものを破棄する、というような事がやりたいのですが。
OSすら指定しませんかそうですか
168 :
デフォルトの名無しさん :04/12/16 18:32:08
あ、間違い
>>163 は
SOCK_STREAMで一度に送れるのは何バイトまでですか?って事ですから
すみません、Win2k/XPで。言語はC。
2Gバイトぐらいまで大丈夫じゃなかろうか。
172 :
デフォルトの名無しさん :04/12/16 22:01:23
ストリームに「一度に送る」なんて概念はないわけだが
24シーズン3でドメイン名からIPアドレスを検索できないように してるってのがあったんだけどどうやるの?
JPNICに登録しない。
ごめんIPアドレスの話か、登録情報と勘違いした。スマソ
でも接続した時点でnetstatすればばればれだよね?
もっと勉強しろ。
24シーズン3みんな見た?
スレ違い
プログラミングに関係ない。
ム板は真面目過ぎ
ローカルの話としてDNSをいじってアドレスの解決ができないようにすることは 可能だけど、それやっちゃうとアドレスとしての意味がなくなるわけだからグロ ーバルでは無理。 確か「24」って何かのときに出てきたスクリーンに8bit超える数字がIPアドレスで 使われたりしたからあんまり技術面に詳しくないんだろうなと思った。192.0.2.x を使うべきなんだけどね。
> 192.0.2.xを使うべきなんだけどね。 それは私の所有するアドレスです。勝手につかわないでください。
192.168.0.2は俺のだから、みんなそこヨロシコ。
落ち着け
>>175 24のとは違うけどモデム経由でuunet接続すれば、メールやNetNewsに
限ってはIPアドレスなしのドメイン名でアクセスできる。
いまだに運用されている地域があるかどうかはわからないけど・・・
>>186 っていうか
漫画とかで車のナンバーが5桁になってたりするのと同じで
実アドレスにならないようにわざとはずしたんじゃないかと。
WinSockの質問です。 javaやUNIXでは行単位で受信する方法がありますが、WinSockで 同じようなことをしようと思ったら手作りするしかありませんか? sockstream >> recvbuff; とか、sock.getline(recvbuff); の ような使い方ができるものがあれば使いたいのですが・・・ # MSDNを見た限りでは、見当たらなかったので。
へー、BSD socketには行という概念があったのか。 Javaはラップしてるだけだし。
windows上でjavaを使えばいい
192.0.x.x とか 192.1.x.x とか 192.2.x.x が設定されている環境を何度か見たけど、 このあたりがローカルIPだという迷信はいつ頃広まったの?
そう設定してる人や そういう噂を広めた人に聞かないと
>>194 socketをfdopenすれば、あとはfgetsでいけたりする。
そんなことは分かってる。 問題は、それがsocketの機能なのか、ということ。 「行」の扱いは、stdioのライブラリがやってることだろ。
>>199 べつに193は「socketに」なんて言ってないが。「UNIXでは」といっているだけ。
くだらない突っ込みする前にソリューションを示したら?
くだらない突っ込みする前にソリューションを示したら?
なるほど、
>>198 に書いてあるのが
くだらない突っ込みではない
的確な解決法というわけですね。
どうやら自分で作らないとだめなようですね いろいろどうも。
>>202 回答できないくせに吠えるアフォって多いよな。この世界。
人をバカにするだけで役に立たないやつ。
Windows はソケットハンドルとファイルハンドルが別物なんだよねえ。 不便だ。
実は、NT系なら、SOCKETに対してReadFile(),WriteFile()等が出来たはず。 が、、fdopen()等がHANDLEを受けるインターフェースじゃないので渡せない。
>>206 それは、Winsockが出始めたころの話。
いまは、同じだよ。
ネットワークプログラミングって楽しいね
>>207 _open_osfhandle( )して_fdopen( )
Windowsってややこしいね。
STLPortのbasic_fstream::open( )はハンドルを受け取るバリエーションが
あったと思った。
それが、Windows HANDLEか、CRTのファイルハンドルか
stdioのFILE*かは忘れた。
STLPortの拡張で標準にはないね(たしか)。
いずれにせよ、SOCKETを_open_osfhandle( )かfdopen( )かそのままか
してbasic_fstream::open( )にすれば、
>>193 のやりたいことはできると思う。
>>207 >>208 なんと、知らんかった…。
だいぶ古い知識のまま不便だと思いこんでたのね…orz
>>210 情報ありがとうございます。
XP Pro SP2環境でWinSock2.0で試しに以下のように書いてみました。
特にエラーはでないのですが、fgetsでまったくデータを読めません。
recv関数に置き換えると読めます。
通信相手からはCRLFの付いたデータを送信しており、受信側がデータ
を読めないときでも送信バイト数分きっちり送りきっています。
fgetsをfreadに変えて読取りバイト数を確認すると0バイトでした。
何か勘違いをしているのかと思いますが、お気づきの点があれば
ご指摘願えないでしょうか?
connect(sock, ...);
int handle = _open_osfhandle(sock, _O_RDONLY | _O_BINARY );
if(-1 == handle)
{
printf("_open_osfhandle = %ld\n", GetLastError()); exit(-1);
}
FILE* fp = fdopen(handle, "r");
if(NULL == fp)
{
printf("fdopen = %ld\n", GetLastError()); exit(-1);
}
setvbuf(fp, buffer, _IOFBF, sizeof(buffer));
char recvbuff[81]; memset(recvbuff, '\0', 81);
fgets(recvbuff, 80, fp);
printf("[RECV] %s\n", recvbuff);
>>196 それがSunのグローバルIPとかぶってたせいで
Sunのサイトにアクセスできないという物凄い環境もありますた
>>196 192.0.0.0/24 - This block, corresponding to the numerically lowest of
the former Class C addresses, was initially and is still reserved by
the IANA. Given the present classless nature of the IP address
space, the basis for the reservation no longer applies and addresses
in this block are subject to future allocation to a Regional Internet
Registry for assignment in the normal manner.
192.0.2.0/24 - This block is assigned as "TEST-NET" for use in
documentation and example code. It is often used in conjunction with
domain names example.com or example.net in vendor and protocol
documentation. Addresses within this block should not appear on the
public Internet.
とは関係ないのですね。 :-)
218 :
デフォルトの名無しさん :04/12/19 01:33:48
219 :
デフォルトの名無しさん :04/12/19 10:37:56
○IPアドレスを元に所属する国を判断するプログラムを 作成したいと思っています。 当初案としては… whoisコマンドで得られる項目「country」や「address」 を元に判断しようと思っていたのですが、 1.1つのwhoisサーバで検索できる範囲が決まっている。 2.whoisサーバが大杉。 3.whoisサーバがコロコロ変わる。 4.whoisサーバのレスポンスがサーバごとに異なる。 5.複数のwhoisサーバを使い分けるプログラムを書くのは激しく面倒。 一部のwhoisサーバは副問合せを実行して、他のwhoisサーバからの レスポンスを返してくれるものもあるようなんですが。 ということで、他に何か良い手立てはありませんかねぇ。。 そんなに判定精度を求めるプログラムではありません。 ・もうすでにそういったプログラムをOSSとして配布してたり ・全てのIPaddressに対して対応しているwhoisサーバがあるとか どなたかよろしくお願いします。
>>219 ネームサーバでIPアドレス逆引きして、FQDNの終わりの.jpとかで
判断する方法ではどうでしょうか?
221 :
219 :04/12/19 10:51:06
>>220 レスどうもです。
その方法だと逆引きできないIPアドレスに対しては
判断できないためちょっと難しいです。
日本国内が中心であれば、大概は逆引きできるのですが、
外国のIPアドレスは逆引きできないのが相当な割合で
存在します。私が持っているものでは半分以上は
逆引きできませんでした。。。
言葉足らずで申し訳ないです。。
>>219 普通arinに訊いてそこになかったら他の三つに回してくれるし
それで再検索かければ国名までは分かるだろ
国ごとに割り当てられたアドレスの表がどこかにあるからそれを探せ。
224 :
219 :04/12/19 11:06:49
>>222 サンクスです!
今までJavaで作成したテストプログラムで
whois.arin.netに問合せをしたときは1回しか
問合せをしてくれなかったので、勘違いしてました。
DOSプロンプトでwhoisコマンド叩くと確かに
副問合せをしてくれますね。いくつか試したところ
全部問合せをしてくれました。素晴らしい。
なぜ自分で作成したプログラムだと副問合せを
しないのかは謎ぉ〜
>>223 どこかのサイトで商用として(Apacheログから
所在国を判断するため?)有料で売ってたところは
あったような気がしますが、無料でもありますかねぇ。。
>>224 > なぜ自分で作成したプログラムだと副問合せを
> しないのかは謎ぉ〜
だから返ってきたorgID見て他の三つなら自分でそっちへまたリクエスト送るんだよ
226 :
219 :04/12/19 11:22:40
>>225 なんと!そういうことでしたか。DOSプロンプトの
whoisコマンドは勝手に副問合せをしてたのですね。
whois.arin.netが勝手にそっちに問い合わせてくれて
返してくれるのかと思ってしまいました。
となるとちょっと疑問。
・orgIDと問合せ先のサーバNameの対応表はどうなるんでしょう?
・各サーバに自分で問い合わせるとなると、
やっぱり各サーバごとにレスポンス形式(フォーマット)は
異なってしまうのでしょうか?
(counry項目だけでは国が判断できなくなったりするのかなぁ・・)
どなたか教えてくださいませんか。
>>227 なるほどぉ、すでにそういったプログラムが存在しているのですね。
CやPerlは久しぶりですが、頑張って読んでみたいと思います。
どうもありがとうございました。
そもそもIPアドレスの管理組織って言ったら上位4つしかないんだが。 ARIN、LACNIC、RIPE、APNIC。それが分かってないんだろ。
> 所属する国 ってのが…
そもそもネットワークプログラミングなのか、これは。
>主にソケットに関しての質疑応答スレです。
233 :
デフォルトの名無しさん :04/12/19 17:29:21
>主に
いつのまにかLACNICなんてできてたのか
235 :
デフォルトの名無しさん :04/12/20 05:11:35
HTTPについて質問なんですけど ETag:ってなんなんでしょうか? チェックサムみたいなものと思うんですが Etagを算出するコードはどうやってかくんでしょう?
>>227 つーか、いまどきは whois-servers.net から CNAME ひっぱって、
そこに whois して終わりだろう。DOS の whois が対応しているか
どうかは知らんけどね。
>>213 そんなバカなと思って、いろいろ試したら
ReadFile(ReadFile((HANDLE)socket, buf, sizeof buf, &read_size, NULL)
するとERROR_INVALID_PARAMETERで失敗するのね。
MSDNのReadFileの説明にはsocketが適応できるようなことかいてあるし、
ERROR_INVALID_HANDLEでないから、どこかパラメータが気に入らないんだろうと
あれこれやっていたら、なんとReadFile()の最後の引数にOVERLAPPED構造体を
指定してやるとOKになることがわかった。
Cランタイムルーチンでもおそらくこれが引っかかってるんだろう。
(Cランタイムルーチン内部ではReadFile()の呼び出しで
OVERLAPPED構造体をNULLにしている)
なぜ?と思ったら
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/default_state_for_a_socket_s_overlapped_attribute_2.asp てなわけか。
socket()の呼び出しは、WSA_FLAG_OVERLAPPEDをセットする。。。
だからOVERLAPPED構造体を要求するのか。
なので、最初のsocket()の呼び出しを
WSASocket(AF_INET,SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0)
にしたらうまく行ったよ。
socketを_open_osfhandle()してfdopen()してfgets()で
改行までをバッファリングして戻るようになった。
しかしwinsockって、だせえ実装だな、おい。
なんでsocket()はWSA_FLAG_OVERLAPPEDをセットするんだ?
>>microsoft
いわずもがな ReadFile(ReadFile((HANDLE)socket, buf, sizeof buf, &read_size, NULL) は ReadFile((HANDLE)socket, buf, sizeof buf, &read_size, NULL) のまちがいね。
240 :
デフォルトの名無しさん :04/12/21 00:22:25
>なんでsocket()はWSA_FLAG_OVERLAPPEDをセットするんだ? > >>microsoft リンク先に書いてあるじゃないか。 backward compatibilityって。
>>238 ありがとうございます。socket()の代わりにWSASocket()を使うことで、
fgetsでデータを読めるようになりました。
こちらも_open_osfhandle()で得たhandleでの_read()を試したのですが、
同様にGetLastError()で[00087: パラメータが間違っています。]が戻って
いたため、いろいろ実験していたところでした。
WSAStartup()でバージョン指定するのだから、socketも下位互換性のある
ものとWSA_FLAG_OVERLAPPEDをセットしないWSASocket()を呼び出すものに
切り替えてくれればいいのに、と思ってしまいました>Winsock
ともあれ、
>>238 さんのおかげでUNIX用ソースをあまりいじらずWinに持って
いくことができました。感謝いたします。助かりました。
242 :
238 :04/12/21 13:55:54
お礼はエロ画像のリンクで頼む。
>>7 のページですが、具体的にどのページが問題有りなのでしょうか? それとも全部って事ですか?
間違いを探そうにも結構ページが多いので・・・
まぁそもそも最初の発言が煽りだったからなぁ。 「こんなページダメだ。俺が代わりに書いてやるよ」つって結局音沙汰なし。 どこが間違いなのかもはっきりと提示してなかったと思うよ。で、スレ立て人が ああいう書き方をしたと。 間違いがないとは思わないけど (ちゃんと内容は見てないが)、間違いあるかもね と思いながら見てればいいんじゃない?
過去スレで具体的に指摘されてるから読んでね。
246 :
デフォルトの名無しさん :04/12/21 21:09:38
dat落ちしているって
返り血見てないってのを除くと、具体的に指摘しているようには見えないね。 どうやら粘着っぽいのも混じっているようだし、なんだかな。 ちゃんと問題点を提示できるなら (あるいは返り血見てないのが致命的だと 思うなら) テンプレから外せば? 思わせぶりなこと書くから、この話題が何度も出てくるんだよ。
>>249 それは逆で、テンプレにない時には、何度も推薦する奴が出てきたんだよ。
結構な量書いてあるから、かわいそうな気もするけどね。
残すなら残すでいいけどさ、同じ話題が繰り返されるのは勘弁してよ。 もう 3回くらい見たような気がするもん。 「返り血チェックが甘いなど、まずい点があることに注意」とか書いとけば いいんじゃね?
>>253 うん、わからんねぇ。
テンプレに書く価値がないなら削ればいいし、テンプレに書いてもいいけど
問題があるっていうことなら、こういうところがダメって書けばいいだけ
じゃないの? 違うの?
255 :
デフォルトの名無しさん :04/12/22 03:19:02
前スレにあったものをそのままコピペしただけなんじゃないの。
とにかくただ「問題あり」なんて書いてそのままってのは良くないだろう
>>254 > こういうところがダメって書けば
マンドクセ
>マンドクセ 無内容なレスで粘着する暇と気力はあるのにな。
批評・批判は自由だけど、「問題あり」だけで終わらせちゃダメだよ。立証責任は 批判する側にある。
いいんだよ。問題ありだけで。
261 :
デフォルトの名無しさん :04/12/22 12:38:01
具体的指摘がマンドクセという人って、 指摘したらそれが批判の対象にさらされるのがわかっていて 嫌がってるだけでしょ 批判する人は批判する人の性質をよくわかっているだけにね。
校正する義務もないし…
指摘するのがマンドクセって言うならテンプレから外せばいいだけでしょ。 それすらもマンドクセ、か?
あのままのソースじゃ使えませんよと伝わればそれでいいんだよ。
やれやれ言ってもやらないやつは絶対にやらないし やれやれ言ってるだけで何もしないやつも糞。 特に後者は役に立つことを言ってるつもりになっている分特に有害。失せろ。
マジメに勉強する香具師ならそのサイトを参考に自分で組んでみる。 なにか問題があったらその時に嫌でも気付く。 「どこが問題なの?」とか言ってる香具師は自分では何も組んでいない と言っているようなもんだと思うのだが。 それはさておき、技術スレが技術と関係ない話題でレスを消費するのは 困るのでここらへんでやめてはくれないか?>議論している人
268 :
デフォルトの名無しさん :04/12/22 19:52:09
そこのサイトの管理人が粘着しているだけだから。
269 :
デフォルトの名無しさん :04/12/22 20:10:10
C言語なら俺に聞けスレでこっちに池と言われたので こちらで質問させて頂きます。 C言語のacceptのエラー処理で、 while (1){ struct sockaddr_in client_sin; memset((void *)&client_sin, 0, sizeof(client_sin)); len = sizeof(client_sin); accepted_socket = accept(listening_socket, (struct sockaddr *)&client_sin, &len); if (accepted_socket == -1) { if (errno != EINTR && errno != ECONNABORTED) { perror("accept"); exit(1); } continue; } break; } と、書いてみたのですが、 acceptの正しいエラー処理がわかりません。 どのような処理を施せばよいでしょうか。
acceptの挙動はOSにより異なる。 というか、なぜ正しくないと思ったの?
定石を知りたいだけだろ
273 :
デフォルトの名無しさん :04/12/22 23:22:36
UDPのサーバープログラムで、データを送ってきた端末のIPを特定するのは、 何の関数を使えばできるのでしょうか? 結構いろいろ調べてみたのですが、わかりませんでした。 宜しくお願い致します。
そういうのはきちんと学んでいれば当然知ってるはずなので、 断片的・場当たりに検索してすませるんじゃなくて ちゃんと解説した本を買って通読するのを強く勧める。 きっと間違えてる部分や解決したつもりで穴になってる部分が沢山あるだろう。
>>273 UNIX なら recvfrom の引数 (struct sockaddr *)。Windows は知らん。
>>274 このスレの存在意義ないじゃん。
説教厨うざい。
まぁ、基礎的な亊がNGって言っても ここで高度な亊聞いても、誰も答えられないじゃん。
高度なことって?
>>278 > 亊
なぜ俗字? (旧字じゃないよね?)
バカにつける薬なし。
必要な知識は質問されるとは限らないってことがわからないということは、
>>275 は人を使った経験はないのだろうな。
冬休みが終わるまではどうにもならないよこのスレ。
最高言語RubyこそUNIX精神の欠如です。
>>280 「基礎的な事」をNGワードにしている奴がいるかもしれないから。
それをわざわざ回避するほどの内容じゃないと思うが。
>>282 > 必要な知識は質問されるとは限らないってことがわからないということは、
必要な知識は、必要になったときに身につくもの (基礎知識が
備わってれば)。
おまいさんがわざわざ質問者のためを思って勉強の機会を作って
やる必要はない。答えたくないなら黙ってろ。ウゼー
UDP使うのにrecvfrom()使うだろ。 パラメータも知らないでどうするよ?って事だろ。
recvfrom じゃなくて recv 使ってるとか。 C 以外で recv ってるとか (perl なんかは戻り値で返される)。 まぁ推測でしかないけどね。
多くのケースで端末のIPアドレスじゃなくて先方のrouterのIPアドレスしか得られません、 どうすればいいんですか、とかそういう釣りだろ。
287は基礎知識が備わってればってので逃げを打ってるつもりかも知れないけど、 recvfromの引数の意味を知らん奴にそれを期待するのは無理があるような。 273のような質問者に対して当然指摘すべき注意もしてないし。 自分も場当たりな寄せ集め知識だけで生きてきたもんだから 自分が攻撃されたように感じて慌てて飛び出したって感じがするな。
基本的に入門者に必要なのはキッカケ。 全くネットワークプログラミングをやった事無い人が、突然UDPでコードを書く時に キッカケとなる知識を得ないと不安でしょうがなくなる。どんなに簡単な事でもね・・・ その最初のキッカケがrecvfrom()の引数だったか、WinSockの初期化だったかは人によるだろうけど・・・ 素質の有る人は、そのキッカケさえつかめば自力で知識を蓄積していけるよ。 俺も、昔聞いたさ 「DirectXの*.xファイルを読み込んで表示するにはどうすれば良いんですか?」 そんな俺も今や3Dエンジンを組むプロだよ。
293 :
デフォルトの名無しさん :04/12/23 10:41:55
>>10 クックロビン音頭が消えてるんですが、どなたか補完お願いします。
294 :
デフォルトの名無しさん :04/12/23 22:22:43
whoisサーバーの仕様書を日本語でかいてあるのを おしえて!!!!!!!!!1
英語くらい読もうね
[Shift] キーくらい最後まで押そうね
298 :
デフォルトの名無しさん :04/12/24 00:21:48
P2Pで相互で送受信(非同期の通信)を行うプログラムなのですが、 このような場合、送信のソケットと受信のソケットを 別々に持つ必要があるのですか? 初歩的な質問で申し訳ございません。
ソケットは双方向通信。片方shutdown()するまでは。
300 :
298 :04/12/24 00:46:24
BeginReceive()とBeginSend()が同時に使えるということでしょうか?
301 :
デフォルトの名無しさん :04/12/24 02:00:13
1つのソケットでsendもreceiveもできる。電話と一緒。 電話機=ソケット
ソケットはプログラムインタフェースで、送受できると規定しているのはプロトコルだけどね。
BSDソケットはプログラミングモデルで、 socket()の帰り値を使って読み書きできます。
誰か翻訳してくれ。
305 :
デフォルトの名無しさん :04/12/24 12:27:41
BSD插座以程序編製模型,使用socket()的回來價?用讀寫來。
中文なら中文でもいいが意味のわかるまともな文章にすれ。
A BSD socket can be written by the programming model using the return value of socket().
BSD ???????? ???, socket()? ???? ??? ?? ?? ? ? ????.
BSD Socket is a programming model with which you can send or receive data, using an object - called socket - returned by socket() function call.
310 :
デフォルトの名無しさん :04/12/24 21:20:41
|l |l l |l | |i |i l |i l| li | ∩ _,,..,,n,r'゙ <⌒つ ./ ゚ 3 ヽ )´ ) l ゚ ll ∩ ノ そ Σ `'ー---‐'' ( ⌒ヽ/V⌒v、/⌒ ビダァァァン!! _,,..,,,,_ ./ ゚ 3 `ヽーっ l ゚ ll ⊃ ⌒_つ `'ー---‐'''''"
311 :
デフォルトの名無しさん :04/12/25 02:38:35
質問です。 Windows、VC++ において、ネットワークプログラミングを解説している本、 またはサイトはありませんでしょうか? UNIX における C言語を用いたネットワークプログラミングなどはよく見かけますが、 例えばポートを監視するとき、while 文でまわす代わりに SetTimer などを使ってメッセージ処理をしないのか、とか、 ファイル入出力を扱うのに CFile があるように、 ソケットを扱う便利なクラスはないのか、などといった疑問が残っており、悩んでいます。
重複I/O使えよ・・・
スレッド複数回すのがイマ風かと思われ。 acceptの再にスレッド起動、クライアント切断時にスレッド終了
>>312-314 それらの単語でぐぐったら、知りたい情報がいろいろと出てきました。
ありがとうございます。
>>313 んなこたーない。J2SE 1.4にNIOが加えられた必然性は何?
マルチスレッドで正確に作る難易度の方が低いとは思えない。
P2Pアプリ(ny,mx等)や、ネットゲームのほとんどは、 ルータに任意(もしくは指定された)ポートを空ける必要が あるかと思います。 これは、クライアントPC(ローカルPC)で起動している、 アプリ(P2P,ネットゲーム)が空けているポートと一致させる 必要があります。 で、この空けているポートですが、なぜ、空ける必要が あるのでしょうか? 下に続く...。
前振りが長くなってすみません。 他のPC上で動作しているアプリと通信するために、 ポートを空けることは分かっています。 ...ここまで書いて申し訳ないのですが、 P2Pはこの話からはずしてください。 ネットゲームもしくは、C/S形式のアプリに限定させてください。 下に続く...。
終了。
C/Sシステムで、以下のような手順を踏んで、 通信経路を確立すれば、ルータにポートを開ける 必要がないのではないのでしょうか? 1.クライトから、サーバへ接続要求する。 2.サーバはクライントに接続応答する。 上記、1,2で、クライントに待ち受けポートが 出来上がると思います。 この、勝手に出来る(?)ポートで、通信を行えば、 よいかとおもうのです。 確かに、この勝手に出来る(?)ポートは、 ルータでポートを開ける必要があるのですが、 これは、ルータの設定次第ですが、勝手にポートが 開くと思います。 しかしなぜ、ネットゲーム等は、固定のポートを あける必要があるのでしょうか?
長いから要約してくれ
UDP hole punching のことを言ってるんだと思う。
質問の仕方が下手ですね。すみなせん。 例えば、winny2であれば、自分のIP&Portを 他のwinny2ユーザに教えますよね。 (教えなくても使えますが...。) これは、他のユーザ(IP&Portを教えてもらった方)が、 教えてもらったIP&Portに対して接続を行い、 ファイル検索&ファイル転送を行うために使用される為だと 思います。 言い換えれば、 『IP&Portを公開しているwinny2ユーザがサーバとなり、 公開さしているIP&Portに他のwinny2ユーザが接続することで 他のwinny2ユーザがクライアントとなり、ファイルを共有する。』 ※話は変わりますが、ここまで書いていて思ったのですが、 P2Pとは、 「ネットワークに接続されている何れのノードもサーバになりえる」 ということなのでは? となるかと思います。 下に続く...。
誤字が多くてすみません。
1行目:…すみなせん。⇒すみません。
7行目:…使用される為だと⇒使用される物だと
11行目:…公開さしている⇒公開している
以下、続き。
>>323 で書いている内容が間違っていなければ、
『ネットワークを介して他のノードから接続を
受けるようなアプリは、サーバとしての
位置付けが要求されるような場合』
となります。
だとすれば、なぜ、世にあるネットゲームは、
ポートを開ける(≒サーバになる)必要があるのでしょうか?
長くなってすみません。で、TCP/IP接続での話です。
>>316 非同期I/Oは、10Kスレッド問題を回避するのが最も大きな目的でしょう?
作る容易さのためじゃないと思うよ。実際デバッガは非同期I/Oの相手が苦手。
>>325 一度でも、クライアントサーバやP2Pのソフト作ってみればわかるよ
>1.クライトから、サーバへ接続要求する。 >2.サーバはクライントに接続応答する。 >上記、1,2で、クライントに待ち受けポートが出来上がると思います。
>>327 作ったことありますよ。
その上でのことです。
質問ですが、端的にいうと、
『なぜ、クライアント側が待ち受け専用ポートを作る必要があるのか?』
~~~~~~~~~~~~~~~~
『専用ポート』が重要なのです。
>>328 にもあるとおり、クライアントとサーバへ接続が確立されれば、
クライアント側にもポートができあげる。そのポートを使って、
データの受信を行えばよいと思うのです。
"~"の位置がずれました。書き直します。
>>327 作ったことありますよ。
その上でのことです。
質問ですが、端的にいうと、
『なぜ、クライアント側が待ち受け専用ポートを作る必要があるのか?』
~~~~~~~~~~~~~~~~
『専用ポート』が重要なのです。
>>328 にもあるとおり、クライアントとサーバへ接続が確立されれば、
クライアント側にもポートができあげる。そのポートを使って、
データの受信を行えばよいと思うのです。
>>330 書いたプログラムも不必要な再送ロジックばかりの人。
>>330 専用ポートの要らない実装も十分考えられるし、実際にあるんじゃない?
ただ、コマンド・レスポンス的に行われるサーバとの対話と別チャネルでサーバ側から
一方的な通知を行おうとすると、1本のチャネル上に仮想的に複数チャネルを構築するより、
受信専用ポートで通知を受けたほうが楽だから使ってるんでは?
あと世にあるネットワークゲームはサーバ・クライアント間でTCP/IPでコネクション張って、
って風には作ってないものも多いと思う。実際にやってみたならわかると思うけど、UDPも
結構ちゃんと届くことが多いし、その場合やっぱりTCPよりずいぶんリソース的に軽いから。
>これは、ルータの設定次第ですが、勝手にポートが開くと思います。
自分で勝手に想定した脳内仕様にそぐわないなら、普通は脳内仕様を疑うもんだが。
>>331 「再送ロジック」とはどんなロジックですか?
>>333 ほんとに作ったことあるよ。
クライアント:Flash(XMLソケット)
サーバ :Java(NIO)
>>335 自分の考えを疑ったのですが、答えが出ませんでした。
何か解っていることがあれば、教えてください。
>ただ、コマンド・レスポンス的に行われるサーバとの対話と
>別チャネルでサーバ側から一方的な通知を行おうとすると、
>1本のチャネル上に仮想的に複数チャネルを構築するより、
>受信専用ポートで通知を受けたほうが楽だから使ってるんでは?
こういうレスがほしいです。
>>336 ポート開けて個々のPCがサーバとして(というと語弊あるが)しないと
1つのサーバで全てのクライアントのファイル転送やったと考えたら
どんだけ太い回線でも辛いだろ
僕が満足するような議論はできないようですね。 バイバイ。
>>337 そのとおりだと思います。また、回線速度だけではなく、
1.クライアントAからサーバに共有ファイルをアップ。
2.クライアントBがサーバから共有ファイルを落とす。
となった場合、サーバへの負荷も考えると、直接、
クライアント同士(A、B)がやり取りする方がよいと思います。
しかし、それは、P2Pアプリ(winny2等)の場合だと思います。
>>332 にある、
『コマンド・レスポンス的に行われるサーバとの対話』
には、受信専用ポートは必要ないと思うのです。
なぜ、クライアントからサーバへ接続する際に出来上がる、
ポートだけで通信を行わないのでしょうか?
⇒言い換えれば、どうしてサーバからクライアントに
対して接続を行う必要があるのでしょうか?
ポート開けるのはクライアント同士が接続してるだけだ
自分の思い込みと客観的根拠を区別できない奴だな。
調べてて、こんなのを見つけました。
>たとえばユーザAとユーザBがアクションゲームのような
>即時性が要求されるゲームをしたとします。
>通常の場合、ユーザBはユーザAの状態をサーバを通して
>知ることになります。
>サーバを通過する必要があるということは、
>そこで遅延が発生する事になります。
>ユーザAが必殺技でユーザBを倒したはずなのに遅延の影響で
>逆にユーザBに倒された、なんてことがあるかもしれません。
>仮にゲーム情報がユーザAとユーザAでP2Pでやり取りできれば
>ユーザ間の情報の遅延が少なくなり、このような即時性が
>要求されるゲームは作りやすくなると思えます。
(
ttp://homepage3.nifty.com/toremoro/p2p/trend2.html から抜粋)
こういうことなら解ります。
各ユーザ(クライアント)がポートを開ける必要がある。
他にある?
>>343 ぎゃー、ほやで何回も言ってるやん。
説明が下手なんかな〜。
『コマンド・レスポンス的なネットゲームを作ろうとした場合、
・サーバ :クライアントからの接続要求を受けるポート
・クライアント:サーバとの接続が確立された際に作成されるポート
で、十分だと思う。
(クライアント側のサーバとの接続が確立された際に作成されるポートで
サーバ⇒クライアントのデータは受信できる。)
しかし、世のネットゲームは、上記のポート以外にクライアント側が
他のノードから接続できるようなポートを準備しているがそれはどうして?』
って聞いてるんやん。
ネットゲームってあんまりせんけど、してる人ってこいうの疑問に思わないん?
訳も解らず、ルータのポート開けてるん?
訳も解らず、ネトゲーのアプリインストールしてるん?
訳も解らず、質問してる俺は、アホー?
訳も解らず、ドンキに火つけてるのは誰や!!
訳も解らず、ドンキは警察に怒られてるのはどういうことや!!
火付けたやつが悪いんや!!そんなんあたり前や!!
っと、思うよ〜。
あと、訳解らんレス大杉。
おまいこそ自分の脳内仕様に抜けがあるとなぜ疑わないのか。
冬ボーは放置の方向で。
なんで大阪弁なのよ?
>>345 だから、それを教えて欲しいって言ってるやん。
な〜、教えて。どこが抜けてるん?
な〜、教えて。
はっ、は〜ん、さてはおまえも解らんのやな〜。
って煽ってもムダなん?
>>346 王選手を超えた?ってそんなんじゃなくて、
そんなんじゃなくて、教えて。馬鹿なら馬鹿でいいから。
解ってるから、そんな風に言ってるんやろ?
なら、オシエテー。
>>347 はぁ〜、寂しいなぁ〜。自分、そんなん言われたら、
かなり寂しいよ。
>>348 かしこまった言い方が面倒になった。
ってか、解ってるやついるんなら、答えて欲しんやけど。
351 :
デフォルトの名無しさん :04/12/27 17:42:04
108番目で不吉だからageよう
>>344 P2Pでなくて、中央のサーバ噛ますネットゲームなのに、なぜ
クライアント側がポートに穴開けなければいけないの?ってことだよね?
>>352 そう。そうやねん。まさしく、そういうことやねん。
なんでなん?
>>353 お前がだまっとれや
「ポートなんか開けなくても、50万人が同時にプレイするゲームだと サーバーが50万個のコネクションを維持すれば良いだけだろ?」 と言っているようです。
>>354 俺ネットゲーやったことないからそこまで分からん。そのゲームの仕様で、
P2Pを使うこともあるからじゃないのかな?発売元に問い合わせてみたら。
一切P2P使わないゲームで中央サーバが一括管理してるならポートに穴
開ける必要は無い。クライアント側(プレイヤー側)は、中央サーバに接続しに
いけばいいだけだから。
実際にそのネットゲーやってファイアウォールのログとか パケットキャプチャとかで何やってるか観察してみりゃいいじゃん。
囲碁とか将棋なんかはポート開けないのが多いよね。 Javaアプレットだったりするし。
>357 だって、サーバー側からの「何かが起こったよ」という通知はどうするのさ。 クライアント側から張ったTCPのコネクションを維持するか サーバー側からUDPorTCPでクライアント側にデータを送信するかしかないのに。 ポートを開けない=後者のやり方は不可能なんだから 「全ユーザーとのセッションを維持しつづける」以外にどうしろと。
>>355 やっと
>>350 が何を言ってるのかが解った。
このままでは気になって夜しか寝られないところだった。
冬休みは既に始まっている、というのはよく分かった。 支離滅裂な日本語を解読するための、無駄な労力を使おうなんて思わないし。
>>355 いい。こういうの待ってました。
>>360 このレスもいいね。すごくうれしい。
2つをまとめると、
『サーバ側でたくさんのコネクションを保持しつづけるのは
厳しい。だから、クライアントからのコネクションを
保持し続けずに、サーバ側からクライアント側に何かを
伝えるためにクライアント側に口を開けてもらっておいて、
サーバ側からその口に向かってデータを送信する。』
ってこねやね。
ここで気になるのは、
『サーバ側がクライアント側にデータを送信する際、
毎回、接続を確立する必要がある。』
やねん。これって、時間かかるんとちゃうの?
>>356 そうやねん。俺もそう思ったん。でも、↑のことが
問題らしい。
>>358 実際のネットゲームはした事ない。
したいと思えない。でも、仕組みは気になる。
言い訳やね。でも、ログみても俺には分からんと思う。
あ〜、これも言い訳やね。ごめん。
>>357 お前は誰やねん?トリップつけたろ。
いややね〜、成りすまし。あ〜いや。サブイボでてくるわ。
> 『サーバ側がクライアント側にデータを送信する際、 > 毎回、接続を確立する必要がある。』 UDPなら(少なくとも毎回は)やらなくてもOK。 漏れ小規模にUDPのクライアントを抱えるサーバを運用してるけど、 そこそこちゃんと届くからちゃんと作ればやっぱりTCPより効率良いよ。 少なくともサーバ側リソースという観点では。
>>362 >>363 すんませんね。説明、わかり難かった?
これからは、気をつけますね。
でも、ま〜、分かったんならええやん。な、ええやろ。
>>365 良いよ。これも大変良い。
俺、UDPって使ったことないから、よう知らんのやけど、
やっぱ、TCPより軽いんやね。
と、
>>365 を読んでいてまた疑問が沸いてきたわ。
>>364 でも書いたけど、サーバ側でクライアント側からの
接続を保持しつづけないとしたら、
クライアント⇒サーバ
へのデータ送信も毎回、クライアントからサーバへコネクションを張ってるん?
(UDPはコネクションを張らなくてもいいことは今、教わったから分かってる。)
もし、この脳内仕様(←この言葉気に入ったから使わせてもらうわ)が正しければ、
俺がずーっと質問していた、クライアント側にポートを開ける必要のあるネトゲーは、
クライアント⇔サーバ間の通信はTCPではなく、UDPを使うってことになると
思うやけど、おうてますか?
>>366 あっていない。
UDPではなくTCPのポート開けるように求めているゲームがあるだろ。
365はどうでもいいけど、サーバで多数のコネクションを保持するのって どれくらい負担なんでしょうか。 起動できるワーカープロセス数(W) ワーカープロセス当たりのTCPに使える最大デスクリプタ数(D) から単純に計算すると W*D ですが、 OSが保持できるコネクションの数(C)に制限はあるのかな? カーネルでTCPに利用できるメモリ量(M) コネクションあたりのカーネルのメモリ使用量(m)として、最大同時接続数は max(C,W*D,M/m) ってところでしょうか? ネトゲのサーバとかって大体一台で最大同時接続数をいくつくらい受けつける ようになってるものなんでしょう(アクセラレータを抜きにして)。
>>366 UDPで何か作ったことあるならわかると思うけど、単一のUDPパケットでは送れないような
(あるいは送りたくないような)データを送る最も単純な方法は、TCPを使うことなわけ。
もちろん「何らかの自前プロトコル over UDP」でもいいんだけど、たまにしかこういうことが
起きないとするならほんの少しの効率の低下を受け入れてTCPを使っても良いわけだし、
TCPは既に実装されていて、バグフリーでタダで使える。
世界一大規模に使われている分散DBであるところのDNSプロトコルもそうしている。
>>369 おい、DNSはTCPも定義されているけど、(domain=53)
使われているのは事実上UDPのみだ。
>>371 うん。だから
>たまにしかこういうことが起きないとするなら
と書いてるわけ。
あ、でもDNSの場合はinboundのTCPは使わないか・・・
>>372 そもそも何言っているのか知る気を起こさせない文章(369)だが、
> TCPは既に実装されていて、バグフリーでタダで使える。
これも問題だな。
>>374 374の使ってるOSでは既存のTCPプロトコルスタックに(既知の)バグがあったり、
既存のがなくて自前で工数かけて実装する必要があったりするわけ?
374ではないが わけもわからずバグフリーってのはどうかと。 いやバグは無いだろうねバグは。 ただこういうこと言うやつって 自分自身がバグだったりする例が多いんだよね。 UDPにはないTCPの特性や状態遷移図くらいはわかっているとか ならいいけどね。それもわからずに闇雲にTCPはバグフリーというのは どうかな?とは思う。 そうは言っても、素人はTCP使えば?ってのはあたっているが。
バグかどうかわかるくらいTCPがわかっているのか? ということだよ。
>>381 意味がわからない
全てのプロトコルやレイヤーを熟知していないとネットワークプログラミングを
するなという事か?
>>382 いや、知らないでもできるよ。
だから素人はTCP使えって言ってる。
ただトラブルがあったときに対処不能だろ。
素人や学生のプログラムならそれでもいいが
実際に金をもらってコード書いている立場だと、
「対処できません」っていえないけどな。
>>368 の疑問に参考になりそうな数字がWinsockFAQに出ていたような気がするんだけど
なんか今繋がらない。
確か、IOCPを使って2-3万とかだったような気がする。
で、BSD socketでも(実装に依るだろうけど)Winsockとそう極端には変わらないんじゃないかと。
違っても1/3とか3倍とかその程度じゃないかと。
それより、マルチプロセスやマルチスレッドだと
そっちのリソースの制限の方がきつそうだから
必然的にselectを使うことになって
この規模だとselectの非効率性も問題になるような。
で、互換性のない拡張に頼ることに。
369 は「おまいが UDP に順序保証機能や再送機能なんかをつけるより、 枯れている TCP を使った方がなんぼか信頼性の高いものがでない」という 意味で言ったことは明らかだろ。ただしこの場合、「バグフリー」という言葉は 不適切だが。 で、376 は「TCP のバグ」っていうのが気にいらなかったんだろ。「TCP のバグだ」 なんて言うやつは、大抵自分が勘違いしていることがほとんどだ、と 376 の言うことはそれはそれで正しい。でも、全然話の流れと関係ない。 このスレで「TCP にバグがある」なんて誰も言ってないじゃん。
> UDP に順序保証機能や再送機能 またこのネタやってんのかw アホかお前らww
>>385 まあ、なんどかくぐったよ。
>>387 俺もバグが有るなんていっていなかったと思ったが。
まあ、話の流れも知らんで噛み付いた俺も悪いが。
いや〜。うれしいね。何がうれしいって、
"みんな、考えてくれてる"
ってのがひしひしと伝わってくる。
思い込みかも知れんけど、うれしい。
最初は、全く相手にされへんかったけど。
(ま〜、説明が下手だったからかなぁ〜)
途中(
>>369-389 )、難しいそうな話が話があったけど、
半分も分からんかったかな。
分かった範囲でめっちゃ簡単にまとめると、
TCP…初心者向け。なんでかって言うと、いろんなことを
プロトコル(下位階層?)がやってくれるから。
いろんなことって言うのは、送ったデータ(パケット?)が
相手にちゃんと届いてるとか、とか、とか。
⇒初心者向けっていうか、作りやすい、って感じかな?
UDP…玄人向け。なんでかって言うと、いろんなことを
プロトコル(下位階層?)がやってくれないから。
だから、独自プロトコル(順序保証機能や再送機能)みたいなの
を考えなくちゃいけないから。
⇒結局、独自プロトコル(順序保証機能や再送機能)をすると、
UDPの"軽い"っていう長所がなくなってしまうと思うけど。
って感じなんかな?
続く...。
順序保証機能や再送機能が不要な場合UDPで、 必要ならTCP使えばいいってだけのことだろ。 特に新しい物を作らないのであれば。
UDPの使用を考えるならこういう場面かな? 1.上位のプロトコル自身が要求&応答というシーケンスになっている。 (UDPの到達確認や順序保障が無くても関係なし) 例:DNS, DHCPなど 2.どうせ繰り返し送るので、抜けたって泣かない。 例:RIP, NBT 3.ブロードキャストが普通だったりする。 例:RIP, NBT 4.抜けたからって再送されてももう遅い。 例:リアルタイムストリームのビデオや音声(RTP? 自信なさげ) くらいかな?だれか補足して。
5.UDP hole punching
>>370 読んだ。
これって、わざわざ探してきてくれたん?
そんなわけないか...。でも、参考になった。
ありがとう。
で、読んだのですが、も〜、何がなんだか...。
CaseByCaseで
UDPorTCP&サーバorクライアントがポート開く
を組み合わせて使う。
って感じなんかな?
あかんわ、全然、解決しとらん。
そもそも、最初は、
『なんで、クライアント側が口あけとかんと駄目なん?』
だった。で、この時点では、クライアントがTCPorUDPの
どっちの口かは問題にしてなかった。
で、クライアントのあける口がUDPであれば、
サーバ側もUDPの口あけてやって通信する。
こうすれば、サーバ側で沢山の接続を維持しなくても
よくなる。(TCPであれば、維持し続けなくてはいけないから。)
って、おもった。
続く...。
>>394 しばらく書き込み止めて勉強してくれ。まじで。
>>394 なんとゆーか、勉強熱心なのは感心なのだが、、、
君の問い掛けはネットワークの基礎知識であって、
ネットワークプログラミングとは関係無いと思うのだが。。。
397 :
いややね、なりすまし ◆ztMasRA.j2 :04/12/28 00:56:50
でも、
>>376 ですわ。
これが問題なん。
サーバが維持する接続をなくしたい
↓
クライアントが接続を維持する必要のないUDPの口を開ける
が、俺の書いた絵なんやけど、
>>376 で
この絵は駄目になったん。
サーバが口を開けて待ってるところへ、
クライアントが接続して、その接続を
サーバが維持(保持?)する。
ってのと、
クライアントが口を開けて待ってるとことへ、
サーバが接続して、その接続を
サーバが維持(保持?)する。
ってのは、サーバ負荷(維持(保持?)及び監視する)ということでは、
同じなのではと思ってまう。
多分、この部分がおかしい、ってか分かって
ないんやと思うんやけど、そやろ?
>>397 その答えはかなり前に答えが書かれてる。
人の話を聞く気が無いなら質問するな。
通信は糸電話みたいなもんだと思いなよ。 待ち受ける方は糸の繋がった紙コップを持って待ち構えてなきゃいけない。 繋ぐ方は自分の紙コップから延びた糸をそこに繋ぐイメージ。 サーバがポートを開けて待つのだったら、サーバは物凄く大量の紙コップを 持ってなきゃいけない。 一方、クライアントがポートを開けて待っていれば、サーバは紙コップを 1個だけ持ってて、必要な時に必要な相手の糸に繋ぐだけ。やりとりが 終わったら糸を切ればいい。
>>395 あのな、自分、もし、学校のセンセにそんな風に
いわれたら、ヘコムやろ。絶対、ヘコムわ。
あ〜、悲しいなぁ〜。そんな言い方は悲しい。マジで。
>>396 そやろ、僕、勉強熱心やねん。だから、教えて欲しいの。
厨房でもなんでもいいから、知りたいねん。
センセ、教えてください。m(_ _)m
>>400 お前、頭悪すぎだ。どうしようもないクズだ。
お前は聞く耳を持たん厨房でみんな迷惑しとるんやから二度とここに来んな。 ネットワーク“プログラミング”の話題ができるようになったら来い。 あとなぁ、公共の場で方言使うな。同じ関西人としてめっちゃウザい。 関西人がみんなお前みたいな奴やと思われたら迷惑じゃ。
まあ馬鹿と天才は紙一重と言うしな ここまでのやりとり見ると馬鹿のほうだが
教えて厨と勉強熱心とは違うんだけどな。 勉強熱心じゃない人間にはそれが理解できないという、 まあよくあるメタ認知の問題だね。
>>398 すんません。言われるまで気付きませんでした。
>>368 ,386
のやり取りのことやね。ホント、すんません。
で、それを分かりやすく説明してくだれたのが、
>>399 ですね。
ホント、すんません。
ということで、疑問は全て解決しました。
はぁ〜、ホント、みなさん、すんませんでした。
で、ホント、ありがとう。
>>401 そやね。そう思われても、しゃーないね。
>>368 ,386を見逃してる時点でアホ確定ですわ。
>>402 『聞く耳もたん厨房』かぁ〜。
そやね、それもしゃーないね。
やっぱり、
>>368 ,386を見逃して、
>>397 の質問する時点で
アホ確定ですね。
あと、心配せんといて。俺、関西人やないから。
>>403 どう、ちょっとは、天才の方に傾いたやろか?
>>404 またまた、厳しいなご指摘やな〜。お〜コワッ。
俺みたいな厨房の分かりにくい文章を読んで、考えて、意見してくれて
叩いてくれて、ホント、みなさん、ありがとう。
相手してもらってうれしかったわぁ〜。
ほな、まいどさ〜ん。
かまってちゃんキタ━━━━(゚∀゚)━━━━ !!!!!
407 :
デフォルトの名無しさん :04/12/28 09:37:03
保守
さすがネットワークプログラミングスレ 電波さんも一味違うな
マジネタにはスルーで電波で盛り上がりか。 2chらしいな
電波は文章が長いから他が埋もれる…
>>405 あ、やべ。初めてウザさを感じた。
関西人じゃないってとこに。
あの不自然な関西弁見たら、関西人じゃない事まるわかりだと思うぞ。
>>408-412 うわ〜、[いややね、なりすまし ◆ztMasRA.j2]のこと、
まだ引きづってるやつがいるよ。
サムッ!!
コワッ!!
ここは、そんなこと書き込むところじゃないよ?
大丈夫?
特に君、
>>409 君のことだよ。
そんなこと言ってあんたが、一番盛り上がってますから〜
残念、電波より無知なのはあんたですから〜 切り!!
m9(^Д^)プギャーーーッ
引き鶴?
引き鶴
非木津留
非木留奈
ぴきとぅる
七尾奈留
420 :
デフォルトの名無しさん :04/12/30 06:56:01
質問です。 今一般的に使われてるDSLなどの環境でTCP接続をした場合 その通信速度は、AGPなどPCのバス速度の何分の一くらいまで下がっちゃうんでしょうか? というのも、VNCのようなソフトの場合、15fpsも出ませんよね? 純粋に画像データだけだと、何fpsくらいでるのかな?
>>421 具体的に書きますと
とあるグラフィックソフトを開発してまして…
複数のリモートComputerで分散処理して、そのレンダリング結果を出力するようなのを作りたいのです。
ただ、出来るだけリアルタイムで処理したいので、仮想グラフィックドライバを作りグラフィックボードと同じ感覚で扱えるようにしたいのです。
その時に、帰ってくるデータの転送速度はAGPと比べてどの程度ボトルネックが発生してしまうのかな? と
おまいはPCIやAGP(x1)の速度も調べる気はないのかね
>>422 今一般的に利用されてるAGP 4Xが1066MB/s(上下対称)
一般で利用されてるADSL回線8Mが実質3MB/sほど…(上下非対称)
…無理。
>>422 1280x1024x24bit色の非圧縮のBMPを作成すると
3.75 MB (3,932,214 バイト)
こんな感じ。
つまり、4MB/sの能力を持つ回線がベストの結果を返し続けたとしても
1秒間に1回しか画面の書き換えが出来ない。
実際には計算データをリモートコンピュータに転送しなければならないので、そちらに帯域を引きずられるからもっと酷い。
>>425 zlib圧縮をかけるともっと圧縮できるがね。
まぁ、現状のVNCを見ればどのような状況になるかはわかると思う。
VNCは画像の一部を更新しているのでは? というかリアルタイムのレンダリングをPCのCPUでするのもそもそもおかしい。 分散環境がベクトル機とかなら可能かもしれんが。 まぁ、LANでも無理でしょう。
428 :
デフォルトの名無しさん :04/12/30 08:35:37
おまいら根本的な発想が間違ってる。 レンダリングした画像は圧縮していいんだろ? だったらライブカメラでいいんだよ!! 実績がいくらでもあるじゃねーか。 mmorpgもこの方式でやってたとこあるしな。
>>422 > ただ、出来るだけリアルタイムで処理したいので、
> 仮想グラフィックドライバを作りグラフィックボードと同じ感覚で扱えるようにしたいのです。
描画形の独自プロトコロの方がいいと思ふ。
430 :
デフォルトの名無しさん :04/12/30 09:58:05
すいません。最近セキュリティ関連のを学び始めたのですが 認証(電子署名)って意味無くないですか? 「平文」と、平文を秘密鍵で暗号化した「暗号文」を送信して、 さらに「公開鍵」を送信して で、相手側は、暗号文を送られてきた公開鍵で複号して、その復号文と 平文を照合して正当性を確認するみたいですが、「平文」が改竄されただけ なら確かに改竄に気付きますが、「平文」「暗号文」「公開鍵」の3つともが 改竄されてしまったら何の意味もないように思えるのですが・・・ 例えば、平文を「偽の文」に改竄し、暗号文をその偽の文を偽公開鍵で 暗号化したものに改竄し、公開鍵をその偽公開鍵に改竄してしまえば 何も見破られる事なく改竄できるように思えるのですが・・・ 勘違いしてる点があったら教えてください。
431 :
デフォルトの名無しさん :04/12/30 10:01:08
すいません。最近セキュリティ関連のを学び始めたのですが 認証(電子署名)って意味無くないですか? 「平文」と、その平文を秘密鍵で暗号化した「暗号文」を送信して、 さらに「公開鍵」を送信して で、相手側は、暗号文を送られてきた公開鍵で複号して、その復号文と 平文を照合して正当性を確認するみたいですが、「平文」が改竄されただけ なら確かに改竄に気付きますが、「平文」「暗号文」「公開鍵」の3つともが 改竄されてしまったら何の意味もないように思えるのですが・・・ 例えば、平文を「偽の文」に改竄し、暗号文をその偽の文を偽秘密鍵で 暗号化したものに改竄し、公開鍵をその偽秘密鍵と対の偽公開鍵に 改竄してしまえば 何も見破られる事なく改竄できるように思えるのですが・・・ 勘違いしてる点があったら教えてください。
432 :
デフォルトの名無しさん :04/12/30 10:03:11
sslで公開鍵というと、ブラウザに埋め込まれているデータだろ。スパイウェアでも使わないと
( ゚д゚)ポカーン
電子認証局
>>431 それに対処するために公開鍵を権威ある認定サイト(例えばverisign)によって署名しとく。
438 :
◆eomKYEndr6 :04/12/31 10:33:56
ちょっとテスト
439 :
デフォルトの名無しさん :04/12/31 13:12:07
すいません。最近セキュリティ関連のを学び始めたのですが 認証(電子署名)って意味無くないですか? 「平文」と、その平文を秘密鍵で暗号化した「暗号文」を送信して、 さらに「公開鍵」を送信して で、相手側は、暗号文を送られてきた公開鍵で複号して、その復号文と 平文を照合して正当性を確認するみたいですが、「平文」が改竄されただけ なら確かに改竄に気付きますが、「平文」「暗号文」「公開鍵」の3つともが 改竄されてしまったら何の意味もないように思えるのですが・・・ 例えば、平文を「偽の文」に改竄し、暗号文をその偽の文を偽秘密鍵で 暗号化したものに改竄し、公開鍵をその偽秘密鍵と対の偽公開鍵に 改竄してしまえば 何も見破られる事なく改竄できるように思えるのですが・・・ 勘違いしてる点があったら教えてください。
440 :
デフォルトの名無しさん :04/12/31 13:29:12
sslで公開鍵というと、プラウザに埋め込まれているデータだろ。スバイウェアでも使わないと
>>440 板違いのコピペに答えてんじゃねーよ、この能無しプログラマが
( ゚д゚)ポカーン
>>439 釣りか ? 激しくウザイんだけどな。
まあ、一応マジレスしとく。
> で、相手側は、暗号文を送られてきた公開鍵で複号して、その復号文と
> 平文を照合して正当性を確認するみたいですが、
そもそも、改竄防止なら平文と MD5 とかのハッシュ値を送っておけばいい。
(受け側で MD5 計算して合ってれば改竄はないと思われる。)
> 例えば、平文を「偽の文」に改竄し、暗号文をその偽の文を偽秘密鍵で
> 暗号化したものに改竄し、公開鍵をその偽秘密鍵と対の偽公開鍵に
> 改竄してしまえば 何も見破られる事なく改竄できるように思えるのですが・・・
当たり前だ。
だから、公開鍵をどこから入手するかが問題となる。
ビジネスで使うなら VeriSign とかの認証局を使うのが普通だろうし、個人なら自分のホームページで直接公開するとかして公開鍵自体の改竄は防止しないと意味がない。
( ゚д゚)ポカーン
(ノ゚A゚)ノ
あらえっさっさ
来年もいい年でありますように。(^人^)パンパン。今のうちに、来年の占いでもしておこっと。 レスの一の位の数字で占う。 1:1部上場企業に就職内定 2:かわいい彼女ゲッツ! 3:ロト6の3等以上が当選 4:両親とも来年も健康 5:弟が第一志望の大学合格! 6:ダイエット成功!5キロ痩せれる! 7:来年(度)首席で卒業だぜ! 8:RX8が欲しい!来年こそ買える! 9:就職失敗。ヤクザの世界へ 0:登校中の駅のホームで誰かに線路に突き落とされ、ひき殺される。
>>445-449 あらあら、また言うだけ厨房のお出ましか...。
今年は、こういうやつが一人でも少なくなることを祈るよ。
「外してる」というか「空気が読めない」というか。 人間関係で苦労してそうだね。ご愁傷さま。
あっちゃー、新年早々「こういうやつ」がまた出てきたよ。 まあ、「外してる」とか「空気読めない」とかしか書けないんだったら、出てこなきゃいいのにね。 > 人間関係で苦労してそうだね。ご愁傷さま。 うん、君にはそういう苦労はないだろうね。 君の周りの人は知らんけどさ。(藁
じゃあ、周りを見ることが全然出来ない、協調性皆無のバカに教えてやろうか。
>>431-432 で、質問があった。
連投でうざいものの、
>>432-437 でちゃんとしたレスがある。
それを読まなかったのか、ただコピペしたのか、
再び
>>439 に同じ文章が書き込まれた。
今度は誰も相手にしなかった。
>>440 もコピペだ。
だが、唯一人、そんな状況を無視して
偉そうに、既に書き込まれているのと大差ない内容を書き込んだ奴が居る。
「マルチやコピペに回答するバカ」を笑っているだけさ。
456 :
デフォルトの名無しさん :05/01/01 03:18:08
スレが汚れるから消えろテイノウども
どっちもどっちだ。 コピペにわざわざ回答するのも間抜けではあるが、 それを突っ込む奴も、スレ汚しになるような煽りレス返さなくても良い。 「コピペにマジレス」位のわかりやすい方法でレスするのがベストだ。
まだやってんのか。
------------------------折り目------------------------
-・-・-・-・-・-・-・-・-・-・-・-・-・山折り・-・-・-・-・-・-・-・-・-・-・-・-・-
それ山折りだっけ?
ソケットでFTP接続を試みています。 サーバーへのログインは簡単にできたのですが、LISTコマンドによるファイル一覧取得ができません。 ためしにtelnetで以下のように打ち込んでいくと… > open サーバー名 21 < 220 以下略 > USER ユーザ名 < 331 Password required for ユーザ名. > PASS パスワード < 230 User ユーザ名 logged in. > TYPE A < 200 Type set to A. > PASV < 227 Entering Passive Mode > LIST / ここで何も表示されません。 FTPサーバーはProFTPDで、LISTコマンドには対応しています。 どういった問題が考えられますでしょうか?
PORTコマンドを使っていないから。 ftpコマンドのデバッグオプションを使ってみろ。
あっ、ごめん。パッシブモードか…。 EPSV EPSV ALL じゃ、だめ?
ftp -dでの出力を真似して、 > PORT 192,168,**,*,****,* < 200 PORT command successful. > NLST とやってみたけど、やはりここで応答がなくなります。
> EPSV < 500 not understood. といわれました。
あぁ、すまん。 もうひとつ端末を開いて、新しくできたソケットにtelnetでアクセスして。 それを読み取ったらOK
例を示すと、 >>> telnet ftp.netbsd.org 21 Trying 2001:4f8:4:7:2e0:81ff:fe21:6563... Connected to ftp.netbsd.org. Escape character is '^]'. 220 ftp.NetBSD.org FTP server (NetBSD-ftpd 20040809) ready. USER ftp ←打ち込み 331 Guest login ok, type your name as password. PASS ←適当なメールアドレスまたは空白。 230- The NetBSD Project FTP Server located in Redwood City, CA, USA (略) EPSV ←打ち込み 229 Entering Extended Passive Mode (|||62061|) ←この数字 ってなったら、telnet ftp.netbsd.org 62061とする。 でLISTコマンド。 PASVを使うときは PASV 227 Entering Passive Mode (204,152,190,13,236,3) ってなったら、前の4つがIP番号、後ろの二つがポート番号。 ポート番号は236 x 256 + 3 = 60419のように算出する。 で、telnet 204.152.190.13 60419でLISTの内容を読み取る。
なるほど!見事にできました!ありがとうございます。 今までPASVモードの意味がわからず適当にやってましたが、なんとなく意味がわかりました。 もう一個ソケットを作ってそちらで受信するという感じですかね。
>>470 いえ、FTPは常に別ソケットでデータを転送しますが、伝統的にはクライアント側が
ポートを開き、サーバー側からそのポートに接続してました。 しかしこれはファイアーウォール、
およびNATと相性が悪いのでPASV(受動)モードが作られ、このモードでは2つ目のポートを
サーバー側が開き、クライアント側からそこに接続してデータを受け取るようになったのです。
なんでFTPってそんな変な方式にしたんだろうな。 プロトコル毎に無理やり変化をつけて嫌がらせしてるとしか思えん。
嫌・が・ら・せ
制御用ポートを別に持つことによって、ファイル転送途中でもごにょごにょできるように するため。
通常FTPは同時接続人数を指定する。 だから、同時に接続出来るコネクション数で縛ろうとする。 しかし、これをすると、接続したユーザーはダウンロード中に別のファイルをダウンロードしたり、ディレクトリを移動出来なくなる。 それを防ぐ為?
FFFTPなどでやってみると分かるが、大きなファイルをダウンロード中でも ディレクトリを自由に移動できたりする。これは制御用ポートを別に持っているため。
すつもんれす。 ny使っててルータに穴が開けれないときとかに、 「Port0設定」ってするでしょ。 で、それはいいんだけど、ルータに穴が開けれない状態で、 「Port0設定」しなかったら、警告がでるじゃない。 あれって、どうやってnyは分かってるの? 何をもって、「このPCは外部から接続を許していませんよ」って 判断してるの? ね〜、どうやって?
実際に外から試すんじゃねーの。 ここはネットワークの仕組みじゃなくネットワークプログラミングのスレなんで 自分で作らない人はダウソ板で訊いてよね。
お前だろうが
とりあえず 割れてる奴には教えない、でFA?
ここはプログラマ板だから、ソフトウェアを作る側の集まりだ。 そこで割れ推奨ソフトの話題出されたら、どうなるかわかるだろ?
どうなるの?
↓次の方どーぞ。
ど杉尾エアpんtjリオゑpちぇ羽
質問です。 TCPはコネクション維持してる間、接続先に絶えずパケットを投げてると聞いたのですが それなら、ルーターのセッションが切れることは無いと思うんですが、ルーターにはセッション維持時間ってありますよね? あれは、同じIPアドレスへのパケット送信は一定時間を過ぎると出来なくする仕組みなんですか? それなら、データのsend()でデータを送った場合も途中で切れることになってしまうと思うんですが・・・・
>>487 > TCPはコネクション維持してる間、接続先に絶えずパケットを投げてると聞いたのですが
それデマ。
絶えずパケット投げてるとkeep aliveは全然違うだろ……。
「絶えずパケット投げる」とか定義できるの?
ttcp
>>489 うちの鯖製品はクライアントと長期に渡ってSSL接続をするのだがデータは10分に一回ぐらいしか
流れないのでNAT接続を切られないためにtcp keepaliveを1分ぐらいに設定している。
テキストファイルをアスキーモードでなくバイナリモードのFTPで転送することによる弊害があれば教えてください。
UNIX用のテキストファイルをWindowsに持ってきたときにメモ帳で読みにくい
>>495 何か弊害があるんじゃないかと心配になる。
>>496 ワードパッドやEclipseで開くけば大丈夫。
"プラウザ"について?
むしろプラウガの親戚と言いきってしまえ
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTIを読んでいるのですが この本では getaddrinfo に渡す第3引数 addrinfo のメンバ ai_family に AF_UNSPEC を代入しているのですが コンパイルが通らないし man では PF_UNSPEC と書いてあるのですがこれは間違いですか? 何か歴史的な理由があるのですか?教えてください
ttp://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/lame-list.html ここの間違いリスト20.の以下の記述、
>ブロック型ソケット、非ブロック型ソケットのどちらを使っているかに関わらず、
>send() または recv() の成功時に、その返却値と期待している値を比較するべきです。
を読んで以来、ブロッキングモードの場合でも、戻り値を見て、指定分より少なければ
再送信というコードを組んでいたが、.NETのSocket.Sendメソッドのドキュメントを読むと、
>コネクション指向のプロトコルを使用している場合、 Send は、バッファ内のすべてのバイトが
>送信されるまでブロックします。非ブロッキングモードでは、 Send が送信したバイト数が
>バッファ内のバイト数より小さくても、このメソッドは正常に完了します。
と書いてあった。試しに20MBのデータをブロッキングモードで一気に送ってみたら、時間は
掛かったが確かに20MBしっかり送信して戻り値が返ってきた。
気になってWinsock2のsendのドキュメントを読んでみると、
>If no buffer space is available within the transport system to hold the data
> to be transmitted, send will block unless the socket has been placed in
>nonblocking mode. On nonblocking stream oriented sockets, the number of
>bytes written can be between 1 and the requested length,
と書いてあり、バッファサイズがないときはブロックすると書いてはあるが、全てのバイトが
送信されるまでブロックされるか否かまでは言及していない。
.NETになってから仕様が変わったと考えていいのだろうか。
実装の挙動が変わるのと仕様が変わるのとは別だと思うぞ。 明記されない限り後のバージョンでもそのままとは限らない。
失敬。なので、.NETでは仕様が変わったと考えてもいいかも知れない。 ただ日本語版を根拠にすると後で困ることが往々にしてあるので 英語版の記述を確認しておく方がいいんじゃないだろうか。
確かに。英語版の記述をすぐに確認してみたところ、やはり同様のことが 書かれていました。 >If you are using a connection-oriented protocol, > Send will block until all of the bytes in the buffer are sent. > In nonblocking mode, Send may complete successfully even if > it sends less than the number of bytes in the buffer. 上記のような記述がありました。今少々余裕があるのでもう少し調べてみようと思います。
>>506 Javaのjava.io.OutputStreamみたいに、戻り値がvoidなら
自然な挙動だよね。もし、その仕様なくせにintを返してたら、
BSDソケットとの中途半端な違いで激しく紛らわしいと思う。
511 :
デフォルトの名無しさん :05/01/09 16:20:53
sghr
.NETのSocket.sendが指定バイト送り出すまでWin32のsendを 繰り返し呼び出してるだけだろ。
.NETのSocketはwinsockの単純なwrapperではないということじゃねえの?
>>474 あと、クライアント A から サーバー B から サーバー C への転送とかも指示できるようにするためでもある。
>>506 Windows2000では、ブロッキングソケットは送信完了までブロックする。
ただし、送信バッファが足りない場合、即時に-1を返す。
その場合GetLastErrorは0を返す。
一回のsend呼び出しで失敗しないサイズの上限は、
メインメモリの半分程度。
>>515 それって変な仕様だよなぁ。
send()って、バッファ分全部送らなくていいはずだから、
一回送れるだけ送って、そのサイズを返せばいいのに。
既存のお行儀のいいコードは、それを必要分繰り返す
作りになってるだろうし。初心者はFAQ嫁、と。
> それって変な仕様だよなぁ。 BSD socket的に? なんか言いがかりっぽい気が・・・
>>516 仕様じゃなく、振る舞いね。
-1返しといてGetLastErrorが0返すのは変。
ブロッキングソケットに対するsendが全データを送信するのは普通。
ただ、仕様にそう明記されてるわけじゃないから、問題がややこしくなってる。
>>517 バッファが足りない&どうしても送りたい時は、
小さくして再送するしかないわけだから、
遅れるだけ送ってくれてもいいような気がするわな。
それだと困るのは「バッファが足りないなら送って欲しくない時」って
ちょっと変った時だけだし。ただ、
> 一回のsend呼び出しで失敗しないサイズの上限は、
> メインメモリの半分程度。
これが確実ならどうでもいいと思うけど、仕様に書いてあるのかな?
仕様じゃないなら、再送ロジックを組まなきゃいけないのはBSDソケットと同じ。
けど、カーネル呼び出しを一回損している。
>>518 > ただ、仕様にそう明記されてるわけじゃないから、問題がややこしくなってる。
明記されてないのか。じゃあ再送ロジック書く必要があって、
BSDソケットとは別のやり方なんだ。
俺はBSDソケットの仕様の方が素直だと思う。
送信バッファが足りないって理由じゃあきらめない、
のであれば、それはそれで一つの見識(やり方)だと思うけど。
環境、Windows2000 Professionalで、SPの詳細は分かりませんが常にパッチ当ててるので最新です。
>>519 > これが確実ならどうでもいいと思うけど、仕様に書いてあるのかな?
振る舞いでつ
>>520 WinSockはBSDのコードをベースにしてるから、
BSD Socketと同じ振る舞いをする前提で書くのが普通。
送信バッファって仕様に現れるものなの? BSD SocketのAPI的にはバッファの存在は仮定してない気がするんですが... > BSD Socketと同じ振る舞いをする 振る舞いって誰が決めてるんですか?
>>523 > WinSockはBSDのコードをベースにしてるから、
うそだよ。ベースにしているのは仕様。
>>518 Undocumentedなら、振る舞いだね。
Winsockは詳しくないのでどうでもいいです。
send()がバッファ分全部送るまで復帰しないとなると、
送信キューと専用スレッドみたいなのは作れなくない?
送信データ作成 -> 送信スレッドにエンキュー
送信データ受信 -> 送信可能ソケットなら送信
みたいな感じで、送信スレッドを共有する奴。
こんな作りのアプリがあるのかは知らないけどな。
>>526 スレッド間で共有できる領域を作る。
送信スレッドはsendする前に自前でバッファ持っといて共有領域からコピー、その後sendする。
「振る舞い」を「仕様外の振る舞い」って意味で使うのは変った用法だね。
s/変った/変わった/
>>524 BSD SocketなんだからおとなしくBSDの流儀に従うのが筋。
.NETでの話なんですが、作ってるサーバに接続してくるクライアントが せいぜい4〜5件程度で、selectするのが面倒なんで各クライアントのSocket クラスのPollをそれぞれ呼び出してるんですけど行儀悪いんですかね?
>せいぜい4〜5件程度 全く全然これっぽっちも問題ない
それどころかselectがなくてpollだけっていうOS無かったっけ? SystemV系のUnixだったか?
>>526 non-blocking socket使う。
>>531 > それは、たまたま手元の実験結果ではそうだった、という以上の意味は何も無
> いと思うけど。
重要なのはそこじゃない。
もしそれが仕様だとしても、思い通りの振る舞いは期待できない。
OSのメモリ割り当て処理をロックできるんなら話は別だけど。
重要なのは、ブロッキングソケットのsendがデータを送信してないのに
戻ってくることがあるってこと。
あれこれ見てみたけど、Winsockで巨大バッファを send したい場合には SO_SNDBUF で 0 指定しとくのが良さそうですね・・・
TCP使った.NETのサーバのパフォーマンスってどんなもんなんだろう・・・ 同一スペックのマシンでLinux+GCC, Java, Win32+C++, .NET+C#でベンチ取った結果ってないのかな。
>>527 んにゃ。
送信待ち行列中にあるソケットを送信側の状態でポーリングして、
送信可能になったデータを適宜送信するスレッドなんで、ひとつでも
送信がブロックされると困るって状態さ。
全部送りきれなかったら再度キューに突っ込んで、送信可能状態に
なるまで待つって感じで。
そっか。他の多重化手法を使えってことか。。
>>532 何だっていいと思うけど、.NETのSelect()、簡単じゃない?
542 :
デフォルトの名無しさん :05/01/12 18:35:15
例のUDPで10054のエラーが発生すると 以後、そのソケットは機能しなくなる win2KのバグですがXPでも発生します? そもそもUDPで10054自体納得できないですが・・・ ググって見るとオプションで回避できるという事ですが 具体的な方法を探せません、どなたか教えていただけないでしょうか?
>>542 10054エラー自体は発生を確認してます。その後つかえなくなる、ってことは経験していない、
というか少なくともエラー発生後も同じソケットで他のアドレスへは送れていました。
回避方法は
_socket.IOControl( SIO_UDP_CONNRESET, new byte [] { 0 }, new byte [] {} ); // C#ね
てな感じ。これによる不都合も特に無いようです。
544 :
デフォルトの名無しさん :05/01/12 21:12:49
>>543 ありがとうございました
正常にタイムアウトがでるようになりました
実装する以前はタイムアウトまでいかずにかたまっていました
545 :
デフォルトの名無しさん :05/01/12 22:33:13
winsockを使ってUDPのクライアントを作ってます。 同じPCでUDPクライアントを2個動かし サーバの同じポートへ接続して送受信した場合 問題はあるのでしょうか? 同じポートへ接続しても良いものなんですか?
送信は出来るだろうけど、受信するポートはどうするわけ?
いいよ
548 :
546 :05/01/12 23:10:52
クライアント側の受信するポートは、違うと思います。 ソケット作るときポートを指定していないので。 ありがとうございます。 問題がないなら、それで作ろうと思います。
>>545 TCP/UDPのパケットの行き先(ソッケト)は、
両側のIPアドレスとポート番号の四つ組で識別される。
行き先のIPアドレスとポート番号だけ(二つ組)じゃない。
これTCP/IPの常識。
パシャッ パシャッ パシャッ ∧_∧ パシャッ ソッケト パシャッ ( )】Σ . / /┘ パシャッ ノ ̄ゝ
UDPは四つ組じゃないし。 まあ両方向の「ソッケト」を考えるとそう言えないこともないけど。
なんと、UDPにはPORTが無いとでも仰るのか。
初心者も読むスレなんだから、 ちゃんと具体的に何が間違ってるのか指摘しようよ。 漏れには全くわからないけどな(w
>>552 コネクションがないから、
「コネクションの識別を四つ組でする」と言うことに意味がない。
ディストネーションだけで運ぶ先が分かる。
データグラム通信というのはそういうもの。
TCPの場合は、四つ組で接続を識別するので、
片側だけ注目すれば、同じIPアドレス、ポート番号の組みを持っていても、
別の接続と言うことがある。接続が別であるという事は、
その端点であるソケットも当然別のものになる。
これはUDPには通用しない。
FirewallではUDPでも両方を見ているので、(例えばdomainは通すなど)
この点勘違いしている人がたまにいる。
555 :
545 :05/01/13 22:34:01
>>554 となると、UDPで私が言ったことは出来るけど好ましくない。
と言うことですよね?
もう作ちゃった…
どう運用するか考えます。
んなこたあない。
>>555 サーバ側 一対多 クライアントs側
の時に、サーバ側は、四つ組を想定すれば、相手を識別できる。
通常、何も考えずに、ソースIPアドレス/ソースポート番号に返すだけで住む場合が多い。
BSDソケットでは、accept/connectをUDPに使えば、
接続があるかのようにプログラミングすることができる。
>>554 なんで? UDP でも四つ組の識別ができるじゃん。
>>558 1データグラムについては「4つ組」があるけど、ソケットについては自分の側のアドレス:ポート番号の2つだけ。
1つのソケットでどこのremote end point へも送信できるし、どこからのデータグラムでも受信するよ。
>>558 TCPを四つ組で識別する必要があるのは、
ネットワーク層からトランスポート層に受け渡す時だよ。
UDPではこれは必要がない。
あなたがアプリで四つ組を意識するのは勝手。
>>559 そりゃそうだけど、
>>554 > コネクションがないから、
> 「コネクションの識別を四つ組でする」と言うことに意味がない。
ってのは違わないか? コネクションはなくても source/dst それぞれの
ipaddr・port 識別はできるわけだし。
>>561 「コネクションの識別をする意味がない」の「コネクション」はトランスポート層の話で、
561さんが話してる「識別」はアプリケーション層の話でしょう。
んでそもそもの発端の
>>549 >TCP/UDPのパケットの行き先(ソッケト)は、
>両側のIPアドレスとポート番号の四つ組で識別される。
>行き先のIPアドレスとポート番号だけ(二つ組)じゃない。
はUDPの場合明らかな間違い。
UDPの場合行き先のIPアドレスとポート番号だけで、
先方のどのソケットに到着するかが決定される(bindしてる奴がいれば)。
>>555 全然OKです。 例えばDNSの名前引きなんかUDPでしょう? 同一ホスト上の
複数のアプリが同じDNS鯖にDNSの問いかけ投げてるじゃないですか。 鯖内では
ある問い合わせがどこから来たのかを覚えておいてそこに投げ返しているのです。
Windowsではselect使っちゃいかんのですか? なんかWSA〜使えとか参考書に書いてあるんですが つーかselect第一引数はダミーってなんだよ Winsockヤバイ
>>562 > UDPの場合行き先のIPアドレスとポート番号だけで、
> 先方のどのソケットに到着するかが決定される(bindしてる奴がいれば)。
>>557 の言うようにUDPでもaccept/connectをすればそうとは限らない。
tftpのサーバーを書くのに各クライアント毎にスレッド回してacceptした
ソケットを割り振るような実装をすればクライアントの数だけ同じポートに
バインドしたソケットが作成される。
>>565 それはUDPというより単にberkley socket libraryの仕様のような気が・・・
>>566 けど話は「ソケット」の話だからAPIの話でしょう? UDPにはソケットという概念は無い。
ちなみに確認はしてないがこれはおそらくPosixにも採用された仕様でLinuxとかでも
まず同じだと思う。 Winsockは知らん。
>>564 いいよ。俺はselectしか使ってない。
俺なんかselect()の匂いだけで飯が三杯食える。
571 :
デフォルトの名無しさん :05/01/14 09:15:17
HTTPクライアントを作成して、 GETでURLを投げるとhtmlの内容が取得できるのですが、 exeファイルなどのバイナリファイルは、 どうやって受け取ったらいいのでしょうか? いまはこんな感じでレシーブしてます。 if (recv(s, recv_buf,sizeof(recv_buf)-1,0) > 0 ){ strcat(recv_result,recv_buf); }
そんなとこでstrcat使うなヴォケ ちゃんとrecvの値受け取って長さ管理しろ
ライブラリ使わずにプロトコルの処理を自分で実装するならRFCは必読。
定番アプリケーション層のプロトコルなんかを 今更socketで1から作る意味はあるんでしょうか
↑何語ですか?
576 :
デフォルトの名無しさん :05/01/14 14:01:41
selectあげ
>>574 HTTPクライアントなんかwininet使えば数行で書けるよ
ヘッダとか見る必要すらないし
select キタ━(゚∀゚)━( ゚∀)━( ゚)━( )━(゚ )━(∀゚ )━(゚∀゚)━!!!!
いまサーバー作ってて、 ソケットごとにスレッド作って、 ブロッキングでWinsock呼んで処理させてるんだが、 メインスレッドから強制終了させるのはどうすればいいのかわからん。 Winsockはスレッドセーフかどうか、保証ないんで closesocketもshutdownも呼べない。 スレッドをAbortしても、ブロッキングしてるから いつ終了するか、わからない。 WSACancelBlockingCallはWinsock2には無い。 どうすりゃいいの?
>>579 Windowsで作らなければいいじゃん
↑バカ
ブロッキングなんかで組むなよ
Winsockはスレッドセーフだよ。 んでスレッドセーフとは関係ないけど、closesocketすればブロッキングしている 呼び出しはエラーで戻るよ。
強制終了という発想がヤヴァイ 病院行け
強制終了っていうか、サーバーの終了。 すべてのクライアントがきちんと切断するとは 限らないわけだし。
おいおいたのむよ
正規開放はいちおう知っていて、できるだけやってるんですが、 うまくない。 クライアントからなにも送られてこないと、 ずっとブロッキングしてて、 他のスレッドからsocketいじらない限り、 切断通知もできないし、 正規開放ももちろんできない。 前述の記事とか、MSDNとか読んでるんですが、 Thread Safeとはどこにもかかれてないし、 ソケットを他のスレッドから強制終了するサンプルも、見当たらない。 いいのですかね? 今は、ブロッキングしてるスレッドと別のスレッドから ソケットを半分閉じて、recvで待って、 closeしているんだけども・・・。 Winsockがスレッドセーフ、というか、 他のスレッドからshutdownしてもいいなら全部解決なんだが。
>>590 「前述の記事」では thread safe であるということに肯定的な意見が書かれている。否定的なコメントは無い。
っていうかWinsockがスレッドセーフじゃない事例については漏れも知らない。
だからわざわざ「何が」ってきいたんだけど。
だから shutdown しても良いことは多分間違いないんだけど、
現在の実装でそれが効力を発揮するかどうかはわからない。
TDI が同期化を試みるかもしれないし。っていうか間違いなく試みるか。
あとクライアントAPのバグでもなければ、腐ったコネクション相手に何やってもどうせ
「FIN_WAIT2あたりにしかならん・・orz」
って結果が多いのであまりcleanな終了処理に拘ってもしようがないと思う。
ふむ。 やっぱり保証はないのね。 まぁみんな使っているのであるならよしとしよう。 参考になった。ありがとう。
NATはさむとさらにややこしいことに
>>586 process殺せば後はOSがreleaseしてくれる。
579はthreadのみの終了についてきいてるけどな。
>process殺せば ところがリソースはうまく開放してくれるとは限らんのだ (カーネルリソースは除く)
俺も以前あまり知識が無かった頃に趣味で作ったチャットサーバは何も考えずに 他スレッドからclosesocketしてたな。今はselect使ってるが。
WinSockでsend()したデータが実際に送信完了した事を知るにはどうすれば良いのでしょうか? FD_WRITEでは不十分だと思っているのですが。 送信完了とはデータが相手機器に届きACKが返って来た時の事を考えています。
winsockに限らずそんなものはない。やりたきゃアプリケーションで返せ。
>>598 なぜ喧嘩腰?
>やりたきゃアプリケーションで返せ。
だからその方法はどうすれば良いのですか?
上の1行から想像するにsend()データを受け取る側で
全データ受け取ったという内容の送信完了パケットを返す様にして、
送信完了パケットを受け取ったらsend()完了とする、という事ですか?
相手の受信バッファに収まったタイミングが知りたいの? それとも相手のアプリケーションが受け取ったタイミングが知りたいの? あと、知ってからどうするの?
>> 600 希望として相手アプリケーションが受け取ったタイミングが良いです。 出来ない場合には相手側受信バッファに転送されたタイミングでも良いです。 >あと、知ってからどうするの? いま、ftpみたいなデータとコントロールの2本のソケットを使用したアプリケーションを 作っているのですがデータソケットへのファイル送信が終わったらコントロールソケットに コマンドを発行したいのです。 send(cmd1)→send(data)→send(cmd2) という感じですが、send(data)の完了してからでないとsend(cmd2)出来ないのです。
「相手アプリが受け取ったこと」を知りたいなら、 アプリレイヤでやるしかないよ。 > send(data)の完了してからでないとsend(cmd2)出来ない 完了の定義次第じゃね?
ftpサーバとftpクライアントのやり取りをアナライザで調べてみました。 ftpクライアントがサーバからファイルをダウンロードする場合には、 ファイルの転送が終わってから「226 Transfer complete」コマンドが サーバからクライアントに届きます。 と言うことはファイルをsend()するサーバ側はsend()が完了した事を 知ることが出来るという事ですよね? 598の「そんなものはない」というのは本当でしょうか?
> 「相手アプリが受け取ったこと」を知りたいなら、 >アプリレイヤでやるしかないよ。 了解しました。有り難うございます。 ちなみに、相手の受信バッファに転送された事を知る方法はあるのでしょうか? >完了の定義次第じゃね? すいません、調べて見たのですが「完了の定義」とは何の事でしょうか? 何かのオプションで指定するのでしょうか?
FTPの転送完了についてはrfc959。 >すいません、調べて見たのですが「完了の定義」とは何の事でしょうか? 601での「完了」ってどういう意味? と書けばよかったのかなあ。
>なぜ喧嘩腰? ここの多くの住人はUNIX使いです。 UNIX使いはわかんないことがあるといつも逆ギレで対処してますです。。。 言い換えると病気の発作です。
しかし結局
>>598 はご名答だったわけじゃない。
逆切れって言うのは、
>>599 の方を言うんじゃないの?
> だからその方法はどうすれば良いのですか?
とかさ。
>598のあれって喧嘩腰って言うんだ? (2ch内では)普通じゃないの?
俺もそう思う。 つーか、俺はそういう言い方平気でしてる。 あと、文章にならないキーワードのみの書き込みとかも。
>>610 まぁ別に自慢するようなことでもないがな。
自慢?
上司に言われたら平気なのに2chで言われたら耐えられないってか? 変なプライドは捨てろ。まずMSDN読め。ネットで検索しろ。 自分の手で調べた分だけ身になるんだ。
逆切れっぽい書き方と上司に言われる台詞とはまた微妙に違うぞ。
逆切れ版 winsockに限らずそんなものはない。やりたきゃアプリケーションで返せ。 上司版 winsockに限らずそんなものはない。やりたきゃ自分で実装しろ。
上司版 『自分で調べろ(俺にはわかんねぇー!)』
>>615 レイヤを明示している前者の方がむしろ親切ジャマイカ?
実際599が「上の1行から想像するに」と書くくらい十分ヒントになっているようだし。
元の質問はwinsockでTCPのackの返った最終データを知るAPI(があると質問者は
仮定しているように見える)の質問と読むのが自然だろうと思うのだが、
599ではいつのまにか、俺のしたいことを実現する方法を手取り足取り教えろに
変わってるんだよな。
598の落ち度は質問者がDQNだったのを予測できなかったことくらいだろう。
この掲示板に名前=a、E-mail=sage、内容=aiueoと書き込む時の POSTする文字列はどうなりますか?
パケットをモニタ汁
>>618 RFCにしたがって好きにすればいい。
ヘッダにどんな風に料理したのか書くのな。
>>621 迷惑だからテストは自分のサーバでやれ
非常識な奴だ
&でつなげてってのは、GETメソッドでしょ。2chの書込みはPOSTメソッドだから ダメじゃないかね。
monazillaってBBSかMLやってないのか?
IEが送信してるパケットとあのサイトのツールが送信しているパケットを 比較してやっと謎が解けました、なぜか=と&が%..の形式に変換されてました
何故かというかメタキャラクターだし…
628 :
デフォルトの名無しさん :05/01/17 00:04:47
age
なんつーか、まずは適当な掲示板CGIの勉強でもすれ。
630 :
デフォルトの名無しさん :05/01/18 09:18:04
Web上にあるファイルの更新日時を取得したいのですが、 ローカル側に落とさずに、更新日時のみ取得はできるのでしょうか?
TCPの接続で 一つのサーバーに対して複数のクライアントをつなぐことは できるのでしょうか?
632 :
デフォルトの名無しさん :05/01/18 09:54:28
630>> 自己レスですが、HEADでできました
>>631 あなたの質問の意味がわかりません
詳しく書いてくれませんか?
>>631 普通にできる。でないとやってらんないだろ。
チャットサーバーを題材にしてC#でのネットワークプログラミング解説サイトを 作ろうと思うんだが今さらそんなサイト、需要あるの?
>>635 ちゃんと非同期系のメソッドを使ったワーキングサンプルなら
参考にしたい人もいるんじゃないかなー。
ネットワークプログラミング初心者なんですが 下のようなのをよくみるんですがmemsetはなぜ 必要なんですか? struct addrinfo hints memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_PASSIVE; hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM;
struct addrinfo には ai_flags, ai_family, ai_socktype 以外のメンバもあるから。
メンバーが後から増えて、 そのデフォールトの値が0でいいような場合は、 0でmemset()してあるソースコードは、生き伸びます。 とあるシステムのstruct sockaddr_inみたいに、 先頭にsin_lenってメンバーが増えた場合には、 0じゃまずいので、コード付け加える必要があるけど。
UNPではbzero
642 :
デフォルトの名無しさん :05/01/19 10:29:42
Winsock2API仕様書の原文が見たいのですが、 どこで入手できるでしょうか? やはりMSDNに加入しないと入手不可ですか?
644 :
デフォルトの名無しさん :05/01/19 11:47:30
sendで一度に送れるバイト数はいくつですか?
>>644 他のは知らんが、WinsockではTCPの場合sendでWSAENOBUFSエラーになったら
サイズが大きすぎるので、あらかじめもっと小さいサイズを指定して送る必要がある。
もちろん、どんなサイズを指定してもそれより小さなサイズだけ送ってリターンしてくる
可能性については考慮しておくこと。
UDPの場合はそれに加えて他のOSと同様にあれこれ考慮してください。
646 :
デフォルトの名無しさん :05/01/19 12:45:36
javaのsocketとかWindowsのWinsockとかの「ソケット」ってTCPかUDPプロトコル上の概念なのですか? あと、VBはほかのマシンのファイルを「ソケット」使わず「ポートとかを指定せず」に書き換えられると聞いたことがあるのですが、 これはTCPもUDPも使わず別のプロトコルを使うというわけですか?
ネットワークプログラミングをするならテクネくらい取ってください
>>646 ソケットはAPI的概念。
「VBは・・・」ってのはMicrosoftが定義したSMBプロトコル(現在ではTCPとUDPの上で出来てる)を
使ってリモートファイルシステムにアクセスできるってこと。Windowsの上で動く大抵の言語(VCでも
PerlでもCMDファイルでも)でできる。
コマンドプロンプトから echo hello >> \\hoge\foo\bar.txt とかすれば、マシンhogeの共有名fooに
bar.txtを作成できる。
>これはTCPもUDPも使わず別のプロトコルを使うというわけですか?
かつてはそういうこともしていた。今はしていないケースが多い。
649 :
デフォルトの名無しさん :05/01/19 13:20:32
>>645 送信可能最大サイズを取得する方法はありますか?
>>649 これより詳しい説明が必要なら、まず「送信可能最大サイズ」を定義してください。
もしそれが send に渡して WSAENOBUFSエラーにならないバイト数のことなら、
事前に知る術はないです。PCのメモリ搭載量によって変動するみたいですが。
ブツがファイルでOSが Windows XP/Windows Server 2003 ならTransmitFileなり
TransmitPackets使えば、おそらくファイルの最大サイズまで一度の呼び出しで送れるでしょう。
また、TransmitPacketsのドキュメントには、このAPIがメモリ上のデータを自動的に
複数のsend呼び出しに分割して実行してくれそうなことも書かれています(使ったことないけど)。
最近Q&Aみたいな質問増えてない? もちろん活性化されて歓迎なんだが・・・・
ネットだけで知識を得ようとしてる人が増えたって事かな
653 :
デフォルトの名無しさん :05/01/19 21:22:47
あるクライアントプログラムを書いているのですが パスワードをクライアントに安全に保存しておくのにいい方法はありませんか? ちなみにサーバの仕様でパスワードを平文で送らないといけないので、 暗号化して保存しておくなら、クライアントサイドで復号化しないといけません。
すくなくともこのスレで訊くことじゃないな。
>>653 多くのクライアントPCでは簡単に自分で送受しているパケットの内容をスニファーなどで
簡単に確認することができるので、サーバに平文を送るのなら安全に保存すること自体
あまり意味ありません。
スニファーも使えないような人向けのカジュアルな改ざん防止程度なら、
アプリ内部で適当にDESでも使って暗号化しておけば十分でしょう。
>>646 ソケットというのは元々通信する同士の間の接続の端っこを、
プログラム上で扱うために考えられた仮想的な概念。
糸電話の耳や口を当てる部分と思えばいい。
そこに書き込むと相手に送られ、そこを読むと相手が送ったものが読める。
MTUでぐぐる
>>653 >>655 も言っているけど、
ローカルに秘密にデータを保存したいって事だから、
ネットワーク関係ないよね。
そのシステムのkey ring, password manager APIでも調べたら。
専用の板やスレがあるからそこで。
>>659 >2-3は無視ですかw
ちゃんと理解できるならどんな方法でも良いんだけどね
>>655 セキュリティ暗号化の話だと思ったのですが適当なスレがなかったので・・・
>>656 サーバの送信時は仕方ないので、カジュアルな改竄防止程度でいいと思っています。
DESだと暗号鍵、復号鍵をアプリに含める必要がありますが、
一度鍵がばれちゃうと意味ないので、インストール時に作成するようにすればいいですね。
パスワードをやってるメーラとか大抵どうやってるんでしょう?
オープンソースのメーラのソース見てみたんですが、よく分かりませんでした。
>パスワードをやってるメーラとか大抵どうやってるんでしょう? >オープンソースのメーラのソース見てみたんですが、よく分かりませんでした。 ちなみにsylpheedのソース見ていたんですが、 よく見ると 使用するユーザのパーミッションでしか見れない設定ファイルに平文書きでした。 Thunderbirdとかでもいっしょかな??
666 :
デフォルトの名無しさん :05/01/20 10:59:50
C言語で、構造体にセットされている 数値データ,文字データ,数値データのように型の異なるものを、 一括でSENDしたいのですが、送信文字列の編集がまったくうまくいきません。 この場合どうやってセットすればいいんでしょうか? ぐぐって調べてみたのですが、 バイナリデータの送信という形になるのでしょうか?
667 :
666 :05/01/20 11:12:15
送信したいデータは、固定長です。 無駄使い申し訳ない。
send(s, &instanceStructure, sizoef(typeStructure), 0);
669 :
666 :05/01/20 12:26:07
>>668 構造体を丸々セットすればいいということでしょうか?
ネットワークではマシンに依存したバイナリ表現は送ってはいけない。
>>668 のようにすると、簡単に思いつくだけでも
- バイトオーダー
- 型の大きさ (intが何バイトか等)
- 構造体のパッキング
といったマシンやコンパイラ・コンパイルオプションに依存した通信となる。
671 :
666 :05/01/20 13:21:12
>>670 数値はlong型のみで、入れる値はネットワークバイトオーダーで固定して、
受信相手はWindows2000とXPのみにするつもりです。
構造体のパッキングは、意味がわからなかったので、ぐぐってみたのですが、
桁数制限のことであってますか?
>>670 普通パディング(詰め物)って言わないか?
パッキングなんて初めて聞いたぞ
#pragma pack とかで使われているからじゃない? わしも使わないが。 アライメントとかいう時もある。
674 :
デフォルトの名無しさん :05/01/20 13:32:34
//1-byte alignment #include<pchpack1.h> struct{ ... }; #include<poppack1.h>
>>671 キリの悪いアドレスからの
読み書きは遅い(CPUによってはバスエラーになる)から
構造体の要素の間に隙間をあけて
キリのいいアドレスにデータの先頭の位置をそろえること。
(隙間の入り方はCPUアーキテクチャや
コンパイラ、コンパイルオプションで変わる。)
ネットワークバイトオーダはIntelCPUの整数と逆だからきおつけれ。
>>671 広義にはパディングを決めて、構造体全体のサイズと
その中での要素の配置を決定すること。
C言語の構造体以外にも似たような(物理的)内部フォーマットの意味で使われる。
(例: 「16ビットピクセルのビットパッキング」)
狭義にはパディングを(CPUがアドレッシング可能な範囲で)極力なくして
構造体を小さくすること。
数値はlongのようにアーキによって変わるものではなく
int32_tのようなサイズを明示したものを使え。
677 :
666 :05/01/20 14:15:36
皆様のおかげで、大体理解できました。 これから実装に入ります。 ありがとうございました。
678 :
666 :05/01/20 16:13:08
構造体のデータの送信は確認できたのですが(パケット確認済み)、 今度は構造体データ受信部分うまくいきません。 受信部分のバッファを構造体(rsp)に指定すると、 データがうまくセットできず、 recvfrom(s,(char *)rsp, sizeof(*rsp), 0, (SOCKADDR *)&from_addr, &i_fromlen) char型のバッファ(c_buf)に指定すると、 recvfrom(s,c_buf, sizeof(*rsp), 0, (SOCKADDR *)&from_addr, &i_fromlen) 文字列箇所はうまくいきますが、 数値データの箇所で、数値に変換してホストバイトオーダーをかけても データが思ったとおりのものがセットできません。 受信部分のバッファには何をセットすればいいのでしょうか?
>>678 もしかしてC/C++使うのは初めてですか?
あるいは単にWOULDBLOCエラーあたりになって何も受信されてないとか。
あるいはストリーム型ソケットで受信サイズを見ていないとか。
680 :
デフォルトの名無しさん :05/01/20 20:56:27
HTTPヘッダの、HOSTってどういう意味/どう使われるんでしょうか? 初心者ですいません orz
英語リンクを示したからには まず日本語に訳せ
684 :
デフォルトの名無しさん :05/01/21 06:47:39
>>682 黙れ雑魚が。この程度の英語ぐらい読んでくれよ、マジでおながいします。
「Host: ってのはこう使います。」 「ほう、根拠は?」 「RFCに書いてあります。」 「本当にそう書いてあるのかね? 私には多少違うように見えるのだが。」 「そう2chで言ってました。」 「……。」
687 :
666 :05/01/21 08:53:17
679>> お察しのとおり、C/C++使うのは初めてです。 いままでJAVAとVBしか組んだことありません。 ネットワークプログラムも初めてです。 RFCなども一通り目を通しましたが、 わからないことだらけで(汗 もう一度基本からやりなおします…
688 :
デフォルトの名無しさん :05/01/21 10:44:45
socket()とclosesocket()の関係について質問です。 { SOCKET sock1 = socket(); // sock1 = 1000 closesocket( sock1 ); SOCKET sock2 = socket(); // sock2 = 1000 closesocket( sock1 ); // ここで、sock2も閉じられてしまう } sock1をcloseしたことで、ディスクリプタが解放されて、 sock2で、sock1と同じハンドルが返ってくるのはわかるのですが、 sock2を取得した後に、sock1をcloseするとsock2まで閉じてしまうのですが・・・ これって、仕様なのでしょうか?(エラー返さないし、仕様なのでしょうけど・・・) やはり、closesocket()したあとに、SOCKETには0を入れ、 closesocket()をする前に0のチェックを入れるべきなのでしょうか?
sock1 と sock2 の値を表示して調べてみれば分かる。 ってゆうか、プログラミングの初歩から学習しなおした方がいいかも。 たとえば、これも。 >やはり、closesocket()したあとに、SOCKETには0を入れ、 >closesocket()をする前に0のチェックを入れるべきなのでしょうか? どうして 0 が SOCKET として無効な値だって分かったの?
だよね。 「変数」と「変数の持つ値」ってのは ネットワークとは関係ない、プログラミングの初歩の初歩だよね。
>>688 > sock1をcloseしたことで、ディスクリプタが解放されて、
ディスクリプタの意味が全く分かってない(嗚呼
>>688 >sock1をcloseしたことで、ディスクリプタが解放されて、
>sock2で、sock1と同じハンドルが返ってくるのはわかるのですが、
頭おかしい、handleの値を議論するなんてばかげてる。
693 :
デフォルトの名無しさん :05/01/21 12:57:54
C言語で構造体のデータを簡単にシリアライズ化できる フリーのライブラリってないですか?
694 :
デフォルトの名無しさん :05/01/21 13:14:42
>>689 表示して、同じだったから、おかしいと思ったんですが・・・
>>690 書き方が悪かったです・・・
>>691 ごめんなさい
>>692 ハンドルの値が同じだから、sock1をcloseしたときに
sock2が閉じてしまうと思っていたのですが、違うのですか?
695 :
688 :05/01/21 13:15:38
>>689 表示して、同じだったから、おかしいと思ったんですが・・・
>>690 書き方が悪かったです・・・
>>691 ごめんなさい
>>692 ハンドルの値が同じだから、sock1をcloseしたときに
sock2が閉じてしまうと思っていたのですが、違うのですか?
2度書きすいません orz
>>688 そのソースコード、なんでsocket1を2回も閉じてんの?
こぴぺしてsock2の部分を作ったけどうっかりcloseは変え忘れていたけど 結局意図した通りになっているのでアレ?って思ったとか。
>>697 これは、例で書いたのですが、
実際のプログラム上で、設計上2回通ってしまうのです・・・
関係ないけど、手元のとある環境だと #define INVALID_SOCKET (SOCKET)(~0) になってる。
>>699 それは設計ミスです。
そういう設計だとすると、他の箇所でdeleteやfreeを2回したりもしてませんか?
>>695 ハンドルってのはソケットを一意に識別するものだから、ハンドルが同じってことは
その2つのハンドルが示しているソケットの実体は1つしかないってことだ。
そしたら、socket1を閉じたらsocket2も閉じたように見えるのは当たり前じゃないか。
>>700 いや、少なくとも
>>688 には関係あるだろ、それ。
>>695 同じ時刻に同じプロセス内で同じ値だったら実体は1つだが、
今回の件では、socket1を閉じた後の話なんだから、実体が
1つのわけないじゃん。一から勉強しなおせ。
>>703 んなこと分かっとるがな。閉じた後偶然同じハンドルが入ってきても
それは当然別物だ。
>>702 すまん、説明の意図を反対に読んでた。orz
707 :
デフォルトの名無しさん :05/01/21 22:08:07
>>688 これは設計が悪い。
まず、ソケットハンドルというのは突き詰めれば結局単なるint型だということを念頭において考えると。
変数socket1でソケット作ったら、例えば10が返ってきたとする。次にそれをクローズする。
クローズしても、socket1という変数(int)自体にはまだ10が入ったまま。
次にsocket2で別のソケットを作る。そしたら偶然、ハンドルとして与えられた数が10だった。
この時点でsocket2という変数には10が入る。そして、socket1を引数に与えてソケットをクローズする。
そうするとコンピュータは、同じ10という数字なので区別ができず、結果、socket2は閉じられることになる。
結論としては、無意味に2回もクローズするのをやめないといけない。
708 :
デフォルトの名無しさん :05/01/21 22:44:40
>>700-707 丁寧に説明していただき、ありがとうございます。
SOCKET(ネットワーク)という、今まで勉強してこなかった分野だったので、
なにやら、特別なものという考えが自分の中にあったのだと思います。
理論上はわかっていても、なんだか疑ってしまって・・・
設計が悪いというのは、うすうす気づいていたのですが、
前述のような、迷信にはまっていたので、疑いを持ってしまっていたようです。
設計を見直して、closeを2度呼ばないよう変更します。
なんだか、すっきりした感じです。
こんな初歩的なことに答えてくれて、ほんとにありがとうございました。
名前いれわすれましたけど、
>>688 です。
それと、sage忘れすいません... ( ;´Д`)アア
710 :
デフォルトの名無しさん :05/01/22 00:07:03
いや、ageてもらわないと困る。
711 :
デフォルトの名無しさん :05/01/22 00:38:04
XMLプロフェッショナルを受けようと思ってますが、どこか良いサイトありますか?
板違い
713 :
デフォルトの名無しさん :05/01/22 00:57:32
大きめのデータをSTREAMソケットでsend()する時に 1回のlengthはどの位が最適でしょうか? やはりsend()したいデータ量すべてをlengthに設定して定石のループ処理を するのが良いのでしょうか?
714 :
713 :05/01/22 01:03:22
なんでこんな事を考えているかというと、 あまり大きいサイズを指定するとWSAEMSGSIZE(だったかな?)などの エラーが返って来ることがあってエラー処理が増えて面倒だなと。 どうせループの中でsend()を分割するのなら最初から分割した方がスマートかなって思いました。
715 :
otasuke :05/01/22 01:39:56
ネットのことにはとんとウトいので、質問にまいりました。 IPアドレスやリモートホストより、 特に同意を受けなくてもネットワーク契約を行ってもよろしいのですか?
717 :
デフォルトの名無しさん :05/01/22 02:23:28
開発環境は? .NETのSend()の場合は要注意。ブロッキングソケットの場合、巨大なデータ送ろうとすると、 一部を送るんじゃなくて、何も送らず例外発生するから(ドキュメントにはちゃんと書いてあるが)。 面倒くさがらずにエラー処理するのが筋かと。
>>714 大きく送ると、Gigabit Ethernetのgiant packetをうまく利用してくれるかもしれません。
特に理由もなく、小さくsend()するのは損です。
720 :
デフォルトの名無しさん :05/01/22 18:18:53
こういう感じで、WSAGetLastErrorの戻り値を関数で使用したいのですが、 g_SocketErrorCheck(WSAGetLastError()); 取得されたエラー値が関数に、渡りません。 こういう感じなら渡るのですが。 i_err = WSAGetLastError(); ig_SocketErrorCheck(i_err); WSAGetLastErrorの仕様??
ig_SocketErrorCheck()ってのがマクロだってことはないですか? あるいは、WSAGetLastError()の"Last"の意味を勘違いしているという事はないですか?
「winsock」「wininet」って、皆さんなんて読んでますか? 自分は心の中で 「うぃんそっく」「うぃんあいねっと」と読んでいます。
724 :
747 :05/01/23 11:14:18
ig_SocketErrorCheck()は普通の関数です。 簡単に書くと、こんなかんじです。 int ig_SocketErrorCheck(int i_err){ if(i_err != 0){ // エラー処理 return false; } return true; } WSAGetLastError()の"Last"の意味は、 一番直前に使用されたWinsock関数のエラーと思っていたのですが、 それが間違ってますか?
725 :
724 :05/01/23 12:55:39
WSAStartupだけは戻り値が返ってくるのですね。 勘違いで失礼いたしました。
727 :
デフォルトの名無しさん :05/01/25 00:56:04
>>722 ↑に。
所でWSAStartupとか"WSA"で始まる関数をなんて読んでます?
「ダブルエスエー○○○」って読んでましたが、
この前「ウーサ○○○」って読んでる人がいて違和感を感じたのですが。
728 :
デフォルトの名無しさん :05/01/25 15:06:58
winsock2からRARPを行いたいのですがどうすれば良いでしょうか?
WinXP上でWinsockのRAWソケットを使ったパケットキャプチャプログラムを作成しました。 受け取ったパケットが、どのプロセスで使用されているのか知るにはどうすればいいのでしょうか? netstatなどのようなコネクションモニタの情報とパケット内のポート番号とを照らし合わせるのでしょうか? でもこれだと、UDPだと無理ですよね。
あ、解決しました。 netstat -ao でいけますね。 あとは、AllocateAndGetTcpExTableFromStackを使って・・・。 定石ではどのようになっているのか教えていただけると幸いです。
>>727 それはおかしいなどう考えても。俺は普通にダブルエスエー。
charって外人はなんていうんだろう。
外国人の呼び方は、主にチャー、カー、ケアの3種だそうだ。
>>730 それでいい(netstat -aon)と思うけど
netstat使いたくないならnetstatのソース見て
自分で実装すれ
735 :
デフォルトの名無しさん :05/01/27 06:27:06
↓
>>735 →→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→
↓
738 :
デフォルトの名無しさん :05/01/27 10:43:18
inet_addrって***.***.***.***じゃない数も変換します? なんか、*だけとか入れても、エラーじゃなくて 得体の知れない値に変換しちゃうんですけど。
常識。 ***.***.***.***が何を表現しているか考えればわかるでしょ。
740 :
デフォルトの名無しさん :05/01/27 11:23:47
>>739 書式チェックまではしてくれないんですね…
どもです
いや・・・ *も正しいから。
738はIPv4のアドレスが4 octetだということがわかってないんじゃないか?
>>738 inet_addr()はかなり無茶な曲芸をする。 例えば
1 → 0.0.0.1 (単に整数と解釈)
1.1 -> 1.0.0.1 (間の0.0を省略したと解釈する)
0x01010101 -> 1.1.1.1 (4byte の16進整数と解釈する)
16843009 -> 1.1.1.1 (上と同じのを10進)
010.010.010.010 -> 8.8.8.8 (010を8進と解釈する)
古いアプリだとユーザの入力を直接inet_addr()に食わせるので上のような変な
アドレスを直接食わせられる。 最近のアプリはgetaddrinfo()にユーザ入力の
アドレスを処理させるがこれはinet_addr()の妙な動作は全て取っ払われ、
10進の4桁ドット形式しか認めない。
なんでBSD socketはこんなにアフォな仕様なんですか?
それがBSDクオリティ
>>743 >1.1 -> 1.0.0.1 (間の0.0を省略したと解釈する)
うはwwww
>>746 Class Aもらってるとこなんかはそれで便利に使ってたわけだ。
127.1 のほうが使い勝手いいな
特に8進数扱いが激しく糞だよね。
751 :
デフォルトの名無しさん :05/01/27 19:59:59
なんでlocalhostって127.0.0.1に決まったの? そんな気分だったの?
01111111.00000000.00000000.00000001
localhostっつーか127.0.0.0から127.255.255.255はloopbackのために予約されている。
755 :
デフォルトの名無しさん :05/01/29 06:42:44
756 :
デフォルトの名無しさん :05/01/31 09:19:16
たとえば www.google.com のようなファイル名部分が省略されたURLを HTTPでgetする時に実際に取得されるファイル名を知る方法はありますか? index.htmlなのかindex.phpなのかとか。
無理でしょ。 リクエスト側は(ルートなら) "/"をGETするだけだし 仮に"/tech"みたいなディレクトリであったなら、 (普通は)リダイレクトで"/tech/"になって再度GETが入るだけ。 で、"/"をGETした時に何が送られてくるかは、サーバーの設定次第。
んなこたぁない
こともない
じゃあ教えてあげなよ
とりあえず開いて"index"で検索した周囲には全然載ってないけど。 あまり関係ないことばかりだし。 GET / HTTP/1.0 で送られてくるのが"index.html"か"index.htm"か"default.asp"か あるいは別の何かなのか、その名前を取得できるかという質問なんだから。 ちなみに、apacheの場合は "/"のみの場合も含め、ディレクトリをGETした時に送られるファイルは DirectoryIndexで指定するようになっている。 サーバーの設定じゃないって言うなら、どこで決まってるというのかね?
>>761 文章の書きかたがまるで駄目なので読むだけ無駄でしょう。
>>758 こういうアホっているよね。「そんなことない」とだけ書いて
全くその根拠を示さない奴。
そうですね。
ということにしたいのですね
そうかもしれない
>>756 サーバによってはContent-Dispositionを一緒に送ってくることがあるから、
それで一応知ることはできるけど、信じるかどうかはクライアント次第
770 :
デフォルトの名無しさん :05/02/01 00:19:24
age
774 :
デフォルトの名無しさん :05/02/02 05:53:24
> グローバルIP返してくれる という要求は満たしているわけだが。
>>775 Windowsアプリ向けの共通ライブラリを作っているのですが
WSAStartup/WSACleanupのスコープってどこまでなのでしょうか?
アプリ本体がWinsock使っているかにかかわらず、ライブラリ内で
通信したいのです。
静的リンクだとアプリ本体と同じインスタンスですが、2回以上
呼んでしまっても良いのでしょうか?
DLLにして動的リンクならOKなのでしょうか・・・?
>>776 マニュアルちゃんと読みなさい。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/wsastartup_2.asp An application or DLL can call WSAStartup more than once if it needs
to obtain the WSADATA structure information more than once. On each
such call the application can specify any version number supported by
the DLL.
An application must call one WSACleanup call for every successful
WSAStartup call to allow third-party DLLs to make use of a WS2_32.DLL
on behalf of an application. This means, for example, that if an
application calls WSAStartup three times, it must call WSACleanup
three times. The first two calls to WSACleanup do nothing except
decrement an internal counter; the final WSACleanup call for the task
does all necessary resource deallocation for the task.
>>778 >マニュアルちゃんと読みなさい。
見落としていました。
ありがとうございます。
780 :
デフォルトの名無しさん :05/02/02 15:33:29
BOOL optionval = true; // オプション設定のみに使用する setsockopt(s,SOL_SOCKET,SO_BROADCAST,(optionval,sizeof(optionval) こういう感じで、ブロードキャストの設定をオンにしたのですが、 これをデフォルト値に戻す時はどうやればいいのでしょうか? optionval をfalseにしてもうまくいかなくて…
>>780 > optionval をfalseにしてもうまくいかなくて…
念のため確認するがfalseにしてもう一度setsockoptを呼んだんだよね?
>>780 BOOLじゃなくて char (unsigned char でも良いけど) にするべきなんじゃないかなー。
さほど自信ないし、他人事だからどうでもいいけど。
783 :
780 :05/02/02 16:01:54
781>>setsockoptを呼びましたが、だめでした。 782>>MSDNはBOOLになってるんですが、 一応試してみます。
784 :
デフォルトの名無しさん :05/02/02 18:02:07
>>775 それだけしかないサイトなんだなぁと思って。
>>784 dyndns.org っていうドメインから、checkipの目的がわかると思うけど。
>>785 何だと?dyndnsを使ってると悪いのか?
JavaでSSLのNon-BlockingSocketが使いたいんだけど・・・。 もうだめぽ
独り言かよ!?
質問したいけど、結論知ってるし・・・。
ぼ?
ぼぼ
794 :
デフォルトの名無しさん :05/02/03 09:39:55
A端末からブロードキャストを投げて、 受信したB端末からブロードキャストを投げ返しているのですが、 A端末が自分で放ったブロードキャストを受信しないようにするには どうすればいいのでしょうか? B端末のブロードキャストだけ受け取りたいのに、 自分で送信したものまで受信してしまいます
>>794 recvfrom()でどこから来たか見て自分からだったら捨てる。
796 :
デフォルトの名無しさん :05/02/03 12:16:42
>> 795 できました! ありがとうございます!
797 :
デフォルトの名無しさん :05/02/05 15:33:00
798 :
デフォルトの名無しさん :05/02/05 22:41:19
lispで簡単(テキストファイルの送受信程度)なネットワークプログラム作りたいのですが、 その辺の情報の載ったサイトとか本ありませんか?
HTMLに<input type="hidden" name="aiueo" value=""> という文があったら POSTする時に...&aiueo=&...としなければいけませんか? それとも""のパラメータは省略可能ですか?
意味不明&スレ違い
>>799 ブラウザでも作ってるの?
ナンにせよ、空白を意味するパラメータになるので、...&aiueo=&...を付けないといけない
804 :
デフォルトの名無しさん :05/02/06 21:48:09
GetQueuedCompletionStatusの中で例外c0000005が発生して落ちている様なのだけど、 これってどういう時に発生するのでしょうか。 必ず発生するタイプの物では無いのです。それなりに低い確率で発生している様です。 しかも、GetQueuedCompletionStatusを叩いてから数秒経ってから落ちているのです。 Windowsが一般に表示するアプリケーションが落ちた時のダイアログのモジュール名 にはunknownと書かれていました。 デバッグログ出力のコードを入れて調査をしていた所、どうやらその例外が発生す る前にはそのIO完了ポートに関連付けるサーバソケットを生成して動かしている… というコードが別スレッド(メインスレッド(GUIを主に動かしている))で走ってい るという共通点がある様なのです。 この手順はsocket(listen),setsockopt,bind,listen,CreateIoCompletionPort,socket(accept), AcceptExです。 そのプログラムはサーバソケットの生成と破棄を激しく繰り返します。 そのプログラムは一度に同一マシンで20〜40プロセスぐらい動かしています。 更にそれを20マシンぐらいで同時に動かします。その上で1時間に1〜5ぐらいの例外 が発生するのです。 そのプログラムでは他にもスレッドが10個ぐらい動いていて、それらのスレッドで はIO完了ポートを使わずに一般的なノンブロッキングソケット/ブロッキングソケ ット等を使っている様です(ライブラリの中なので見れない)。 OS:Windows XP SP2 Winsock:(2,2) 何か知っている事があれば教えて頂きたいです。 個人的にはWindowsのバグな気がしているのですが。
>>799 <input type="checkbox">な奴は、チェックされてないと
値が渡って来ないよ。それ以外は全部空でも渡ってくる。
>>803 株の自動売買プログラムを作ってます
そうですか、一応""というパラメータなんですね
レスありがとうございました
>>807 ありがとうございます。
このサイトはいいですね、参考にさせていただきます
809 :
デフォルトの名無しさん :05/02/07 19:45:29
とあるsocketディスクリプタがありまして、これはコネクション済みで TCPとかで別の誰かと通信が可能な状態にあります。 このディスクリプタを使って、通信している自分のNICの MACアドレスを取得したいのですが、どうしたらいいでしょうか Linuxです (Fedoracore3ですけどディストリは関係ないですよね)
>>809 struct ifreq if_hwaddr;
if(ioctl(sd, SIOCGIFHWADDR, &hwaddr) < 0) {
perror("ioctl SIOCGIFHWADDR");
}
…かな。if_hwaddr.ifr_hwaddr に MAC アドレスが入るはず。
ioctl(2), ioctl_list(2), netdevice(7) あたり見とけ。
>>810 それはraw socketじゃないと。
取得する前にinterfaceを指定しないといけないし。
おっと、TCP か。正直すまんかった。
んではgetsockname と raw socketで
>>810 の組み合わせ?
linuxならsocket(AF_PACKET, SOCK_DGRAM, 0)でもOK。
>>810 ありがとー
やってみます。
SIOCGIFHWADDRってgoogleしてもあんまり情報ないね
>>815 やったけどNosuchdeviceと言われました。
こんな漢字
getsockname( sd, &addr, &addrlen );
ad = socket( AF_INET, SOCK_DGRAM, 0 );
sin = (struct sockaddr_in *) &arp.arp_pa;
sin->sin_family = AF_INET;
memcpy( &sin->sin_addr, &addr, sizeof(struct sockaddr_in) );
ioctl( ad, SIOCGARP, &arp ); ←ここでエラー
>>816 いやいや、
>>815 のソケットにSIOCGIFHWADDRすんだよ。
ifr_nameにインターフェース名を設定してから。
bzero(&req, sizeof(req));
strcpy(req.ifr_name, "eth0");
result = ioctl(s,SIOCGIFHWADDR, &req);
if (result == -1) {
perror("SIOCGIFHWADDR");
exit(1);
}
後、socket(AF_PACKET, SOCK_DGRAM, ntohs(ETH_P_IP))の間違い。
>>816 getsockname でこちら側のIPアドレスを得て、
あとはifconfigのソース読んで・・・
>>817 きめうちで"eth0"ぶちこんだらできました
ETH_P_IPが見当たらなかったので 0 にしちゃったけど動きました
まあそれはあとでなんとかするとして
具体的な流れとしては、調べたいソケットに対して
1. getsocknameでIPゲット
2. ???でインターフェース名を取得
3. SIOCGIFHWADDRでMACアドレス取得
こんな感じですかね
これから2.を調べます。
>>819 > ETH_P_IP
たしか <net/ethernet.h> とかにあると思う
>>819 > 1. getsocknameでIPゲット
Routingによるんで、
外へでるインタフェースが複数ある時はこれではダメ。
routring tableはioctl(2)で取得可能。
インターフェース名も分かる。(netstat -rを参照のこと)
ETH_P_IPは、AF_PACKETなsocketとして使わない時は必要ないんでした。
>>821 自分が待ちうけのプログラムで、相手と接続しているときの
ソケットを使ってgetsocknameすれば相手と接続しているはずの
IPアドレスが取れるかと思ったけど、そうでもないんですか?
たとえば、自分自身へ接続するときも localhostで接続と
IP指定で接続したときとで 自分のIP がきちんと変わっていたので
安心していたんですが
要するに、packetが出ていく時のMAC addressが欲しいんでしょう? Local sideのIP addressなんて、どのinterfaceから出ていくかに全く関与しないよ。 IPのroutingの常識。その辺から勉強し直して、netstat -rの結果を理解して。 ARP table見て 、IP address/MAC addressの対応が分かっても、 packetの出ていくinterfaceとは何の関係もない。
今回は複数NICがあってもルーティングはしないので 別にその辺は厳密じゃなくてもいいので すみません
「今回は」ということならば、それで一向に構いません。
> Local sideのIP addressなんて、どのinterfaceから出ていくかに > 全く関与しないよ。 全くっていうのは言い過ぎでは? まあ待ち受け側の場合は原則としては関与しないで正しいけど、 片側が private network で、片側が the Internet であるような 場合、たとえ待ち受け側であっても、通信に使われる interface の IP アドレスと、getsockname() で得られる IPアドレスが等しい ような運用をしていることがほとんどでは?
827 :
デフォルトの名無しさん :05/02/08 10:16:20
IPv6!IPv6!
>>829 全てのanonymous FTPサーバでダメか?
つか、そのくらいの質問なら書けや。なんであっちこっちとばにゃならんねん
833 :
804 :05/02/09 02:37:19
ちょっと進んだので書きます。 GetQueuedCompletionStatusを叩いていたスレッドは死んでませんでした。 メインスレッドからPostQueuedCompletionStatusしたら、ちゃんとウェイクアップ してました。 って事で、スレッドもIO完了ポートも死んでませんでした。 死んでいた様に見えたのは、より下のレイヤ、良く分かりませんがWinsockに何かが 起こったからの様です。その為に一切のイベントが上がって来なかった為にスレッド が死んでいる様に見えたというだけの様です。 その現象が発生した後には、ライブラリ内のソケット生成等も失敗していた様でした。 という事で、こういった現象を知っていたら何か教えて頂けないでしょうか。
834 :
デフォルトの名無しさん :05/02/09 05:20:57
i゙::::|;;;;| |;;;;;| |::::::::::| |:::::::::::::::::||::::::::::::::::::::::::::::::::| . i゙::::::i ''''''''''' '───' |;;;;;;;;;;;;::::::::::::::::::::| .|:::::::|,-====-´ ゙ヽ,,,,,,,,,,,,,、 |:::::::::::::::::::| |;::::::::|,-──、 ~,.--`‐、 |:::::::::::::::::::| `ヽ、i )__r'´ )__|;::::::::::::::/ なんで、人がゴミのようなん? . ヽ、__、/< ヽ、__、- /^゙-、;;;;/ { ' ' '-'~ノ λ ____ /-'^" ヽ,_ `ー─''´ ( /`''丶、 , - /^l
>>835 お前の目がゴミしか通さないフィルターだから
何で眼鏡・・
840 :
デフォルトの名無しさん :05/02/10 20:21:26
UNIXでCでソケットプログラミングしてます。すごく初歩的 な質問です。 サーバをつくる際に socket -> bind -> listen -> accept -> read という段階を踏みますが、HTTPやSMTPでは通信の区切りを CRLFとしますよね。 通常、このCRLFの検出はreadで受信データを1バイトずつ 読み込むこんで自分で判定するのでしょうか? それとも高水準入出力のfgetsとか使うのでしょうか? はたまた他にすごく良い方法があるのでしょうか? 申し訳ございませんが教えていただきたく存じます。
折角目的設定ができたんだから他人の書いたソースコードを見てみるのが いいと思うよ。
fgetsかreadで自分ででっかく取ったバッファに一気読みして自前で解析。
>readで受信データを1バイトずつ
は最悪。
>>1 のFAQも読んどけ。
843 :
デフォルトの名無しさん :05/02/10 20:49:21
>>842 ありがとうございます。
readでバッファをとる場合、readの返値が0の時がそのストリームの
終りと判断すべきなのでしょうか?
これが0になることってあるんでしょうか?
あります
>>844 ありがとうございます。telnetクライアントで試すと、いつまでたってもサーバの
readの返り値が0にならないのですが、、、どうゆうふうにすればよいのでしょうか?
>>845 >readでバッファをとる場合、readの返値が0の時がそのストリームの
>終りと判断すべきなのでしょうか?
その通りです。ストリームが閉じられる前に、
「読み取れるデータがない」等の理由で0になるということはありません。
ひょっとしてクライアントがflushしたときでしょうか? それともソケットをクローズしたときでしょうか?
>>847 close とたとき、shutdown でクライアントからの方向をshutdownしたとき、です。
一般にTCPプロトコルは、何らかの上位プロトコルと供に用いられます。
データ区切り等は上位プロトコルで規定されます(cr lf等)。
851 :
デフォルトの名無しさん :05/02/13 18:33:57
複数のクライアントが接続ができるようなサーバーを作っているのですが、 新規に接続があったかどうかを調べるにはどうしたらいいのでしょうか。 selectでできますか?
853 :
デフォルトの名無しさん :05/02/13 18:51:47
理論上はそうかもしれません。 しかし世の中には理論で割り切れないこともたくさんあるんです。
できます。
typedef struct{ int hoge; } CLIENT; // 以下のどちらかをメインの関数から引数をわたしてCreateThreadする。 DWORD WINAPI ThreadExampleA(LPVOID lpVoid) { CLIENT *client; client = (CLIENT *)lpVoid; // この場合、static宣言されてないclientはこのスレッドから別の関数を呼び出して // そこから戻ってきた時おかしな値になることはありますか? } DWORD WINAPI ThreadExampleB(CLIENT *client) { // これは邪道ですか?引数はLPVOIDにすべきですか? }
>>855 スレ違い。ここはネットワークプログラミングのスレだぞ。
まあネットワークのプログラムにスレッドはかかせないが。
CreateThreadの引数に入れる関数は、あくまでエントリポイントでしかない。
エントリ関数の中で呼んだ関数は、そのスレッドに属することになる。
つまりExampleAでclientにstaticをつける必要はない。
Bは別に邪道というわけではなく、ごく一般的な書き方。それでいい。
あぁぁごめんなさい。
「マルチスレッドプログラミング相談室 その3」
に書き込むのを誤爆しました;
>>856 どうもありがとうございます。
1回目のExampleAが終了していない間に2台目のクライアントが接続してきて、
2回目のExampleAがCreateされたときstatic宣言していると一回目のclient->hogeが上書きされてしまい
staticをはずすと回避できたので、、、メモリが同じなのかと思いました。
CreateThreadからの引数はCLIENT型の&client[c]みたいにしていました。
Bで行こうと思います。
あるFTPサーバに対して、WinInet.dll のFtpPutFile関数を使用して lzh形式の圧縮ファイルをアップロードしているのですが、タイムアウト になってしまいます。 他のFTPサーバ(IIS)には問題なくアップロードできています。 また、FFFTPを使用して同じファイルをアップロードするとうまくいきます。 FFFTPではできているので、何か考慮が足りないのだと思うのですが、 どんなことが考えられるのでしょうか?
passiveじゃないとダメなのにactiveでやろうとしてるとか?
質問です TCP/IPはUDP/IPと比べて信頼性があり、送信された順番にパケットが到着することが保証されているとのことですが、 ポート番号が違った場合どうなるのでしょうか? 例えば ・TCPポート1を使用してデータAを送信 ・TCPポート2を使用してデータBを送信 ということを行った場合、必ずA,Bの順序で到着するのでしょうか? とりあえず実験してみた結果、順序どおりだったのですが、実際はどうなんでしょうか。
>送信された順番にパケットが到着することが保証されている というか、到着した場合、送信された順番に到着したことが保障される。ということですな。 >ということを行った場合、必ずA,Bの順序で到着するのでしょうか? ポートが違えばソケットも違うから、そんなことは保証されてないと思うけど。
なんか、車というものが道路の上を走るものだということを知らずに 車の運転を習いたいって感じの質問だな。
>>861 具体的に書けば、ポート1のデータが何処かでドロップされ、再送信されている間にドロップの
起こらなかったポート2のデータが先に届くという場合がありえる。
順序保証は同一接続内での話。
>>863-866 貴重な情報ありがとうございます。
実験ではたまたまうまくいってただけなんですね。
もう少しTCPとUDPについて勉強してみようと思います。
有難う御座いました。
868 :
デフォルトの名無しさん :05/02/19 16:51:37
・・・
???
●●●
RST
ACK
874 :
デフォルトの名無しさん :05/02/20 07:16:58
サーバー側でクライアントが切断したことを知るにはどうしたらいいんでしょうか。 C言語を使っています。
NetBEUIの共有の話でつか?
876 :
デフォルトの名無しさん :05/02/20 09:03:06
いえ、普通のソケットです。
877 :
874 :05/02/20 09:53:07
クライアントが普通に切断したときもそうですし、 クライアントが異常終了したときの処理も教えてください。
close(s);
>>877 select() & recv()してるならイベントが来るのでそこで分かる。
してないなら次にsend()なりrecv()なりした時に分かる。
もちろん戻り値やerrno(WSAGetLastError())をちゃんと見て
いればだが。
880 :
デフォルトの名無しさん :05/02/20 11:01:54
パケットの送受信が行われなくなってから、5秒くらい待って、TCPでパケット送ってみたら? 応答無し/エラーなら終了してる。
>>874 クライアントが突如ダウンしたり、
ネットワークから切り放されたことも知りたい?
そういうのを知ることはできないので、(エスパーじゃないので当たり前)
普通タイムアウト処理でクライアント無反応処理の全てを賄います。
それで、タイムアウト検知をシステムにやって欲しければ、 SO_KEEPALIVEで時間をsetsockopt(2)します。 socket FAQもちゃんと読んでね。
どうもありがとうございます。 クライアントから閉じた時は、select()の後のrecv()が0を返すようです。 クライアントが落ちたときの処理は、 一定時間でpingを送ってpongが帰ってこずタイムアウトになったら 落ちたと判断することにしました。
>一定時間でpingを送ってpongが帰ってこずタイムアウトになったら >落ちたと判断することにしました。 これはまずい。
pingを返さない環境最近多いよね。
KEEPALIVE使うと、接続ごとにping/pongしてくれて、 socket API上で分かるんだけどな。(recvのerror等)
NAT越しも多い。
>>884 まずくないときもある
環境限定ならそれもいいさ
まあ fail over 用途なら ping でもいいだろうな。 一般向けアプリケーションなら論外だけど。
ルータ越しで接続するにはNATリゾルバとかが要るそうですが、 WinSockではどんな風に実現できますか? NATリゾルバ=IPマスカレード?
age忘れました。
> ルータ越しで接続するにはNATリゾルバとかが要るそうですが、 そんなもんは要らん。
NATリゾルバ…DirectPlay?
>>892 自分のグローバルIPをどこか適当なCGIで取ってもLAN組んでたら
行く先がないのでは?もっと単純な方法があるのでしょうか?
そもそも自分のグローバルIPなんてものを使わなければ 何の問題もない。せっかくNATが変換してくれてるんだか ら、NATに万事任せれば?
>>895 LAN-A内のPC-Aでサーバ。LAN-B内のPC-Bでクライアント。この間(インテーネッツ)で通信をしたいとする。
PC-BからPC-Aに繋げる時にPC-Aを識別するにはどうしたらいいんでしょうか?
私はPC-AのグローバルIPとLAN-A内のローカルアドレスが必要だと思っちゃうのですが・・・
P2Pの話ならはじめからそういえよ。
サーバーって言ってるんだから、P2Pとは違うんじゃないの?
>>896 LAN-Aのファイアウォールに穴を開ければ問題ない。
> 私はPC-AのグローバルIPとLAN-A内のローカルアドレスが必要だと
NATを使ってるってことはPC-AにはグローバルIPなんてついて
なくてプライベートIPなんじゃないのか?
だとすると、PC-Bが必要なのはLAN-Aのファイアウォールの
グローバルアドレスと、ファイアウォールに開けた穴のポート番号
だけ。
>>898 普通にconnect()関数にグローバルIPとポート番号入れて
使えばよいのですか?
ちゃんとファイアウォールに転送の設定が入ってればね。 あとはNATがよろしくやってくれる。 つーか、NATって network address translation なんだから アドレス変換してくれなかったらNATじゃないしー。
FTPのアップロードでタイムアウトになると質問した者です。
レス頂いたのに返事が遅くなって申し訳ないです。
>>860 ずばり、アドバイスの逆でした。
passiveが不可でactiveにしたら出来ました。
まさかpassiveが不可とは盲点でした・・・。
おかげで解決できました。ありがとうございます。
>>859 良いツールを教えて頂いてありがとうございます。
似たようなのは使ったことがあったのですが、
こっちの方が自分には使いやすいです。
結局、知識不足と自分の頭が固いのが根本の原因・・・もっと勉強します!
activeってなんだかな
904 :
デフォルトの名無しさん :05/02/22 21:43:22
ttp://www.geocities.jp/wininet_dll_jp/ このHPをサンプルに使って、POST処理を作ってみたのですが、
POSTのボディ部をPHPの受信側が受け取りません。
パケットキャプチャしてみた結果では、ボディ部はちゃんと
送信していました。
同様にPHPで作ったPGでPOSTしてみて、
結果ではうまく値がわたったので、受信側はうまく動いていると思います。
どうぞよろしくお願い致します。
スレ違いではあるかもしれないが・・・ WebProg板でもないような
>>904 Content-Typeをapplicaiton/x-www-form-urlencodedに設定したらどうだろう
むかしそれでPHPがPOSTを受け取らなかったことがある
(今はしらんが)
908 :
904 :05/02/22 22:52:14
>>905 >>906 言われてみるとソケットはつかってませんね。
すみません。
>>907 WinInetでは、Content-Typeは自動で設定されてるっぽいです。
手動で書く方法探します。
ありがとうございました。
909 :
904 :05/02/23 13:00:33
>>907 教えてくださった方法でPOSTできました!
ありがとうございます
910 :
デフォルトの名無しさん :05/02/23 19:42:49
>>910 結構前に何処かのスレでそれ見たけど、急募ってのが気にいらねぇ。
個人の集まりでやろうってのに、技術系すべていないからって急募なんて書くな。
参加してみようなんて思ったが最後、
お前らの無茶な注文を、無茶な期限で要求されるんだろ?どうせ。
多分マルチなんだろうな つーか、基本設計すらまともに出来てない時点で急募なんてありえない
何気なくしらべてみたら、
どっかのMMO開発コミュニティのサイトに出入りしてた奴みたい。
で、
>>910 のリーダーは作れ作れ!!ってタイプの人で、もめて抜けた模様。
んでもって対抗意識燃やしてサイトを立ち上げたってことらしい。
まぁ、技術者は関わらんほうが身のためやね。
なんか定期的に涌いてくるよね。ウジムシみたいに。
よせよ。ウジムシが聞いたらあんなのと一緒にするなと怒るぞ。
おまえら本物のウジムシ見たことあるか?
小学校のとき、机の中で半年間熟成させていた西田君のパンに群がるそれを見た。
隣に住んでいた人にたかってた。 そのときまで住んでいると思ってたが 発見時はすでに過去形だった。
920 :
デフォルトの名無しさん :05/02/24 10:53:02
外に置いていた犬のえさ(開封済み)にうじゃうじゃ入ってた
↑見ちゃだめ
>>922 そんな事言われると見たくなるじゃん・・・・。
消えてる・・orz 何だったのかキニナル
927 :
デフォルトの名無しさん :05/02/25 07:39:57
自分のシステムにあるEthernetインターフェースすべてを取得する方法だれか知っていますか? 最終的にはそれらのMACアドレスがほしいのです。
>だれか知っていますか? 知っています。これで満足ですか?
>>927 その質問でお前が知りたい環境がわかる人がいるとおもうのか?
931 :
デフォルトの名無しさん :05/02/25 08:29:02
あい変わらずじゃのお。
>>930 どうもでした。
自分の環境かかないやつはWindowsと仮定しとけばおけ つーことか。
このレベルだとネットワークというよりは単にWin32APIについての質問っぽい・・・
APIの使い方とCそのものの使い方を外して、ネットワーク限定の質問なんてあるのか?w
ネットワーク限定の質問ならいくらでもあるだろ。 ただ、プログラミングの質問は殆ど消えるけどなw どちらかと言うと概念とかのネットワーク技術系だなw
>>934 いっぱいあると思うけど。
つい最近でたものだと、PHPはPOST受けるときにContent-Typeの選り好みが厳しいという話とか、
TCPのパケット(データ)順の保証はストリーム単位だという話とか、
同時接続数が異様に多い場合には接続毎にスレッドを立てるのは好ましくないという話とか。
それ通信技術板の範囲にならない? 何もプログラミング限定の話じゃないような・・・。
ここは ネットワークプログラミング相談室 Port12
half-closed関係の話題は、 APIの使い方、Cそのものの使い方とは外れたところの議論も、 ネットワークプログラミングの話題だな。
Winsockで送信バッファにたまってるデータのサイズを取得するにはどうすればいいでしょうか? 送信バッファの最大サイズではなく送信バッファにたまってるデータのサイズです。
取得不能。はい次
Winsockで送信済みのデータのサイズを取得するにはどうすればいいでしょうか? 送信バッファへの送信サイズではなくデータリンク層への送信のサイズです。
取得不能。はい次
944 :
デフォルトの名無しさん :05/03/01 09:27:44
しばらくデータを転送していて、あるときrecvした瞬間、 PC全体が回線から切断される場合としてどんな場合が考えられますか? recvした後、エラーがあったことを確認した時点で、 既に切断されているんですが
「recvした瞬間」に「PC全体が回線から切断され」るんじゃなくて、 「PC全体が回線から切断され」た瞬間に、recvがエラーで返るんじゃないの?
ワシもソレに一票 ハードを変えてみるとか原因究明してみては
その方向で検証してみます。 ありがとうございました。
>>948 使っているOSの方面で調べるのもいいかも。
たとえばUNIXの一派は、IPアドレスが重複しているのを見つけると、
「PC全体が回線から切断」します。インターフェースが"down"するから。
--------------------Configuration: SimpleNetwork - Win32 Debug-------------------- Linking... main.obj : error LNK2001: unresolved external symbol "int __cdecl DoWinsock(char const *,int)" (?DoWinsock@@YAHPBDH@Z) Debug/SimpleNetwork.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe. SimpleNetwork.exe - 2 error(s), 0 warning(s) wsock32.libとwinsock.libを追加してるのこのメッセージが出ます。 よろしければ解決方法をお教え下さい。m(__)m
DoWinsock関数を含んだ.cppファイルがリンクされてないだけ っつーかスレ違い
なんかもう、すべてが釣りに見える今日このごろ。
お取り込み中大変恐縮ですが、 次スレの時間です。
このスレの進むペースだと、あと4日くらい余裕があるヨカーン 釣られなければ。
リアルタイムにネットワークの転送量を表示したいのですが、 式はどうなるのでしょうか? dwInOctets dwInUcastPkts dwInNUcastPkts は表示できるのですが、Octetsは通信してない時も値が入ってますし・・ どうかよろしくお願いします。
例えば、dwInOctets の値を毎秒調べて前回からの差を求めれば、 最近1秒間の転送量がわかるべ。 つうか、WindowsならWindowsだと書け。
dw〜 の名前でWindowsってわかるだろ? こういうのを自明っていうんだが。
自明でも、質問する時に前置きするのはマナーだと思われ。 そんなこといったら、dwInOctets の差分取れやってのも自明だし笑。
マルチ野郎は無視するのが一番
どの OS のどの API かも書かないような出し惜しみ野郎も無視するのが一番。 質問者としては最低だな。
回線が切断されたらrecvは0を返すんじゃないか?
あれから色々試しましたが、未だに原因がわかりません。
詳しい状況を書くので、どなたか原因に心当たりはございませんか?
[現象]
Winsockを使ってしばらくデータを転送していると、
PCごとネットワークから切断される。
あるときselectの戻り値が0になるので、
Errorを調べるとLastErrorは0になっているので、
通常のタイムアウトが起こっているようです。
>>946 >>947 がご指摘の通り、まずPCがネットワークから切断されて、
その結果selectがタイムアウトを起こしているように思えます。
切断されるまでは、ループ内で延々ReadFileを使ってソケットからデータを読み出してます。
(recvを使った場合も同じ現象が起こります。)
ネットワーク切断時、相手からの送信は届いているのに、
こちらからは送信できない状態がしばらくの間続くみたいです。
でも、shutdownやclosesocketはその時点では使われていないはずです。
ネットワークのプロパティから、ローカルエリアネットワークを一度無効にして、
再度有効にしようとすると、'接続に失敗しました。'というメッセージが表示されます。
[環境]
OS - Windows XP Professional SP1
開発環境 - Delphi 6 Professional
PCはルータ内です。
プログラムを起動していたPCが切断されても、LAN内の他のPCは切断されません。
以上、どなたかご教授ください。
安物NIC使ってるんじゃねーの。
色々試した色々の内容を言わないわけだからナメてるよな
つまり、何もしてないという事か
>>963 試しにNIC交換してみては?
見当違いなら申し訳ない。。。
名前欄消すの忘れてた...orz
>>963 あのね、それは完全にNICに繋がってるケーブルの断線不良の症状。
接点復活剤とか使ってみ。
お騒がせしました。
どうやらNICの問題のようなので、後日新しいものを購入して実験します。
マザーボード上のNICを使っているため、交換はできませんでしたが、
別のPCから実験したところ、通常通り当該接続のみ切断されました。
>>968 >>970 どうもありがとうございました。
972 :
デフォルトの名無しさん :05/03/03 02:41:47
Port13の時期か。 俺は最近スレッドを立てたから無理。
Unicode文字列バッファをそのまま送信することについて所見を伺いたい。
>>974 別に問題無いと思われ
受信側の解釈が問題なだけで
そうは言っても、エンディアンの異なる環境では当然Unicodeのバッファの並びも違うよね?
>>977 ということは、数字の"1"をUnicodeで表現した場合、
プラットホームに依らず、「0x31 0x00」の順番ってこと?
どっちがどう違うのか。 いい加減、本当のこと教えてもらえないだろうか?
982 :
デフォルトの名無しさん :05/03/03 09:49:14
まだか?
>>976 Unicodeは文字セットであって符号化方式ではない。
符号化するんなら UTF-8 なり UTF-16 + BOM なり UTF-16LE なり
UTF-16BE なり決めればプラットフォーム依存なんてしない。
「バッファをそのまま送信」したいんなら、「このプロトコルでは
UTF-16LE にします」とでも決めればよろしい。
もうね、CPUはインテルタイプだけ使っていればいいんだよ
インテルもItaniumやXScaleはbi-endianだったりするが。
SJIS、EUC用に作った文字列操作ライブラリをUNICODE用に移植した場合に、 中途半端にちゃんと動くリトルエンディアン。 ビッグエンディアンだと、かなり手を入れないと明らかにおかしな動きをするので プログラマが移植に真剣に取り組む効果が期待できると思う。 ビッグエンディアンの方が潜在バグが消滅するまでの時間が短くなる希ガス。
>>988 氏ね。
>>963 プログラミング関係ないんじゃないの?
その他アプリも接続が中断するんでしょ?
990 :
デフォルトの名無しさん :05/03/03 12:48:24
マジレスすると、特定のOS依存でプロトコル公開するつもりも なければ、どうでもいいんじゃないの? インターネット標準を目指すのなら論外なのでやめるべき。 Informational な RFC を目指す場合も、まあ好まれないのは 間違いない。 ネットワークの勉強をする場合も、OS/機器独立な表現の仕方 くらいは知っておくべき。分かってて状況に応じて使うのなら 問題ないが。
逝`
994 :
デフォルトの名無しさん :05/03/03 22:24:22
994様
995リラ
996 :
デフォルトの名無しさん :05/03/03 23:22:30
996 octet
1000をとれと?
998 :
デフォルトの名無しさん :05/03/03 23:25:08
htons(998);
3*3*3*37
1000 :
デフォルトの名無しさん :05/03/03 23:25:57
↓1000ゲットおめでとう。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。