ネットワークプログラ ..
237:デフォルトの名無しさん
08/06/01 00:14:20
HRESULT h;
h = URLDownloadToFile( 0, http, file, 0, 0 );
switch(h){
case S_OK:
printf( " success.\n" );
break;
case E_OUTOFMEMORY:
printf( " E_OUTOFMEMORY\n" );
break;
case INET_E_DOWNLOAD_FAILURE:
printf( " INET_E_DOWNLOAD_FAILURE\n" );
break;
default:
printf( " error?\n" );
break;
}
上のようにしてやっているのですが、 h が default の値しか返さなくて何が原因なのかがわからないのです。
238:デフォルトの名無しさん
08/06/01 00:20:46
値を表示してみるという思いつきができないのか
なんというゆとり
239:デフォルトの名無しさん
08/06/01 00:24:56
defaultを使わないでもっと絞ればいいだろ
240:デフォルトの名無しさん
08/06/01 00:31:06
>>238
戻り値は -2146697510 です
意味わかるんですか?
241:デフォルトの名無しさん
08/06/01 00:32:33
>>239
リファレンスには
S_OK
E_OUTOFMEMORY
INET_E_DOWNLOAD_FAILURE
の3つしか 特に戻り値として明記されていませんでしたので これ以外の戻り値は わかりません。
242:デフォルトの名無しさん
08/06/01 00:40:10
仕様書か実装のバグだね
MSに抗議しないと
243:デフォルトの名無しさん
08/06/01 00:40:42
リファレンス外の戻り値を返すとかどんだけ糞なライブラリorリファレンスだよ
244:デフォルトの名無しさん
08/06/01 01:10:01
-2146697510 = S_OK + E_OUTOFMEMORY + INET_E_DOWNLOAD_FAILURE
245:デフォルトの名無しさん
08/06/01 01:12:17
>>244
おまえすげえなwww
3つの戻り値の和を返すというのはいったいどういうことを言いたいんだろうかこの関数は
246:デフォルトの名無しさん
08/06/01 01:20:04
>>244
1245206じゃハゲ
テキトーなこと抜かしてるんじゃねーよボケ
死ね工作員
247:デフォルトの名無しさん
08/06/01 01:40:25
一体何の工作だ
248:デフォルトの名無しさん
08/06/01 01:52:00
FACILITYの意味からして足すのはありえんと思うんだが
249:デフォルトの名無しさん
08/06/01 01:54:15
-2146697510 = S_OK | E_OUTOFMEMORY | INET_E_DOWNLOAD_FAILURE
250:デフォルトの名無しさん
08/06/01 01:55:03
>>248
ビット和だろ常考
251:デフォルトの名無しさん
08/06/01 01:59:40
-2146697510を16進数に直すと0x800bfeda
8 は失敗をあらわす。
b は FACILITY_CERT で、電子証明書関連のエラーだとわかる。
feda は不明。
httpsで繋ごうとして何かがまずかったんだなとはわかるね。
252:デフォルトの名無しさん
08/06/01 02:09:45
winerror.hに詳しくなるスレはここですか
253:デフォルトの名無しさん
08/06/01 04:57:28
スタック破壊してんじゃネーノ
254:デフォルトの名無しさん
08/06/01 05:07:10
ネットワーク接続を切る、接続するAPIってあるんでしょうか?
言語は C/C++ Windowsでお願いします
255:デフォルトの名無しさん
08/06/01 05:08:39
あるよ。
256:デフォルトの名無しさん
08/06/01 05:19:49
>>255
何でしょうか?
257:デフォルトの名無しさん
08/06/01 05:23:23
Winsock
258:デフォルトの名無しさん
08/06/01 05:49:25
すいません 間違えました
ネットワークでなく インターネットの接続です
259:デフォルトの名無しさん
08/06/01 05:50:53
どう違うんだ
260:デフォルトの名無しさん
08/06/01 05:53:14
稀にIPじゃない場合もあるか否か
261:デフォルトの名無しさん
08/06/01 05:56:17
IPじゃないってドメインのことか?
ドメインならgethostbynameでIPに変換可能
あとは一緒
262:デフォルトの名無しさん
08/06/01 05:56:57
ネットワーク接続 WNetConnectionDialog関数を使ったら
URLリンク(sakuratan.ddo.jp)
のようなダイアログがでたのですが、これではないやつで
インターネット接続関連のダイアログがでてくると幸いです
263:デフォルトの名無しさん
08/06/01 06:02:35
>>261
Internet Protocolを使ってないコンピュータネットワークもあるってこと。
264:デフォルトの名無しさん
08/06/01 06:30:21
connect() 関数じゃないですよ?
265:デフォルトの名無しさん
08/06/01 06:51:53
物理的にネットワークアダプタを抜いた状態と同じ環境にしたいってことです
266:デフォルトの名無しさん
08/06/01 07:41:40
>>263
あるわけないだろ。
ばか?
267:デフォルトの名無しさん
08/06/01 07:45:56
>>266
うせろキチガイ
268:デフォルトの名無しさん
08/06/01 07:47:43
>>266 が無知なのは分かったw
269:デフォルトの名無しさん
08/06/01 08:31:21
>>268が無知すぎる件
ある意味犯罪
270:デフォルトの名無しさん
08/06/01 09:43:55
>>269
アナタを・・・
telnetです・・・
271:デフォルトの名無しさん
08/06/01 15:34:01
>>266,269
AppleTalkとかIPXは?
272:デフォルトの名無しさん
08/06/01 15:34:40
>>265
Win32APIでネットワークアダプタを無効にするとか
やり方知らんが多分できるとオモ
273:デフォルトの名無しさん
08/06/01 15:48:13
WindowsでSockRAW取れないのですが
どうしてですか?XP SP2です
274:デフォルトの名無しさん
08/06/01 16:05:42
覗くなということだ
275:デフォルトの名無しさん
08/06/01 18:13:05
>273
ググればすぐわかる。
276:デフォルトの名無しさん
08/06/01 19:20:30
MMORPGのサーバとクライアントの同期化について知りたいのですが、
何か参考になるものとかありますか?
277:デフォルトの名無しさん
08/06/01 20:02:12
韓国語を覚えたほうがいいかもね
278:デフォルトの名無しさん
08/06/01 23:23:04
>>277
理由は?
279:デフォルトの名無しさん
08/06/01 23:37:34
市場の8割がチョン製クリゲ
280:デフォルトの名無しさん
08/06/02 04:57:58
日本ってなんで情報なかったりするんだろう(・ω・)
281:デフォルトの名無しさん
08/06/02 10:36:41
日本のゲーム業界特有の情報閉鎖性もあるけど
オンラインゲームが流行ったときに不況で
誰も手を出さなかったとういのもあるかも
そして>>279
282:デフォルトの名無しさん
08/06/02 13:03:35
商売がヘタクソってのも多いと思うな>日本のメーカー
あからさまな出し惜しみとかして客に逃げられるパターンが多すぎる
283:デフォルトの名無しさん
08/06/02 13:30:29
商売というか、小汚い金の稼ぎ方が日本人にあわないんだろうね
あっちの人たちは金が儲かれば形振りかまわないから成功はする
名声はないけど
284:デフォルトの名無しさん
08/06/02 14:20:06
うん,高度成長期の日本そっくり
285:デフォルトの名無しさん
08/06/02 14:23:01
パンヤもみんゴルのパクリといわれてるし、
その他もろもろパクリは多いよな。
そりゃ作るのは楽だよ
開発で使ってるソフトも平気で割れでやってそうw
286:デフォルトの名無しさん
08/06/02 16:21:36
>>285
ネットランナー・・・
287:デフォルトの名無しさん
08/06/03 21:38:57
WinSockでソケットのポート番号を
sockaddr_in add;
int addlen =(int)sizeof(add);
getpeername(Sock, (struct sockaddr *) &add, &addlen);
char buf[50];
_itoa_s(add.sin_port,buf,(int)sizeof(buf),10);
といった感じで取得はできましたが
IPアドレスを取得するにはどうすればよいでしょうか?
288:デフォルトの名無しさん
08/06/03 22:20:02
getpeernameで返してもらった連中を
getnameinfoにでも突っ込めば。
289:デフォルトの名無しさん
08/06/03 22:35:15
sockaddr_in だと長さ足りなくないか
290:デフォルトの名無しさん
08/06/03 22:54:40
【エアー調査会社】HG嫁 住谷杏奈61【ハッカー妊婦】
スレリンク(ms板)
291:デフォルトの名無しさん
08/06/04 01:37:08
ネットプログラム初心者です。
ネットゲームのプログラミングが目的なのですが、
コネクション数は1〜200あたりで、OSがwindowsXPとした場合、
URLリンク(www.kt.rim.or.jp)
を読む限り、WSAAsyncSelectかWSAEventSelectを使うのが良さそうですが
どうなのでしょうか。
292:デフォルトの名無しさん
08/06/04 01:46:06
「Winsock標準に準拠」にこだわるのでなければ(もはや意味なし)
IOCPにしとけ
293:デフォルトの名無しさん
08/06/04 01:48:59
期待した動作をしなくてもくじけないココロがあるならなんとでもなるZE!
294:デフォルトの名無しさん
08/06/04 01:57:35
まったく使ったことがないのでよくわかりませんが、
select 毎回の引数の処理が無駄
WSAAsyncSelect,WSAEventSelect メッセージの通知が遅い
IOCP とにかく速い、プログラムは難しくなる
で良いでしょうか?
ROのエミュ鯖ではselectが使われてて、引数の処理が入ってたのは見たなぁ。
295:デフォルトの名無しさん
08/06/04 02:18:41
selectの64制限は確か#defineで回避出来たと記憶してるが
WSAEventSelectの64制限(WaitForの制限)は
複数のスレッドに64以下ずつわけるしかないんじゃなかったかな。
296:デフォルトの名無しさん
08/06/04 02:29:14
複数のスレッドになると難しそうですね。
マルチスレッドもネットプログラミングの経験もない自分的には
ひとまずselectが良さそうな気がしてきました。
オープンソースのmmoが2つともselect使用しているみたいなので、実装例見れますし。
297:デフォルトの名無しさん
08/06/04 20:45:00
pthread_mutexって10万個作って使っても
問題ない?
298:デフォルトの名無しさん
08/06/04 20:59:21
>>297氏とは違うのですが、ミューテクスとセマフォを分かりやすく説明できる方いないでしょうか?
ググッてみたけど、どこも似たような分かりにくい説明が多いです。。
299:デフォルトの名無しさん
08/06/04 21:22:02
ミューテクスは複数のスレッドがあった場合、順番に処理するのに対して、
セマフォを複数のスレッドが同時にアクセス可と言う考え方でいいのでしょうか?
300:デフォルトの名無しさん
08/06/04 22:06:23
セマフォは5個の資源を10人で使うというような考え方。
listenの引数みたいなというか
301:デフォルトの名無しさん
08/06/04 22:14:35
>>300
係数1のセマフォならいっしょじゃねーか
嘘教えるな
302:デフォルトの名無しさん
08/06/04 22:17:22
>>298
ミューテックスは、同時にひとつのスレッドしかアクセスできない。
1人用のイスみたいなもの。 早いもの勝ちで1人だけが獲得できる。
残念ながら座れなかった人は、イスが空くまで待つ。
イスが空いたら、待ってましたとばかりに奪い合って、勝った人1人だけがイスに座れる。
負けた人は、またイスが空くまで待つ。
セマフォは、同時にアクセスできるスレッドの数を好きに指定できる。
3人まで座れるソファーとか、そういうの。
4人目が来たら、誰かがどくまで待つ。
1にすれば、ミューテックスとほぼ同じ。
303:デフォルトの名無しさん
08/06/04 22:25:50
>>301
だからそのものズバリだろw
教科書でミューテックス=二進セマフォという表記も使われる。
304:デフォルトの名無しさん
08/06/04 22:50:39
WinやRecursiveにしたときのpthreadは、Mutexは同じスレッドならば何度でも取得できるところが一番違う。
スレッドごとの排他制御にMutex、複数の資源管理にセマフォ、単一の資源管理ならどっちでもいい。
305:298
08/06/04 22:53:48
>>299-303
>>302さんの説明分かりやすかったです。ありがとうございました。
ググッても、どこも排他的とかいまいち理解しづらいですよね。。
306:デフォルトの名無しさん
08/06/04 23:25:22
なんというスレ違い
307:デフォルトの名無しさん
08/06/08 12:27:33
C++使いなのですが、socketの実装未経験です、
車輪の再発明はしたくないのでlinuxのsocketライブラリを探しています
CommonC++(commoncpp)というのを見つけたのですが
URLリンク(www.sunsite.ualberta.ca)
ソースコードを見てると使いやすそうなんですが、他にもオマイラお勧めの、良いライブラリとか
あったら教えてホスイのですが
boostにもsocketのライブラリがあるっぽいんだけど・・・・こっちの方が有名なのかな?
308:デフォルトの名無しさん
08/06/08 12:56:46
boostのがおすすめ
309:デフォルトの名無しさん
08/06/08 14:23:14
オマイラだと?何だその態度は
310:デフォルトの名無しさん
08/06/08 14:28:50
>>307
一度くらいは自分で実装するべきだ。その上で便利なライブラリを探すんだ。
車輪の再発明はしたくないって便利な言い訳だね。
311:デフォルトの名無しさん
08/06/08 14:41:01
別に使えるものは使えばいいんじゃねえの
いちいちカーネルやコンパイラから自分で書き起こしたりはしないだろ
312:デフォルトの名無しさん
08/06/08 21:49:25
>>307どえす
VS2005とgcc-4.1.2-33に、boost-1_35をスコーンとインスコして
asioをやりまくっているんだが
VS2005は、無問題、gccでコンパイルする場合
いちいちコンパイル毎、変数を設定するのがマンドクサイので
.bash_profileに
CPLUS_INCLUDE_PATH=/usr/local/include/boost-1_35; export CPLUS_INCLUDE_PATH
LD_LIBRARY_PATH=/usr/local/lib; export LD_LIBRARY_PATH
追加設定して
$ g++ -pthread -lboost_system-gcc41-mt sample.cpp
こんな感じでコンパイルしてて、今んとこ無問題なんだが、どうよモマイラ、
他にいい方法があったら聞いてやるが
313:デフォルトの名無しさん
08/06/08 22:12:11
Makefile
314:デフォルトの名無しさん
08/06/08 23:02:18
>>312
聞いてくれなくてもいいが
315:デフォルトの名無しさん
08/06/08 23:13:36
boostの非同期ライブラリおすすめ>>307
316:デフォルトの名無しさん
08/06/09 00:07:43
>>315
boost::asioも非同期ライブラリ持ってるんじゃないの?
317:デフォルトの名無しさん
08/06/09 10:02:28
ACEだな、やっぱでかいし
318:デフォルトの名無しさん
08/06/09 23:12:11
ごめん。
asioのことを言ったw>>315
319:デフォルトの名無しさん
08/06/10 21:12:45
ネットワークプログラミングの利点って何?
320:デフォルトの名無しさん
08/06/10 21:32:02
ネットワーク通信ができること。
321:デフォルトの名無しさん
08/06/11 03:25:33
宿題スレに質問投げておくと勝手にだれかが作ってくれる
これがネットワークプログラ
322:デフォルトの名無しさん
08/06/11 12:27:03
>>321
小人さんは間違いが多いのが欠点だ。
323:デフォルトの名無しさん
08/06/13 22:24:38
>>312どえす、おいモマイラ一週間ぶりに俺様が来ましたよっと>>310の言う通り、漏れはソケット初心者なので、動作を理解するうえで、薄いラッパークラス作っている
近い将来、サーバー側、クライアント側で行う動作を基底クラスで実装して、それぞれのクラスを派生させようと思うが、サーバー側とクライアント側で
何が共通手順なのか、今はまだよく分からないので、とりあえず前に進めるためおこなっていおる
どうよこんな感じで
class Socket {
int fd1, fd2;
struct sockaddr_in saddr;
struct sockaddr_in caddr;
int len;
public:
Socket() : fd1(0), fd2(0), len(0) {} // コンストラクタ
~Socket(){} // デスクトラクタ
void MakeSocket(); // ソケット生成
void InitSocket( sockaddr_in saddr) ; // ソケット初期化
void NameOfTheSocket( sockaddr_in saddr );// ソケットに名前を代入
void BindSocket( sockaddr_in saddr ); // ネームバインド
void ListenSock( int fd1 ); // リッスン
void AcceptSocket(); // アスペクト
void CloseSocket(); // ソケットクローズ
};
324:デフォルトの名無しさん
08/06/13 22:24:59
続き
void Socket::MakeSocket()
{
if ((fd1 = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
exit(1);
}
}
void Socket::InitSocket( sockaddr_in saddr )
{
memset((char *)&saddr, 0, sizeof(saddr));
}
void Socket::NameOfTheSocket( sockaddr_in saddr )
{
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = INADDR_ANY;
saddr.sin_port = htons(PORT);
}
void Socket::BindSocket( sockaddr_in saddr )
{
if (bind(fd1, (struct sockaddr *)&saddr, sizeof(saddr)) < 0){
perror("bind");
exit(1);
}
}
void Socket::ListenSock( int fd1 )
{
if ( listen(fd1, 1) < 0) {
perror("listen");
exit(1);
}
}
325:デフォルトの名無しさん
08/06/14 06:51:37
オブジェクト試行ですか?
326:デフォルトの名無しさん
08/06/14 07:58:40
sockの関数と1対1に対応するメソッドを作ってるうち恩恵を受けにくい。一連の決まった操作をひとつのメソッドにまとめてしまおう。
sockaddrはラップして、アドレスのクラスを作ってしまう。簡単にアドレスを設定できるようにするといい。
あと、言葉遣い直せ
327:デフォルトの名無しさん
08/06/14 08:00:05
JavaとかRubyとかPythonとかの
ソケットクラスの構成をみれば〜?
328:デフォルトの名無しさん
08/06/14 08:27:18
>>326
君はまずその変な日本語を直さないとな
他人の言葉遣いを指摘してる場合じゃないぞ
329:デフォルトの名無しさん
08/06/14 09:27:20
さて、些細な顰蹙をかっているようだが、2ちゃんねるクオリティーということで、まぁ許してちょんまげ
こんな感じで、完成形に徐々に近づきつつあると思うが、どうよ
class Socket {
struct sockaddr_in saddr;
struct sockaddr_in caddr;
public:
Socket(){} // コンストラクタ
~Socket(){} // デスクトラクタ
void SetAddresSocket( sockaddr_in saddr, unsigned short sock_family, unsigned short sock_port, int sock_addr ); // sockaddrラッパークラス
int DescriptSocket(); // ソケットを作り、成功したらソケットディスクリプタを返す
};
330:デフォルトの名無しさん
08/06/14 09:27:56
void Socket::SetAddresSocket( sockaddr_in saddr, unsigned short sock_family, unsigned short sock_port, int sock_addr )
{
saddr.sin_family = sock_family;
saddr.sin_addr.s_addr = sock_port;
saddr.sin_port = htons( sock_addr );
}
int Socket::DescriptSocket()
{
int fd1, fd2;
size_t len;
if ((fd1 = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
exit(1);
}
memset((char *)&saddr, 0, sizeof(saddr)); // 初期化
// バインド
if (bind(fd1, (struct sockaddr *)&saddr, sizeof(saddr)) < 0){
perror("bind");
exit(1);
}
if ( listen(fd1, 1) < 0) {
perror("listen");
exit(1);
}
len = sizeof(caddr);
if ((fd2 = accept(fd1, (struct sockaddr *)&caddr, &len)) < 0) {
perror("accept");
exit(1);
}
close(fd1);
return fd2;
}
331:デフォルトの名無しさん
08/06/14 09:34:50
しかしなんだね、g++ってVC8とは若干違うよね
accept()関数の第三引数の
accept(fd1, (struct sockaddr *)&caddr, &len))
lenだが、VC8ならintでも無問題なのだけど、g++はsize_tじゃないと嫌だと
怒ったりとかと少し戸惑う、>>330でした
332:デフォルトの名無しさん
08/06/14 09:54:59
POSIXではsocklen_tだけど、intで実害はない。
size_tとしてしまうのは誤り。
socklen_tとint(やsize_t)が同じサイズか判定をどこかに入れておくと安全。
// 偽なら負の添え字になりコンパイルエラー
#define STATIC_ASSERT(cond) extern int static_assert_array[ (cond) ? 1 : -1 ];
STATIC_ASSERT(sizeof(int) == sizeof(socklen_t))
333:デフォルトの名無しさん
08/06/14 10:05:46
>>332
Thx
物知りですね、勉強になります
gccの場合、accept()関数の第三引数は、int型でコンパイルに成功してたんだけど、g++でコンパイルした際にエラーが出たんで
なんでかなと思ってた、コンパイラに依存しないようにアサーションマクロを書いておくと、メモメモ
334:デフォルトの名無しさん
08/06/14 14:25:52
Winsockで非ブロッキングモードにしたいときは
selectでウインドウハンドルとそのウインドウのプロシージャを設定するけど
最初はウインドウAでメッセージ受けてたけど
次はウインドウBでメッセージ受けるように変更
とかいうことはできますか?
本当はウインドウハンドル指定しなくてよければ通信メッセージ受けるところだけ独立させたいんだけど
335:デフォルトの名無しさん
08/06/14 14:32:58
>>334
WSAEventSelectを使えばウインドウハンドルはいらない。
336:デフォルトの名無しさん
08/06/14 14:35:32
>>335
お〜 ウインドウハンドルいらない版もありましたか
ありがとうございまつ
337:デフォルトの名無しさん
08/06/14 16:12:06
winsockについてです
gethostbynameではwinsockが確保したメモリが返されてきますが
これはどうすると解放できるのでしょうか?
338:デフォルトの名無しさん
08/06/14 16:17:39
>>337
gethostbynameでググルと一番上に解説が出てくるし
339:デフォルトの名無しさん
08/06/14 20:59:48
>>329なんだけどさ
>>327
が書いてたんで、rubyのソケットのライブラリを見てたら、やっぱ個別に
sockの関数と1対1に対応するメソッドを持ってるよね
>>326は
1対1に対応するメソッドを作ると、恩恵は受けにくいと言うし
ネットワークプログラミングとは直接関係ないけど、どっちがいいんだろうな?
この問題にはいつも悩まされる
永遠の命題なのか・・・・orz
340:デフォルトの名無しさん
08/06/14 21:10:21
>>339
たとえば、自分向けのライブラリを作るなら、いきなりconnectで繋がって、closeで閉じるライブラリを作り置きしておくと、今後ずっと楽になる。
341:デフォルトの名無しさん
08/06/14 21:19:02
>>340
わかりやすい説明、ありがとう
たしかに、それは言えるのだけど、ついつい、かまえてって言うか、型にはめようとして
再利用性だとか、拡張性だとか、考えてしまいクラスの設計には、いつも苦労するんだよね、俺の場合
もう少し気楽に考えた方がいいかもね
342:デフォルトの名無しさん
08/06/14 21:26:20
>>341
共通の機能は基本クラスに、専用の機能は派生クラスに分散。一つのクラスで機能を欲張らないのが設計のコツ。
343:デフォルトの名無しさん
08/06/14 21:27:55
>>341
C/C++で書いてるんなら、いつでも下に降りられるから、ある意味
どうでもいい気がする。
rubyみたいな奴だと、標準で抽象度の高いAPIしか用意されてないと
そこより下に降りたければCでextension書くしかないって話になる。
だからそういう設計になってるんだと思うよ。
344:デフォルトの名無しさん
08/06/14 21:34:17
>>341です
皆さん、いい話ありがとう
345:デフォルトの名無しさん
08/06/14 23:34:33
TCP/IPで、自ソケットが生きてる場合、一時的に通信経路に問題があってもsendは成功すると
思いますが、その後すぐにその問題が解決したら、相手側には届くのでしょうか?
346:デフォルトの名無しさん
08/06/14 23:36:06
>>345
いつか届く。
347:デフォルトの名無しさん
08/06/15 04:36:59
僕の想いも届いて!
348:デフォルトの名無しさん
08/06/15 06:09:21
winsockを使っていますが
”こんにちわ” ”こんばんわ”
を相手が送信したときに
2つのメッセージに対して
FD_READが2回発生するときと
1回しか発生しないときがあります
2回発生するときは
”こんにちわ” と ”こんばんわ” を別々に取得できて問題ないのですが
1回しか発生しないときは
”こんにちわこんばんわ”という1つの文字になってしまいます
送信相手が1回送信するごとにFD_READが1回発生するように設定することはできますか?
できないとして1送信ごとに何らかの記号をつけて識別したりするのでしょうか?
349:デフォルトの名無しさん
08/06/15 06:29:10
基本的にできない。「こんにちわ」と「こんばんわ」を別のものとして扱うなら、それぞれの頭に俺プロトコルのヘッダ(メッセージ長など)を付けて送り、受信側でそれを解釈する。
あと、どーでもいいけど「こんにちは」と「こんばんは」だと思う。
350:デフォルトの名無しさん
08/06/15 10:57:00
そういうときこそ、
SCTP。
おまいら使ってる?
351:デフォルトの名無しさん
08/06/15 14:04:34
>>348
そもそも
「こ」「ん」「に」「ち」「わ」と5回に分かれてFD_READが来ることだってありえるぞ。
TCPとはそういうもんだ。区別したけりゃストリームに自前で区切情報載せろ
352:デフォルトの名無しさん
08/06/15 15:09:49
>>349 351
ありなとうございまつ
Sendの末尾に区切り文字入れれば
1回で複数受信してもOKじゃね?
とか思ったけど1送信あたりでも分離することあるのですかorz
しかしそうなると
「こんに」「こんばんわ」「ちわ」という受信すらありえるような
それともTCPは受信順番も考慮するからそれはないと思っていいんでしょうか?
353:デフォルトの名無しさん
08/06/15 15:32:35
つ[延滞]
必ずしも送った順に相手に届くとは限らない
この辺はUDPとTCPの違いを調べれば分かる
354:デフォルトの名無しさん
08/06/15 15:58:37
>>352
TCPは順番は変わらないよ!。
355:デフォルトの名無しさん
08/06/16 11:35:18
マルチスレッドなプログラムでsocketを使った場合に、
thread1(){ send("ABCDE"); }
thread2(){ send("abcde"); }
の2つのスレッドが同時にsendをコールした場合、
相手側でrecvした時に、
"ABCDE"と、"abcde"が混ざることってありますか?
例えば、"AaBbCcDdEe"みたいに。
シングルスレッドな場合だと、
send単位で送ったデータはそのまま出て来ますよね。
356:デフォルトの名無しさん
08/06/16 11:50:15
せめて"ABabcdeCDE"くらいの例えならな
357:デフォルトの名無しさん
08/06/16 11:52:11
1. netstat -a で見れる情報(プロトコルやアドレス/ポート ステータス)は
どこから持って来てるんでしょうか?
(同じ情報を自分のプログラムから取得するにはどうすればいいでしょうか?)
2. TDImonか同等のプログラムのソースコードはどこかにないでしょうか?
358:デフォルトの名無しさん
08/06/16 11:53:48
netstatのソース見ればいいんでねぇの?
359:デフォルトの名無しさん
08/06/16 11:59:56
>>356
>"ABabcdeCDE"
これもありうる?
カーネルの中のソケット毎の送信バッファってのは、1つだよね。
複数のスレッドがsendをコールすると、その送信バッファに、
送信データが詰め込まれて行くんだと思うんだけど、
それがsend単位に区切られて詰められない可能性もあるってこと?
こういう動きって、OS依存?
send実行中に、スレッドがコンテキストスイッチしたらこうなるってこと?
2このスレッドが、同時に100Mバイトとかのデータをsendしたら、
そうなりそうな気がしないわけじゃないけど。
360:デフォルトの名無しさん
08/06/16 12:04:11
そもそも同期化もせずに 1 つのソケットに複数スレッドで書き込むな。
361:デフォルトの名無しさん
08/06/16 12:09:29
232Cでやっちまったことはあるな
362:デフォルトの名無しさん
08/06/16 12:50:47
>>360
確かにおっしゃる通りですね。
ってことは、やっぱりそうなる事もありうるってことですか。
363:デフォルトの名無しさん
08/06/16 19:19:51
>>362
実装依存だろうし、起きるかどうか考えるだけ無駄
364:デフォルトの名無しさん
08/06/16 21:45:50
ロックしろよ
365:デフォルトの名無しさん
08/06/16 21:51:18
Unixで同期モードならおきない気がする
366:デフォルトの名無しさん
08/06/16 22:11:13
>>365
どういった理由からですか?保障されているんですか?
367:デフォルトの名無しさん
08/06/16 23:13:06
TCPだったら、sendした順に届くとは限らない。
スレッド関係なしに。
だから、逐次処理で
send( "ABCDE" );
send( "abcde" );
とかやっても、相手側で
abcdeABCDEと受信することも普通にある。
368:デフォルトの名無しさん
08/06/16 23:19:20
おいおい。TCPでそれはないって。
369:デフォルトの名無しさん
08/06/16 23:22:45
>367
え??
370:デフォルトの名無しさん
08/06/16 23:30:04
次にお前は「ワーイ沢山釣れたー」と言う…
371:デフォルトの名無しさん
08/06/16 23:37:42
winsockならURLリンク(www.kt.rim.or.jp)
まぁ、どの実装でも、自前でコントロールすべしって結論になると思う
372:デフォルトの名無しさん
08/06/16 23:39:36
あれ?システムコール実行中にコンテキストスイッチて起るんだっけか?
373:デフォルトの名無しさん
08/06/16 23:47:19
起こらないとするなら、誰かがsendを喚ぶと、戻ってくるまで
システムフリーズするだけだな。
374:デフォルトの名無しさん
08/06/17 01:51:31
TCPは送信順番も送信内容も保障されるか破棄されるんじゃないの?
順番がかわるとか複製される可能性があるのはUDPじゃないの?
おれなんか間違ってること言ってる?
手元の参考書にそう書いてあるんだけど?
375:デフォルトの名無しさん
08/06/17 01:56:01
釣れた釣れた(^^)
バーカ >>374
376:デフォルトの名無しさん
08/06/17 02:01:15
>>375
スレ監視し続けてたんだね
お疲れ様
釣れて良かったね
おめでとう
377:デフォルトの名無しさん
08/06/17 02:46:29
>>372
普通に起こるだろ。
シグナルだって入るし、場合によっちゃスレッドだってスイッチする。
378:デフォルトの名無しさん
08/06/17 04:08:33
>>372
I/Oだったら普通にキューにぶっこんでコンテキストスイッチしないかな?
379:デフォルトの名無しさん
08/06/17 04:28:02
Winsockでconnect、send、recvそれぞれに個別のタイムアウト値を持たせたいのですが、
connectのみ
WSAWaitForMultipleEventsでタイムアウトを判断して
send、recvはsetsockoptを使って指定、
これで大丈夫でしょうか?
380:デフォルトの名無しさん
08/06/17 08:52:26
今の今までスレタイがtypoだと思ってた俺愕然。
381:デフォルトの名無しさん
08/06/17 09:58:45
65535まで続くよ!
382:355
08/06/17 10:05:16
>>367
シングルスレッドの場合でしょ、それは絶対にあり得ないと思うんだけど。
最近のカーネルは、カーネルプリエンプションだから、カーネル内部の処理
実行中にコンテキストスイッチすることもあるかも知れないけど、
ロジックの実行順序(逐次処理)が入れ替わることはないと思います。
>>373
それとはまた別の話ではないでしょうか。
sendを呼んだひとはブロックされるでしょうが、他のプロセスは
普通にシステムコールを実行することも、ユーザーランドのロジックも
実行できると思います。
>>374
私もそういう認識です。
TCPで1つのスレッドが送信した場合であれば、sendした順に相手側では
recv出来ると思ってます。(何回recvすれば良いかは判らんけど。)
途中でパケロスしたり、物理的に線が切れたりした場合は、受信側に届いた
部分まで(これも、相手がsendした順)が受信出来る。
なにか間違ってます? >> all
383:デフォルトの名無しさん
08/06/17 16:49:35
>>479
384:デフォルトの名無しさん
08/06/17 17:04:56
>>379
385:デフォルトの名無しさん
08/06/17 17:14:26
>>579
386:デフォルトの名無しさん
08/06/17 17:23:55
getaddrinfoはブロッキングを起こしますか?
387:デフォルトの名無しさん
08/06/17 17:54:23
AI_NUMERIC を付けない場合は起こします
388:デフォルトの名無しさん
08/06/17 18:07:41
LAN接続PC間で、低速、高ping回線の環境を再現するにはどのような方法があるでしょうか?
自作の俺プロトコルアプリが低速回線環境でどういった影響を受けるのか調べたいのですが。
環境はWindowsです(98orXP)
389:デフォルトの名無しさん
08/06/17 19:19:43
そういうソフト使えばいいだろ。
390:デフォルトの名無しさん
08/06/17 19:50:44
>>367
TCPでそれがあったら大変だろ
UDPでは十分ありうるだろうが
UDPは順序がかわるどころか
複製されたりもするらしいからな
しかしUDPって順序も保障されてないとなると
1パケットあたりの情報をどうやって認識するんだろうか
区切り文字やらパケットサイズ送っても
順序がかわったりしたらアウトだよな?
391:デフォルトの名無しさん
08/06/17 20:41:21
このスレに出入りする奴の発言とは思えんな。
392:デフォルトの名無しさん
08/06/17 21:56:19
UDPは来るか来ないかだけで、「パケット」という構造自体は保証されるだろ。
2つ以上のパケットをもってきて、その関連をどうこういうと面倒だけど。
393:デフォルトの名無しさん
08/06/18 09:28:59
UDPで順序が変わるってのはわかります。
例えば、
(1)udp_send("ABCD");
(2)udp_send("abcd");
とした場合、(1)で作成されたUDPパケットが相手HOSTに到達
するルートと、(2)で作成されたUDPパケットが相手HOSTに到達
するルートが同じだとは限らないですよね。
たまたま、(2)のUDPパケットが相手HOSTに到達するルートの方が
速い回線だったりした場合、受信側のHOSTでは、(2)(1)の順に
UDPパケットを受信する事もあり得ます。
UDPパケット毎の順序は不定ですが、複数のUDPパケットが混ざる
事はありません。(シングルスレッドの場合)
で、複製されるってのはどういう意味?
394:デフォルトの名無しさん
08/06/18 17:14:46
udp_send("ABCD");
とかが2回以上あったかのように
複数回届くことかと思われ
で、実際そういうことがある
パケットにインデックスとかつけて
2回目以降のやつは棄てればいいので問題ない
395:デフォルトの名無しさん
08/06/18 17:22:56
>>394
それって UDP側じゃなくて MAC側の仕様じゃないの?
結果は同じだけど・・・
細かすぎるか?w
396:デフォルトの名無しさん
08/06/18 17:48:55
UDPパケットがネットワーク上で消失するってのは判るんですが、
重複するってのはなぜ?
誰がパケットを複製するの?
マルチキャストであればルータがパケットを複製するってのは
判るんですが。
397:デフォルトの名無しさん
08/06/18 17:59:51
論理的にはあり得ないけど、ハードやOS側が腐っている場合は、
勝手に複製されてしまうこともあるって事ですか。
man ping より
重複パケットと障害パケット
ping ユーティリティは重複パケットと障害パケットを報告します。重複パケット
はユニキャストアドレスに対しては起こるはずのないものですが、リンク層での
不適切な再送信によって引き起こされるようです。重複は様々な状況で起こる可
能性があります。低いレベルの重複の存在は必ずしも警告にならないかもしれま
せんが、よい兆候ではありません。ブロードキャストもしくはマルチキャストア
ドレスに ping する時には、重複が起こることが期待されます。実際に重複する
のではなく、異ったホストから同じ要求に対して応答が行われからです。
障害を受けたパケットは明らかに重大な警告です。多くの場合、ping パケットの
経路のどこか (ネットワーク内かホスト内) のハードウェアの故障が考えられま
す。
398:デフォルトの名無しさん
08/06/18 18:03:13
よって、パケットの複製は、UDPだから発生するとかって話では
ないってことですね。
ただ、TCPだと、勝手に捨ててくれるけど、UDPだとそのまま
複数回受信しますということね。
と、なっとくしました。
考え方が間違ってたら、指摘してもらえると嬉しいです。
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4703日前に更新/99 KB
担当:undef