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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/12/31(土) 14:07:24
主にソケットに関しての質疑応答スレッドです。

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

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

前スレ
ネットワークプログラミング相談室 Port15
http://pc8.2ch.net/test/read.cgi/tech/1128088448/
0285デフォルトの名無しさん2006/02/01(水) 23:19:34
正直な話、コードも見せずに助言だけ求めるやつって何がしたいんだろうって思うよ。
俺はお前じゃねー通の
0286デフォルトの名無しさん2006/02/01(水) 23:25:57
>>284
send側に問題がないのなら、recvの処理に問題があるのでしょう。
MSG_WAITALL を使わずにループにしてみてはどうですか?
移植性も高まるし。
0287デフォルトの名無しさん2006/02/02(木) 01:20:07
>>284
問題の部分を引用しないと、なにが悪いか分かるわけないっつの
0288デフォルトの名無しさん2006/02/05(日) 18:33:42
C/C++の宿題を片付ケます 60代目から引っ越してきました

で、質問です
1 TCPソケット使って GET / HTTP/1.1 をHTTP鯖に送る
2 レスポンスが帰ってくる
3 データ部分に0f38とか、ソースに本来ないものが含まれる
さいしょ、chunk分けされたものかなーって思ってたけど、
RFCに載ってないのかよーわからん・・・

具体的なサイトは、このスレをtelnetでgetしてみると得られるかもしれません。

(とりあえずまんま元の質問をコピペ)
02892882006/02/05(日) 18:35:27
('A`) しまった・・質問本体書いてないじゃん

質問は、この0f38とか言う文字列が何を指しているのか、
最終的には回避したいので、回避する方法につながる何かの情報提供をおまちしておりまゥゥゥゥゥィ
0290デフォルトの名無しさん2006/02/05(日) 19:23:24
>>289
文字通りchunkじゃないの?
HTTP/1.1つけてGETしたんならchunk対応はMUSTなので
平気でchunkで送っていいことになってる。
対応できないんなら1.1を名乗っちゃいけない
0291デフォルトの名無しさん2006/02/05(日) 19:52:53
rfc2616の18ページとか、103ページとか。
02922882006/02/05(日) 20:01:27
>>290さんと>>291さん
レスさんくすっす ('A`)

とりあえずrfc再読します
HTTP1.1対応するの諦めよっかな・・・
0293デフォルトの名無しさん2006/02/05(日) 20:21:08
あとは ttp://www.studyinghttp.net/body#Codings かな。
0294デフォルトの名無しさん2006/02/06(月) 12:29:28
すみません、質問です。
UDPでサーバーにあるテキストファイルの内容を読むのは可能ですか?
もし可能であればどうすればいいのか簡単な流れを教えてください。
関連する検索キーワードでもいいです。
まさかfopen()やfread()はクライアント側からは使えないですよね・・・
0295デフォルトの名無しさん2006/02/06(月) 12:31:31
>>294
UDPを誤解してないか?
0296デフォルトの名無しさん2006/02/06(月) 12:36:12
はい、誤解しまくってると思います。
自分が分かっているのはUDPでコネクションレスの通信ができる、程度です。

もしかして、サーバー側にfopen()とかやらせるには
server.cの中でfopen("xxx.txt", "rb");なんて書いてやればいいんでしょうか?
でも、どのタイミングでやらせればいいんでしょう?
すみません・・・
0297デフォルトの名無しさん2006/02/06(月) 12:39:21
>>296
> UDPでコネクションレスの通信
その解釈は正しくて、UDPはそれ以上でもそれ以下でもない。

> サーバー側にfopen()とかやらせるには
やらせるには、サーバ側に
> server.cの中でfopen("xxx.txt", "rb");なんて書いてやればいいん
です。

> どのタイミングでやらせればいいんでしょう?
UDPで送信する前にやっておかなくてはいけませんね
ファイルの内容が実行中に変わらないのなら、プログラム初期化時にやっても良いですし
常に変動し続けるのなら、送信する直前にするのもいいでしょう
0298デフォルトの名無しさん2006/02/06(月) 12:47:59
ありがとうございます!
実はクライアント側からコマンドを打てばサーバー側でなんでもできると思ってました・・・(恥
ファイルの内容はもしかすると変動するかもしれないので、送信する直前にしてみます。
また質問することが「多々」あると思いますがよろしくお願いします。自分でももっと勉強しますから。
0299デフォルトの名無しさん2006/02/06(月) 12:51:49
>>298
> 実はクライアント側からコマンドを打てばサーバー側でなんでもでき
ます。
ただし、当たり前ですが全て貴方が実装しなくてはなりません
0300デフォルトの名無しさん2006/02/06(月) 13:10:20
>>299
あら、実装すればサーバー側でなんでもできちゃうんですね。
いらっしゃるなら、ついでにもう一つ質問を・・・
UDP(コネクションレス)ならマルチユーザーになった場合、
二人のクライアントが同時にサーバーにあるデータを変えてしまうような場面に遭遇しますか?

TCP/IP(コネクションあり)だとクライアントとサーバーが
一対一でつないでいる間は他のクライアントはつなげなかったんでしたっけ?
それならそんな場面に出くわすことはなさそうですが・・・
0301デフォルトの名無しさん2006/02/06(月) 13:13:08
( ´ー`)y-~~
0302デフォルトの名無しさん2006/02/06(月) 13:14:54
_| ̄|○
0303デフォルトの名無しさん2006/02/06(月) 13:21:57
>>300
> UDP(コネクションレス)ならマルチユーザーになった場合、
> 二人のクライアントが同時にサーバーにあるデータを変えてしまうような場面に遭遇しますか?
いやだから、UDPはover IPな通信路を築いているだけで、
サーバ側やクライアント側のアプリケーションプロトコルはまったく感知しないんですよ

貴方の言っていることをちょっと大きく言えば
1 神飛行機に「お願いです、命たすけてくだしあ」って書いて天空に飛ばしてみる
2 神が受け取る。けど助ける命いっぱいある
3 どれ先に実行すれば良いか悩む
4 もうpanicですよ
という1〜4の手順の中で、UDPに相当するのは”神飛行機”になります。
神飛行機が神の審判を助けたり、貴方のお友達を助けるわけじゃないですよね?
この「審判」や「助ける」のはover 神飛行機なアプリケーションプロトコルなので、
貴方が「審判」の実装や、「助ける」の実装をしなくてはならないのです。

> TCP/IP(コネクションあり)だとクライアントとサーバーが一対一でつないでいる間は
> 他のクライアントはつなげなかったんでしたっけ?
> それならそんな場面に出くわすことはなさそうですが・・・
んなことない
TCPのリスナは「待つだけ」で、「コネクションが到達」したら「接続されたソケットを作」ってまた待ち続けるだけ
0304デフォルトの名無しさん2006/02/06(月) 13:31:43
なんかもう無意味に色んな例えで説明したくなるな
でも多分なかなか分かってくれなさそう
0305デフォルトの名無しさん2006/02/06(月) 13:38:48
> 命たすけてくだしあ
0306デフォルトの名無しさん2006/02/06(月) 13:39:24
なるほど。ということは僕自身が
どのクライアントがどういうタイミングに来たときにどうするか決めてやらないといけないんですね。

>>TCPのリスナは「待つだけ」で、「コネクションが到達」したら「接続されたソケットを作」ってまた待ち続けるだけ

ああ!そうでしたね。
よく見たら、つなげられる上限を決める定数が上の方で定義されてました。
もっと勉強しときます。
図書館がそろそろ閉まるので今日はこの辺で。また来ます。ありがとうございました!
0307デフォルトの名無しさん2006/02/06(月) 13:44:19
>>306
一概に「アプリケーションプロトコルとは〜というもの」とは言えないけれど、
とりあえずステートマシン(=状態遷移を伴い、状態によって挙動が変わるプログラム)を組まなくてはならないと思う
まぁ、「どういう場合に問題が起こるか?」というだけで授業まるまる1つ使うくらいの物になるから、そのへんは勉強だわな

>>305
わすれてタタタタタタタ\\・・
0308デフォルトの名無しさん2006/02/06(月) 13:45:25
いや別に accept 受けてから listen に入らなきゃ同時に 2 接続が
発生することもないだろ。UDP もしかり。要は作り次第。
どうでもいいがエラく早く閉まる図書館だな。
0309デフォルトの名無しさん2006/02/06(月) 13:46:58
失礼、2接続の発生っつうか 2 つの処理が同時に走る、だな。
0310デフォルトの名無しさん2006/02/06(月) 14:07:58
割り込みスマソ。
今TCPでプログラム組んでます。
send()の直前でsetsockopt()でTCPヘッダのDSCP値を
変更してパケット出力をするプログラム書いてるのですが、
etherealでパケット確認すると、TCPヘッダのチェックサム値が
エラーとなってます。
受信先ではきちんとデータ取れてるんですが・・・。で、質問なんですが、

1.チェックサムの計算って誰がやるの?NIC?OS?ソケット?
2.チェックサムが異常のパケットって破棄されると思ってたんですが、
  受け取れるのはなぜ?(recv()もエラーになってない。)実は破棄
  されない?

全くもってわからず困ってます。どなたか俺の神飛行機を受け取って
助けてくださいorz。
0311デフォルトの名無しさん2006/02/06(月) 14:16:01
>>310
TCP/IPを実装しているのは、例えばNICとかルータとかだよな。
どの部分でTCPのチェックサムを処理しているかわからないけれど、
TCPのチェックサムでエラーが発見された場合は再送信するようになってるはず
受け取れるということはチェックサムが正しいことになるのでは?

と神飛行機に書いてとばしてみる
0312デフォルトの名無しさん2006/02/06(月) 14:34:14
>>311
レスありがとうございます。

>再送信するようになってるはず
そうなると再送要求のパケットが飛ぶはずですよね?
再送要求も出てないのですよね・・・。ethrealのバグか?
他のパケットキャプチャソフト使ってもうちょっと試してみます。

他にも回答頂ける方いましたらplz m(__)m
スミマセンがageで。
0313デフォルトの名無しさん2006/02/06(月) 14:35:40
>>312
> そうなると再送要求のパケットが飛ぶはずですよね?
うーん・・・どうだったかなぁ
なんだか再送信要求のパケットなんて飛ばなかったと思うんだが・・・
03143102006/02/06(月) 15:08:13
自己解決出来ました。書き込む前に試せよって話ですが、
現象が起きたのはLinuxの送信ポートのキャプチャを見てたのですが、
Windowsの受信ポートのキャプチャを見たら、正しいパケットでした。

Linuxの方のetherealのバグかは謎ですが、パケットを拾ってる
タイミングに問題ありなのかな?と思ってます。ちと実験で、
Windowsで送信する際にDSCP値書き換えた場合の送信ポートの
パケットとLinuxで受信したパケットを拾ってちと検証してみます。

再送要求のパケットなんてありませんでしたね(^^;失礼しました。
何分勉強途中なもので。
ありがとうございましたm(__)m

0315デフォルトの名無しさん2006/02/06(月) 17:35:12
いまどきCRCの生成はNICにオフロードされているので、それまでの間に
パケットをかすめ取っていると、CRCは当然合いません。
0316デフォルトの名無しさん2006/02/06(月) 18:42:58
>>306
> なるほど。

あの例えでわかったんかよ(ワラ

>>308
listenじゃなくて次のacceptだろ?
03173102006/02/09(木) 11:32:33
今更な遅レスですが。
>>315
>いまどきCRCの生成はNICにオフロードされているので
オフロードってどういうことですか?今時って事は昔は
また違ったのでしょうか?興味本位で教えてください。

また別の質問です。スイマセン(--ゞ。
TCP/IPの受信バッファのサイズはRWIN値で設定されているのは
わかりますが、このサイズを超えたデータを受信した場合は、
超えた部分は破棄されると考えて問題ないでしょうか?

例えばRWIN値が5KBとし1KBのデータが連続的に送られてくるとします。
最初の1KBのデータを受信し、そのデータに何らかの処理を行ってる最中
にもデータは送られてる訳で、6個目以降のデータは破棄されてしまうの
でしょうか?
RWIN値のMAX値って64Kだと思うのですが、1MBのデータ送った場合等、
受信速度>送信速度でない場合データ取りこぼしまくるんじゃないかと
思うのですが。

稚拙な質問ですが教えてください。
0318デフォルトの名無しさん2006/02/09(木) 11:33:56
>>317
> TCP/IPの受信バッファのサイズはRWIN値で設定されているのは
> わかりますが、このサイズを超えたデータを受信した場合は、
> 超えた部分は破棄されると考えて問題ないでしょうか
破棄される
その代わり相手が再送信する
あまりにも送信できないとタイムアウトで切断される
じゃなかったっけ?
0319デフォルトの名無しさん2006/02/09(木) 19:56:49
送信側はRWIN分はとにかく受け取れるのが判ってるから、RWIN分を連続して送る。
その後はACKが来るのを待つ。
それが伝送制御ってもんだ。

だからRWINが大きいほうがスループットが上がるんだよ。
0320デフォルトの名無しさん2006/02/09(木) 21:31:32
javaでキャッシュサーバをプログラミングする際に、
参考になるようなページを教えて下さい。
0321デフォルトの名無しさん2006/02/09(木) 23:06:42
>>317
Checksum Offload 機能でググれ

ただ、いつも>>315の通りなわけじゃない。(断言しているが)
0322デフォルトの名無しさん2006/02/09(木) 23:09:36
>>320
またか>>268
03233102006/02/10(金) 12:47:44
皆さんありがとうございます。
精進しますm(__)m
0324デフォルトの名無しさん2006/02/10(金) 18:38:01
http://pc8.2ch.net/test/read.cgi/tech/1103998649/508-509
で質問させていただいているものなのですが
ネットワーク関係はこちらのほうがよさそうなので
もし、よろしければ上記のアドレスの疑問なのですが教えていただけないでしょうか。
いろいろ試したところクライアント側の送信がゲームの毎フレームごとに
送信されておらず一定時間ごとに送信されてしまっているため
サーバー側で座標をクライアント側から毎フレームごと得られずカクカクしてしまっているようなのです。

win2k
VC#2003使用
通信部分はゲームのメインループから
・サーバー
try
{
Int32 port = 9999;
IPAddress localAddr = IPAddress.Parse("192.168.0.1");
server = new TcpListener(localAddr, port);
server.Start();
t= new Thread(new ThreadStart(receive));
t.Start();
}
catch
{}
・クライアント
t= new Thread(new ThreadStart(Con));
t.Start();
のようにスレッド化してあります
0325デフォルトの名無しさん2006/02/10(金) 18:44:37
なんかnagleアルゴリズムのお陰かもしれない雰囲気
でも、とりあえずどんな時間間隔でどれくらいのデータが送受信できてるのか確かめないとね
0326デフォルトの名無しさん2006/02/10(金) 18:47:49
>>324
C#はよく知らないが、世間で言うところの TCP_NODELAY オプションを
使うといいのではないかな。

03274112006/02/10(金) 21:13:29
ありがとうございます。
nagleアルゴリズム調べさせていただきTCP_NODELAYに関してもわかりましたが
オプションらしきものがMSのドキュメントを見てもわからないため
UDPでの通信をしてみようと思っています。
>>247
でマウスの位置を送るようなことが書いてあり
リアルタイムデータ送信ならUDPのほうがよいみたいですので。
また、何かありましたらよろしくお願いします
0328デフォルトの名無しさん2006/02/10(金) 21:16:50
>>327
setsockopt()とか無いの?

//儚いUDPを使う>>327の強気の態度に惚れるかもしれん
03293242006/02/10(金) 22:12:13
UDPで作成してみたところ
TCP使用時とほぼ同じ動きを行います。
ゲームの1フレームごとに通信が確立していない可能性が高そうなので
マルチスレッドの部分も含めて非同期通信部分を見直します。
03304112006/02/10(金) 22:17:41
また、わかったこととして
try catch構文で通信のエラーを破棄する処理を入れれば問題なく動く場合でも
try catch構文をはずすだけでエラーをはいて強制終了する場合がある。

スレッドを用いた場合は明らかに通信の回数が減っている
ただし、スレッドを用いない場合は通信受付待機の時間が
ゲーム画面の1フレームの更新時間にかなりの影響を及ぼし
ゲームにならなくなってしまう。
0331デフォルトの名無しさん2006/02/10(金) 22:28:58
非同期UDP使えばいいんじゃないの?
0332デフォルトの名無しさん2006/02/10(金) 22:31:12
>>331
逆に質問
同期UDPって何だ・・・
03333242006/02/10(金) 22:34:50
>>331
ありがとうございます。
なにぶん未熟なものでして、TCPで使っていた
マルチスレッドを利用したUDPの非同期?通信は試してみたのですが
TCPのときとさほどかわりませんでした。
今行っているゲームの通信部分は3Dモデルの主人公の動きを相手側でも
同じように再現するために座標を送っています。
0334デフォルトの名無しさん2006/02/10(金) 22:37:02
>>333
UDP結構使える?
うちのLANだと1〜2%ロスだったけど、WANに出ると正直どうなるかわからんのだ・・
0335デフォルトの名無しさん2006/02/10(金) 22:39:04
>>327
tcp_client_instance.NoDelay = true;
03363242006/02/10(金) 23:05:04
>>335ありがとうございます
client = new TcpClient("192.168.0.1", port);
client.NoDelay = true;
と定義できました。
しかし、動作は変わりませんでした。やはり非同期通信がうまくいっていないようです。

>>334
自分もLAN環境での実験ですが
やはりロスは出ているようです
0337デフォルトの名無しさん2006/02/11(土) 00:16:59
TCP_NODELAYと非同期通信は全く関係ないと思うんだが・・・。
0338デフォルトの名無しさん2006/02/11(土) 00:59:44
非同期通信って何なんだよ・・

あれか?
プログラムレベルで同期処理するのを同期通信って言うのか?
ならノンブロッキングソケット使ってるってことか?
0339デフォルトの名無しさん2006/02/11(土) 01:06:43
select使えってことじゃない?
0340デフォルトの名無しさん2006/02/11(土) 05:09:34
物理的に一つのクライアントから、複数のIP元を装って、
一つのサーバーにhttpリクエストを生み出すことのできるフリーウェアってありますか?
0341デフォルトの名無しさん2006/02/11(土) 06:10:44
>>340
wget
0342340 2006/02/11(土) 09:31:21
回答ありがとうございます。
03433242006/02/11(土) 14:35:11
ゲームのメインループに接続の関数を入れていて
それが原因で接続したり切断されたりしていたようです。
無事3Dゲームのネットワーク化に成功しました。
いろいろありがとうございました。
0344デフォルトの名無しさん2006/02/12(日) 17:59:08
gethostbynameとinet_ntopについての質問です。
------------------------------
#include <stdio.h>
#include <sys/socket.h>
#include <netdb.h>

int main(void)
{
char*ptr, **pptr;
charstr[4];
struct hostent*hptr;

ptr="www.asahi.com";
hptr=gethostbyname(ptr);
pptr = hptr->h_addr_list;
printf("address:%s\n",inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
}
------------------------------
以上のような短いプログラムを作ったのですが出力が
address:(null)となってしまいIPアドレスが表示できません。
asahi以外にも試したのですが同じ結果になりました。
どうしたら正常に表示できるのでしょうか。ちなみに
他のhostent構造体の例えばh_name等は正常に表示できました。
OSはsuse10.0 x86_64版です。
0345デフォルトの名無しさん2006/02/12(日) 19:14:10
なんでstrが4byteしかないの?
そこを20とかに増やしてみては
0346魚チョコ2006/02/12(日) 19:15:46
>>344
 ぜんぜんエラーチェックしてないのもアレだが、str[4] がもっともアレだ。まずここを str[16] くらいにしてみよう。
0347デフォルトの名無しさん2006/02/12(日) 20:07:45
>>345
>>346
レスありがとうございます。
いやIPアドレス4バイトなのでcharで4バイト確保しました。
とりあえずchar str[20]位で領域増やしてみます。
0348デフォルトの名無しさん2006/02/12(日) 22:08:57
>>347
> いやIPアドレス4バイトなのでcharで4バイト確保しました。
あのな、sizeof("xxx.xxx.xxx.xxx")っていくつか考えてみよう。
0349デフォルトの名無しさん2006/02/12(日) 22:33:50
>>348
そうでした、すっかり勘違いしてた。また>>344のプログラムで単純にstrの領域を増やすと
セグメンテーションエラーになったので
#include <arpa/inet.h>
を加えchar str[16]にしたところ、無事IPアドレスが表示されました。
---------------------------------------
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <arpa/inet.h>

int main(void)
{
char str[16];
char *ptr, **pptr;
struct hostent *hptr;

ptr="www.asahi.com";
hptr=gethostbyname(ptr);
pptr = hptr->h_addr_list;
/* printf("\taddress: %s\n",inet_ntoa(*(struct in_addr *)*pptr)); */
printf("\taddress: %s\n",inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
printf("%s\n",hptr->h_name);
}
--------------------------------------
>>345>>346>>348
どうもありがとうございました。
0350デフォルトの名無しさん2006/02/13(月) 20:58:57
ウイルスチェッカー(AVG)のメールスキャンログを見たら、
誰かの自宅サーバっぽいIPアドレスのSMTPサーバに接続しようとしている
ログが多数、残っていました。結局、コネクションは成立していません。
ウイルス、Spyware系のチェックはしたのですが、検出されず。

メールを送ろうとしているプロセスを突き止めるには、どうすればよいでしょうか?
Win2000,VS2004(C++)です。
0351デフォルトの名無しさん2006/02/13(月) 21:12:43
UDPで送ったパケットの順番って
実際どのくらいの頻度でひっくり返る?
0352デフォルトの名無しさん2006/02/13(月) 21:18:31
>>350
VC 使えるんなら、netstat -o をズート実行してsmtp へコネクションを
張ったプロセスを見つけたら PID からプロセスの情報を得てログする、
というプログラムを書いて一晩くらい走らせてみては?
03533502006/02/13(月) 21:39:21
いまやってみたんだが、、プロセス、Winnyだった。。。
ヤツってメール送る?
0354デフォルトの名無しさん2006/02/13(月) 21:46:30
>>353
ポート開けないヤツが使ってると思われ。
03553502006/02/13(月) 21:56:13
>>354
その場合は、どうすればプロセスを特定できるんだろう?
とりあえずVMWare起動したww
0356デフォルトの名無しさん2006/02/13(月) 22:07:05
単にWinnyのポートを25にして使ってるヴァカがいたってだけだろ。
03573502006/02/13(月) 22:54:20
昼、夕、それぞれ一人ずついたけど
思い過ごし?
それとミスったけど、ポートはPOP(110)でした。
0358デフォルトの名無しさん2006/02/13(月) 23:16:46
Linux初心者です。
インターバルタイマーが必要で SIGALRM を使用してるんですが、
同じプロセスで 受信処理のために NONBLOCK の select() を使用すると、
タイムアウト設定してコールしてもselect()のタイマーが正常に働きません。
どうすればいいんでしょうか?
できれば子プロセスで処理を分けずに。
またselect() のイベントでイベントハンドラーを起動するような作り方は通常
するんですか?
0359デフォルトの名無しさん2006/02/13(月) 23:17:35
板違いだろ。
セキュリティ板いけよ。
0360デフォルトの名無しさん2006/02/13(月) 23:18:34
>>359は、>>357=>>350にね。

> インターバルタイマーが必要で SIGALRM を使用してるんですが、

そこもselect()使えば?
0361デフォルトの名無しさん2006/02/13(月) 23:20:41
>>351
もちろん状況次第だが、関西地方のフレッツ ADSL で、
結構ひっくり返ったことがある。

# ソフトがバグってて、パケット逆転したら受信してい
# た画像がブロックノイズだらけになって、ばれた。
03623582006/02/13(月) 23:23:16
360s ありがとうございます。全部select()使えばいいんですね、すみません。
0363デフォルトの名無しさん2006/02/14(火) 02:45:55
リッスンしているソケットをselectでずーっと待ってるときに、
中断させたいときは、別のスレッドなどから
shutdown、closesocket、などを呼んで中断させる方法しか思い浮かばないのですが、
もっとスマートな方法はありませんか?
0364デフォルトの名無しさん2006/02/14(火) 03:11:50
一緒にパイプとかも待てば?

同様に、WindowsならEventSelectでEventを待つよ。
IOCPのサンプルなんかで、このやり方を使ってる。
0365デフォルトの名無しさん2006/02/14(火) 03:23:16
>>361
なるほど結構ひっくり返るもんなんだな
0366デフォルトの名無しさん2006/02/14(火) 08:38:34
>>363
UNIXならsignal受けてEINTRのexeptionで復帰させるとか、
selecltじゃなくてpoll使ってurgent data受けるとか。

selectとurgent dataもOKなのかもしれないけれど、
undocumentedなので使ったことなし。
0367デフォルトの名無しさん2006/02/14(火) 13:03:28
>>364
>>366
返信ありがとうございます。

一緒にパイプを持って、それで抜けるようにします。
0368デフォルトの名無しさん2006/02/14(火) 16:29:49
>>365
経験上、帯域上限辺りまで使うと結構ひっくり返る希ガス
0369デフォルトの名無しさん2006/02/14(火) 20:03:38
raw socketを勉強しようと以下のようなプログラムを作ったのですが
SIO_RCVALLした所で10022が出るPCやWSARecvのところで10055が出るPCがあったりするのでお知恵を拝借させて頂けませんでしょうか
動かしてみたOSはWindows2000とWindowsXPです。Adminユーザーで実行してます。
----------------------------------------
#include <winsock2.h>
#include <mstcpip.h>
#include <stdio.h>

int main(int argc, char **argv){
SOCKET sock = INVALID_SOCKET; DWORD d, optval = 1, flags = 0, len; SOCKET_ADDRESS_LIST *addrlist; SOCKADDR_IN addr_in; WSADATA wsd; char buffer[65536]; int i; WSABUF wsb;
if (0 != WSAStartup(MAKEWORD(2, 2), &wsd)) goto err;
if (INVALID_SOCKET == (sock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, 0))) goto err;
if (SOCKET_ERROR == WSAIoctl(sock, SIO_ADDRESS_LIST_QUERY, NULL, 0, buffer, 1024, &d, NULL, NULL)) goto err;
addrlist = (SOCKET_ADDRESS_LIST*)buffer;
if (0 == addrlist->iAddressCount) goto close;
addr_in.sin_addr.s_addr = ((SOCKADDR_IN*)(addrlist->Address[0].lpSockaddr))->sin_addr.s_addr;
addr_in.sin_family = AF_INET; addr_in.sin_port = htons(0);
if (SOCKET_ERROR == bind(sock, (SOCKADDR*)&addr_in, sizeof(addr_in))) goto err;
if (SOCKET_ERROR == WSAIoctl(sock, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &d, NULL, NULL)) goto err;
for(i = 0; i < 10;i++){
wsb.buf = buffer; wsb.len = sizeof(buffer);
if (SOCKET_ERROR == WSARecv(sock, &wsb, 1, &len, &flags, NULL, NULL)) goto err;
}
goto close;
err:
printf("ERR %u\n", WSAGetLastError());
close:
if (sock != INVALID_SOCKET){ shutdown(sock, SD_BOTH); closesocket(sock);}
WSACleanup();
return 0;
}
03703192006/02/16(木) 19:56:51
ttp://www.st.ryukoku.ac.jp/~kjm/security/ml-archive/port139/2003.03/msg00137.html で
> (1)ICF/ICSのサービスを開始しろ
> (2)Personal Firewallを停止しろ
(3)IPSEC Services サービスを開始しろ
MSDNのサンプルで
printf("NOTE: IPv6 does not currently support the SIO_RCVALL* ioctls\n");
ってのを見付けたんでサービス関係をその通りに動かして、IPv6がアダプタのプロパティに入ってないことを確認したんだけど状況かわらずです
WSA*を使っているのが間違いの元かとも思いWSASocket→socket、WSAIoctl→ioctlsocket、WSARecv→recvと変えてみてもやはり同じでした
RCVALLするまでの準備の部分に何か誤りがあるのでしょうか?
03713692006/02/16(木) 19:58:41
ハンドルのとこ間違って書き込んでしまいました319じゃなくて369です
0372デフォルトの名無しさん2006/02/16(木) 22:27:26
t est
0373デフォルトの名無しさん2006/02/18(土) 01:05:12
Win32APIスレでスレ違いと言われたので、こちらで質問します。
オープンしたソケットで利用中のNICのMACアドレスを得る方法を
教えていただけますでしょうか?
接続元、接続先のMACアドレスどちらでもかまいません。

OSはWindows XPです。
0374デフォルトの名無しさん2006/02/18(土) 01:10:16
getsockopt(s, NSPROTO_IPX, IPX_ADDRESS, &IPX_ADDRESS_DATA..);
で、IPX_ADDRESS_DATA::nodenumかな。
もちろん、IPXソケット限定だけど。
03753732006/02/18(土) 18:57:24
自己解決しました。
0376デフォルトの名無しさん2006/02/19(日) 12:29:09
市ね
0377デフォルトの名無しさん2006/02/21(火) 21:47:27
warota
0378^ω^ ◆8vOv.D2p4. 2006/02/22(水) 18:47:13
Winsockを使ったソフトを作っているのですが、

自分で立てる→127.0.0.1で接続 はできました。

ところが、人様に立ててもらって、IPを教えてもらったところ、接続しようとしても駄目でした。
その人は、自分のマシンで自作のチャットサーバを動かして、外部から接続できている、
と言ってるので、その人のネットワーク環境は特に問題なさそうです。(ポート解放等

自分→ループバック でできるのに、インターネット経由で繋がらない場合、
どんなミスがありえるんでしょうか・・・?
127.0.0.1の場合も、グローバルIPを入力しても、
同じコードで、 sin_addr.S_addr:=inet_addr(PChar(ip));
としてるので、本質的には同じだと思ってたんですが。。。

ちなみに、WSAAsyncSelectを使う非同期の、TCPソケットです。
開発環境はDelphi6Personal + ProjectJEDIのWinsock2.pas です。
0379^ω^ ◆8vOv.D2p4. 2006/02/22(水) 19:03:57
解決しました 他の人が立てたら普通に。
0380デフォルトの名無しさん2006/02/22(水) 22:18:47
C#のWindowsアプリでソケット通信の非同期サーバを
作っているのですが、切断時に

Socket.Close()

を行うと下記の例外が発生するのですが、
どうすれば回避できるでしょうか?

----------------
破棄されたオブジェクトにアクセスできません。
オブジェクト名 'System.Net.Sockets.Socket' です。
0381デフォルトの名無しさん2006/02/22(水) 23:03:51
UNIXのソケットプログラムで。

ソケットのファイルディスクリプタ(int)から通信が行われている自分側のポート番号取得することは可能?
accept したあとの子プロセスから呼び出される関数で、ファイルディスクリプタはもらうんだけど
struct sock_addr_in の構造体はスコープ外で直接アクセスできない、という条件です。
0382デフォルトの名無しさん2006/02/22(水) 23:07:57
getsockname/getpeername
0383デフォルトの名無しさん2006/02/22(水) 23:26:33
>>382
�d!
0384デフォルトの名無しさん2006/02/22(水) 23:33:12
>>373 >>378 >>380
このスレはアンチM$の粘着UNIXオタが常駐してるだけだから
winsockのまともな返答は期待できないと思った方が良い



そうだよな
おまえら
■ このスレッドは過去ログ倉庫に格納されています