ネットワークプログラミング相談室 Port20at TECH
ネットワークプログラミング相談室 Port20 - 暇つぶし2ch700:674
08/01/15 12:02:02
>>684
4-5年前 NetBSDの teldx だったかな、telnet サーバーのソースは見たことあります。
しかし、コードがトリッキーなのがはいってて理解不能でした。
teldx に限らず、while ループが何百行もつづいてたり、マクロがぐちゃぐちゃはいって
たりして読みずらい。。

701:デフォルトの名無しさん
08/01/15 13:15:06
>>694
OpenSSLは/etc/ssl/certsに証明書が置いてあるよ。
もちろん証明書の中には公開鍵が入ってる。
openssl dgstコマンドでハッシュつくって、
そのハッシュが名前になったシンボリックリンクが本体へ向けてある。
WindowsでもOpenSSLならC:\etc~になるだけで同じ。

702:デフォルトの名無しさん
08/01/15 18:32:21
マルチスレッドで以下のような構成です。
・UI スレッド(main スレッド)
・作業スレッド(Winsock1.1 初期化/後処理 + データの送受信)
この場合はWinsockのデータベース関数をどちらのスレッドで使用するべきですか?


703:デフォルトの名無しさん
08/01/15 18:35:21
>>702
何がいいたいのかわからないのだけど…
>Winsockのデータベース関数
ってなにかな?

704:デフォルトの名無しさん
08/01/15 19:03:30
gethostby~とか

705:デフォルトの名無しさん
08/01/15 19:05:43
netdb.h

706:デフォルトの名無しさん
08/01/15 22:28:42
>>702
今時 Winsock 1.1 もどうかと思うが、どっちにせよ Winsock
の初期化/後処理 (Cleanup のことかな?) を作業スレッドで
やるなら、Winsock 関連の処理は作業スレッドでやった方が
いいと思う。

707:デフォルトの名無しさん
08/01/16 01:43:38
新たに名前引き用スレッドプールを新設するのが好み。

708:デフォルトの名無しさん
08/01/16 11:02:38
結果のコンシューマもマルチスレッディドになってないと意味ないけどね。

709:デフォルトの名無しさん
08/01/16 16:51:22
作業スレッド内でWinsockの処理を行うとして、
データベース関数はWSAAsyncGetHostByName等、非同期を用いるべきでしょうか?


710:デフォルトの名無しさん
08/01/16 21:59:30
それは、君のやりたいこと次第だからなんとも言えないけど、
WSAAsyncGetHostByName() は、ウィンドハンドルを要するから
作業スレッドでは使いにくいよ。

ぶっちゃけ WSAAsyncGetHostByName() は、スレッド使わない
人向けだよ。

711:デフォルトの名無しさん
08/01/19 15:19:46
TCP最高や!
UDPなんか最初からいらんかったんや!

712:デフォルトの名無しさん
08/01/19 22:03:37
WSAAsyncGetHostByName()を使わないとすると
スレッド内でデータベース関数がブロッキングを起こさないようにするにはどうしたらいいですか?

713:デフォルトの名無しさん
08/01/19 22:13:38
別のスレッドを起動してそれにやらせる

714:デフォルトの名無しさん
08/01/20 00:14:28
ダイアログに貼付けたエディットの中の文字列をGetDlItemTextで取得し
gethostbyname関数を使うとNULLが返されるんですが、
NULLが返される原因としては、どんなものがありますか?

715:デフォルトの名無しさん
08/01/20 00:39:47
プラットフォームがよくわからんけど、なんで errno
とか GetLastError() とかを見ないんだ?

716:デフォルトの名無しさん
08/01/20 00:41:25
一番の原因として考えられるのは
渡した文字列を確認したりWSAGetLastErrorを見たりという簡単なことすら
やろうとしない人間がコードを書いていること

717:デフォルトの名無しさん
08/01/20 02:41:16
ネットワークプログラミングとは関係ないし
WindowsAPIとも関係ないな


718:デフォルトの名無しさん
08/01/20 23:45:31
WSAStartupはWinMain側でしか出来ませんか?

719:デフォルトの名無しさん
08/01/21 00:01:24
試した方が速くね?

720:デフォルトの名無しさん
08/01/21 00:37:06
試して出来ませんでした。

721:デフォルトの名無しさん
08/01/21 00:48:30
ということは出来ないってことだね
解決して何よりです。

722:デフォルトの名無しさん
08/01/21 14:32:41
ソケット通信について質問します。
サーバー win-XP JAVAアプリ
クライアント Linux gccアプリ

コネクション成立後に、クライアント側から close → open する場合、
close後にopenするまでの待ち時間はどのくらいとればいいのでしょうか?

723:デフォルトの名無しさん
08/01/21 14:35:19
別に待たなくて良い

724:デフォルトの名無しさん
08/01/21 17:02:38
>>723
サーバー側で時々クライアントのソケット断検出がうまくいかない時があったものですから。
アプリケーションの不具合みたいです。
すみませんでした。

725:デフォルトの名無しさん
08/01/21 23:20:47
生ソケ開いて

Macアドレスと
IPとポートでフィルタしようと
思うのですが、効率のいいアルゴリズム
知らないでしょうか?

726:デフォルトの名無しさん
08/01/22 00:02:29
受信がうまくいかないのですが、
//送信
char szBuffer[1024];
char lpFileName[1024] = "/case.html";
sprintf(szBuffer, "GET %s HTTP/1.0\r\n\r\n",lpFileName);
nRet = send(Socket, szBuffer, (int)strlen(szBuffer), 0);

if (nRet == SOCKET_ERROR)
{
SendMessage(GetDlgItem(pval->hWndMain,IDC_EDIT2),\
EM_REPLACESEL,0,(LPARAM)"sendに失敗");
closesocket(Socket);
}
//受信
while(1)
{
nRet = recv(Socket, szBuffer, sizeof(szBuffer), 0);
if (nRet == SOCKET_ERROR)
{
SendMessage(GetDlgItem(pval->hWndMain,IDC_EDIT2),\
EM_REPLACESEL,0,(LPARAM)"recvに失敗");
closesocket(Socket);
break;
}

if (nRet == 0)
break;
sprintf(szBuffer,"%s",szBuffer);
SendMessage(GetDlgItem(pval->hWndMain,IDC_EDIT2),\
EM_REPLACESEL,0,(LPARAM)(LPCTSTR)szBuffer);
}

727:デフォルトの名無しさん
08/01/22 00:15:55
> sprintf(szBuffer,"%s",szBuffer);

( ゚д゚) !?

728:デフォルトの名無しさん
08/01/22 00:30:53
>>725
bitmaskするだけだろ

729:デフォルトの名無しさん
08/01/22 01:17:46
動画にアクセスしたらzoomeのDQNは早い
70Mbpsぐらい出たよ インターネットなら
透過スピードに近いのではないだろうか?
URLリンク(www.lunascape.jp)
Lunascape Core Version 4.5.2.1 / ANSI
Operating System Version 6.0.6000
Internet Explorer Version 7.0.6000.

730:デフォルトの名無しさん
08/01/22 05:08:26
bitmask?よくわからん?

731:デフォルトの名無しさん
08/01/22 20:55:45
あきらめたほうがいいね

732:デフォルトの名無しさん
08/01/22 21:06:04
ソケットでの通信を行うときのバッファサイズについてなのですが、
イーサネットのフレームは最大1518バイトらしいので
バッファは1600バイト程度取っておけばいいんでしょうか?

733:デフォルトの名無しさん
08/01/22 21:15:05
>>732
TCPのウィンドウバッファはもっと大きいよ。

734:デフォルトの名無しさん
08/01/23 17:41:26
どのくらい取っておくのが普通?

735:デフォルトの名無しさん
08/01/23 18:27:41
>>734
TCPとかイーサネットとかの仕様は考えなくて良い。
自分で設計したプロトコルに基づいてバッファを決めるのが普通。
どうせ、recvでまとめて受信したり、分割して受信したりするんだから。

736:デフォルトの名無しさん
08/01/24 14:50:24
質問す。
ソケット繋がった状態で、LANケーブル抜いて、すぐ差し直して、まだソケット繋がったまま。
何故切断されない?

737:デフォルトの名無しさん
08/01/24 14:55:48
TCPは送ったパケットが届かなくても何度か再試行するから、そのときに届けば問題なし

738:デフォルトの名無しさん
08/01/24 15:05:32
>>736
そもそも下のレイヤの信頼性を補うためのプロトコルがTCPだ…

739:736
08/01/24 15:12:29
>>737 >>738
あー、そっか・・・いいこという。

740:デフォルトの名無しさん
08/01/24 15:28:30
WindowsでLANケーブル抜くと断線扱いで
まさに>>736のときネットワークが落とされるんだが
これはどうしたらいいかね

741:736
08/01/24 15:40:46
>>740
それは回線切断を検知したというか、
LANケーブルが抜けたことを検知した、ってことかな。

742:デフォルトの名無しさん
08/01/24 22:19:21
>>740
Windows で TCP/IP のメディア検出機能を無効にする方法
URLリンク(support.microsoft.com)

743:デフォルトの名無しさん
08/01/27 15:31:55
accept関数の宣言は /include/sys/socket.hでされてるのは分かったのですが
externされてて中身がどこで表記されてるのかが分かりませんでした。
どこに表記されているか教えてもらえないでしょうか…。

744:デフォルトの名無しさん
08/01/27 17:46:25
UNIX系統なら、acceptの中身はシステムコール叩いてるだけだから、
カーネルに実体がある、といった方が良いのかな。

745:デフォルトの名無しさん
08/01/27 18:53:00
詳解TCP/IP Vol.2だと、uipc_syscalls.cを見てるね。

746:デフォルトの名無しさん
08/01/28 08:04:18
チャットプログラムを作ろうとしているんだけど
同時に複数のデータを送りたい場合はどういうやり方が常道なんだろう

具体的には発言者、発言内容、文字色のデータがあるとして
適当にカンマ区切りとかにして一回で送信するか
それぞれで三回送信した方がいいのか

747:デフォルトの名無しさん
08/01/28 12:03:48
TCPなら3回に分けて送信したって区切りの代わりにはならんぞ
10バイトを3回送信しても30バイト一度に受信するかもしれんし1バイトずつ30回受信するかもしれんし
区切り文字でもいいけどデータサイズを前に付ける方がたぶん楽
カンマ区切りにするなら発言内容にカンマ含んでるときのことも忘れずに

748:デフォルトの名無しさん
08/01/28 12:38:43
isprint()な文字しか投稿不可能なんだろうから、
ヌル終端に決めといて、最大サイズ制限あり。

発言者\0発言内容\0文字色\0

が簡単と思う。

送られたデータサイズは疑う必要があるから、
(分散システムでは、完全性の仮定レベルをかなり低くする必要がある)
データサイズが送られても、結局は同じ様なコードになる。
バッファ管理とか、タイムアウト処理とか。



749:デフォルトの名無しさん
08/01/28 12:53:24
質問なんですが、

select使って多重処理のサーバ作ってるのですが、
A、Bという二つのクライアントがサーバに繋がってるとして
Aから送った文字列に対してのレスポンスをAだけでなくBにも返す時ってどうすればいいんですか?

アドバイスだけでもお願いしますorz

750:デフォルトの名無しさん
08/01/28 13:02:15
AとBの両方に同じものをsendすれば?

751:デフォルトの名無しさん
08/01/28 19:07:13
ある装置で、クライアントで接続するTCPポートxxxxxと、サーバーで接続するTCPポートxxxxx + 1があって
装置から接続先に送るものを、クライアントとして接続したポートで送信し、接続先から装置に対して受信
するものをサーバーとして接続したポートで受信する仕様で通信しているのですが。
種類と発生タイミングの違う複数のデータに対して同じポートで送受信しないといけません。
送信するデータは応答を返すのですが、送信するポートと別のポートで応答を受信するような感じです。
糞仕様にしか思えないのですが、こういうのもありなんでしょうか?


752:デフォルトの名無しさん
08/01/28 19:44:57
SYNパケットはどんな目的で使われるものですか?

753:デフォルトの名無しさん
08/01/28 19:46:26
TCP3ウェイハンドシェイク

754:デフォルトの名無しさん
08/01/28 19:49:05
>>751
日本語でおk

755:デフォルトの名無しさん
08/01/28 19:54:22
>>751
読みづらい…。

756:デフォルトの名無しさん
08/01/28 20:05:24
とんでもなく勘違いしているのかもしれんが
Winsockってacceptで処理がとまりませんか?
どうしてもこれが気に入らないのですが、どうにかならないですか?

757:デフォルトの名無しさん
08/01/28 20:12:33
ノンブロッキングにすれば止まらない

758:デフォルトの名無しさん
08/01/28 20:20:17
ありがとうございます!


759:デフォルトの名無しさん
08/01/28 20:44:28
非同期にしても止まらない

760:751
08/01/28 21:40:17
装置A→装置Bに(Aから見た)送信専用ソケットと、受信専用ソケットを2つ開いてデータのやりとりをする形式についてです。

①が装置Aから装置Bに送信するデータ
②が装置Bから装置Aに送信するデータ

     装置A            装置B
ソケット1 ソケット2    ソケット1’  ソケット2’
| | ① | |
| +------------>| |
| | ①の応答 | |
|<-------------------------------+
| | | |
| | ② | |
|<-------------------------------+
| | ②の応答 | |
| +------------> |

データはいろいろな形式があって、それを送受信用ソケットでまとめて送る感じです。
Telnet, FTP 等のサービスを送受信用ソケットでやりとりするみたいなものは、どうなんだろうかと。。

761:デフォルトの名無しさん
08/01/28 21:40:54
ごめんずれちゃった。。

762:デフォルトの名無しさん
08/01/28 22:50:37
>>760
だれか解読ヨロシク。

763:デフォルトの名無しさん
08/01/28 22:53:03
頭悪いPLC屋とか相手だと、TCP2コネクションで送受信回線が~
とか言い出すな。

764:デフォルトの名無しさん
08/01/28 22:55:56
俺は、これが気になる。

> Telnet, FTP 等のサービスを送受信用ソケットでやりとりする

なんか、すごいこと考えてそうな予感...








んなわけねーか。(w

765:デフォルトの名無しさん
08/01/28 22:58:00
Winsockを使ってSYNパケットを送信する事は可能ですか?

766:デフォルトの名無しさん
08/01/28 23:04:10
connect発行するんじゃなくて、生に「SYNだけ」送信する、
という話なら、おとなしくWinPCapとか入れて叩いた方がいいとおもう。

767:デフォルトの名無しさん
08/01/29 00:29:54
とりあえず効率や生産性を無視して動くものを作ってみろと言いたい

768:デフォルトの名無しさん
08/01/29 02:11:03
sendで任意のホストに文字列を送信したいんですが どうも上手くいきません。
アクセプトしたときのsockaddrinのIPとポートを弄るだけでは駄目なんでしょうか?

どうすれば送れるのでしょうか

769:デフォルトの名無しさん
08/01/29 02:45:16
いいからソース出せや

770:デフォルトの名無しさん
08/01/29 03:03:22
とりあえずhost1から来た文をhost1,2に返すような感じのコードで
あらかじめfrom2にhost2のIPポートを入れておいて

socket()
bind()
listen()
while(1)
{
switch(select())
case -1:エラー処理
case 0:タイムアウト
default:

accept( struct sockaddr * &from)

recv()
send()
if(fromがhost1の情報だったら){
from = from2
send()


771:768
08/01/29 03:09:06
>>769
あ・・途中でShift Enterで書き込んじゃいましたゴメンナサイorz

コード的には>>770のような感じです。
後はクライアントが打ち込んだ文字列をそのままオウム返しするような感じです。

これで動かすとhost1で例えばAAABBBと打ち込むと
host2には届かずに、host1だけにAAABBBと帰ってきます。

次にCCCDDDと打ち込んだ時に
host1だけにもう一度AAABBBが帰ってきます。

次にEEEFFFと打ち込んだときに
host1だけにCCCDDDが帰ってきます。

何かhost2に届かないばかりかワンテンポ遅れる+ダブって帰ってきてしまいます。

772:デフォルトの名無しさん
08/01/29 04:10:18
× ~のような感じです
× 基本を無視
× 環境を書かない

773:デフォルトの名無しさん
08/01/29 05:14:02
AAABBBが2度返ってくる時点で、どう見ても自分のコードのバグだろうに。


ところで、一番重要な、acceptの返り値はどうしてるんだい?

774:デフォルトの名無しさん
08/01/29 06:58:05
tteいうか、
>from = from2
>send()

まさかこれで from2 のどこかのポートに何か送れると思ってる?

775:デフォルトの名無しさん
08/01/29 07:02:08
768は、TCPの「コネクション」というものについてもう一度考え直すように。
acceptの戻りのソケットは、そのIP:port専用で、from_addrを
書き換えたからと言ってもどうにもならない。

776:デフォルトの名無しさん
08/01/29 16:30:55
気になったんですが、
WinPCap等はどうやって作られているんですか?

777:760
08/01/29 16:50:24
>>763
えーとPLC屋です。いわれてる通り、送信のみ、受信のみのコネクションをそれぞれもつ感じです。
Telnet, FTP というのは例えで、ネットワークの階層構造を考えたときに、トランスポート層のTCPとその上のサービスが
1:1じゃない実装になるのですが、ありなのかなと。

778:デフォルトの名無しさん
08/01/29 19:12:45
ありもなにも、TCP2回線つかって、TCPをもう一段建て増しに
するような真似は止めとけとしか言いようがない。

779:デフォルトの名無しさん
08/01/29 23:49:48
>>776
はいどーぞ、そういうときはドキュメント読んでね
URLリンク(dog.tele.jp)

780:デフォルトの名無しさん
08/01/30 02:01:22
>>776
たんにドライバに渡されるEthernetパケットのコピーを横取りしてるだけ。

781:デフォルトの名無しさん
08/01/30 14:03:09
TCPのTIME_WAIT状態に関してRFCでは2MSL時間とあり、OSの実装によって 30~240 秒取られているのですが。


a.2MSLまたないで同じポートを使用した場合、ルーター等で貯めこんでいた以前のパ
 ケットを受信することで、シーケンスの順序がおかしくなりRSTフラグが飛び交う。
 なのでTIME_WAITは必要?
b.TIME_WAITはクライアント側に必要で、サーバー側は無視してよい。通信用とは別の
 Listen用ソケットを使用するとしても、通信用でTIME_WAITは無視してよい。
c.TIME_WAITと比較してごく短い間隔で接続を繰り返すアプリがあると、利用できないポ
 ートが増え続けいずれ通信できない状態になる。こういう時TIME_WAITは短くして良い?
 それともアプリが間違っている?
 

782:デフォルトの名無しさん
08/01/30 15:22:22
>>781
TIME_WAIT は TCP パケットの順序解決を保証するもの。

同一 IP/port 同士が一度コネクションを切り、新たに
コネクションを貼ったときにネットワーク内に同じシー
ケンスIDが登場しないことを保証している(新旧のパケッ
トが混ざらないことを保証している)。

要するに世界中のネットワークから通信に使ったパケッ
トが消えてなくなるのに 2MSL 待てばまぁいいんじゃね?
ということ。

たとえば、サーバ側で過去 2MSL 間に接続した相手の
IP/port のリストをローカルな port 毎に管理していて、
接続要求に来たクライアントの IP/port がリスト内に
無ければ 2MSL 待たずに接続して良い(似たような話が
RFC にあったはず)。


783:デフォルトの名無しさん
08/01/30 19:15:06
 アプリケーション層でプロトコルの設計、送受信処理の仕方を
勉強したいのですが、おすすめの書籍やサイトはないでしょうか?
やっぱり、RFCやオープンソースのコード読むのが一番?

784:デフォルトの名無しさん
08/01/30 19:53:01
ミドルウェアの解説本読んでみたら?

785:デフォルトの名無しさん
08/01/31 01:41:45
>>781
クライアントとかサーバとかじゃなくて、TIME_WAITは基本的に「先にcloseを発行」
したほうに生じる。んで、TIME_WAITが必要な理由は、教科書に書いてある通り。

a.TIME_WAITは必要だが、どの程度にするかは実装依存
b.最初に書いたとおり、クライアントかサーバは関係ない
c.アプリは間違っていない。TIME_WAIT時間を減らすか、HW資源を増やすかはアナタしだい

786:デフォルトの名無しさん
08/01/31 13:05:23
>>783
ここはどうかな?

「ネットワークプログラミングの基礎知識」
URLリンク(x68000.q-e-d.net)

サンプルコードがあって解りやすかった。

787:デフォルトの名無しさん
08/01/31 13:06:19
>>786
いい加減にしろ!

788:デフォルトの名無しさん
08/01/31 21:09:16
教えてください。
VC++ WinSock でサーバプログラムをしているのですが、複数クライアントからのデータ受信で難航しております。

仮に、サーバAがポート3000で待ちうけ状態の時、クライアントB及びCと接続、B、Cから同時にデータが送信された時、Aのrecvプロセスでデータがごちゃごちゃになります。
クライアントに対してのrecvはそれぞれスレッドで処理をしてるのですが、Bの受信イベントでCのデータも受信されてしまいます。

同一ポートでもacceptしたそれぞれのソケットで送受信できないのでしょうか?
考え方自体間違っていますか?
お願いいたします。



789:デフォルトの名無しさん
08/01/31 21:31:55
>>788
>recvプロセスでデータがごちゃごちゃになります

ありえない動作だから、あなたのプログラムがバグってる。
acceptって書いてるし、たぶんTCPの話だよな?

ソースみせてみ。

790:デフォルトの名無しさん
08/01/31 21:36:41
>Bの受信イベントでCのデータも受信されてしまいます。
TCPだろ、そんな訳あるか。acceptで戻ってきたソケットは、
そのピア専用になるに決まってるだろ。
あるいはひょっとして電波が届いたけど、acceptの戻りを上書きして、
スレッドB.CでどっちもソケットCを待ってるとかいうオチじゃないだろうな。

791:788
08/01/31 22:00:11
はいTCPです。ざっとですが、こんな感じです。
通信ソケットはクラス化しています。
CServerSock{
  SOCKET m_Sock;
  recvfunc();
};
CServerSock SvSock[2];

AcceptFunc()
{
  int cnt = 0;
  while( 1 ){
    socket = accept(litensock,...);
    SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て
    CreateThread(~)で各m_Sock用のrecvスレッド(recvfunc)を生成。
  }
}

CServerSock::recvfunc()
{
  char buf[2048];
  while( 1 ){
    ret = recive( m_Sock, buf, len, 0 ); // このrecive後のbufの内容がB,Cごっちゃになります。
    if( ret == 0 || ret == SOCKET_ERROR ) break;
    ::SendMessage( m_hWnd, m_wMsg, (WPARAM)len, (LPARAM)buf ); 親ウインドウへ通知
  }
}
わかりずらいかもしれませんがよろしくお願いします。

792:デフォルトの名無しさん
08/01/31 22:08:22
> CServerSock SvSock[2];
> SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て

普通、コンパイルエラーになるだろ。
(そもそも、private なメンバ変数 m_Sock にアクセスできないし...。)

C++ じゃない、俺の知らない言語かも知れんが。

793:デフォルトの名無しさん
08/01/31 22:09:06
あれ?
それってひょっとして、デバッガでブレークして確認したとかいわないよな?

794:788
08/01/31 22:12:51
>>789 >>790
そうですよね。
基本的にBが送信A処理、Cが送信A処理の順番だときっちりBのスレッド、Cのスレッドで処理が行われるので・・・。
>>792
すいません。publicメンバです。書き忘れました。
>>793
ブレークとm_Sockの番号等で確認しましたが・・・。


795:デフォルトの名無しさん
08/01/31 22:18:33
ネタだろこいつら
かまってほしいだけだよ

796:788
08/01/31 22:59:26
>>795
残念ながらネタではないんですよ。

とりあえず、同一ポートでacceptした個々のSocketで送受信は問題なさそうなので、他でアホなことしてないかもう一度見直してみます。
すみません&ありがとうございました。


797:デフォルトの名無しさん
08/01/31 23:16:34
AcceptFuncのwhileでSvSock.m_Sock[cnt++] = socketのようにせず、
CServerSockのコンストラクタでsocketを受け取るようにしてみては?
Socketの受け渡しが面倒だけど、オレはそうやって処理してる。


798:デフォルトの名無しさん
08/01/31 23:31:49
>>794
> すいません。publicメンバです。書き忘れました。

public でも、

> SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て

は通らんだろ。(SvSock[cnt++].m_Sock = socket; ならわかるが。)

ネタじゃないなら、情報細切れに出さずに、ソースをそのまま載せるなり、
どっかにアップしろよ。

799:デフォルトの名無しさん
08/02/01 10:56:19
なにをもってごっちゃと判断してるの?

800:781
08/02/01 10:59:33
>>782,785
なるほど、大変参考になりました。

ついでに、もう一つ質問・・
クライアント側で TIME-WAIT を発生させないようにする為、サーバー側は待ちうけ用の
listen ソケットを用意し、クライアント側から切断する時はサーバーに切断用の制御電文
を送信し、必ずサーバー側から Close を発行するのは大丈夫でしょうか?



801:デフォルトの名無しさん
08/02/01 12:12:48
待ちうけ用のlistenソケットを用意って、すでにあるacceptしてるやつとは別に?なんのために?

802:781
08/02/01 12:37:36
えーと、listen で待つソケットと accept したソケットが同一の場合の実装もあると考えて、そうではないという意味で書きました。

803:デフォルトの名無しさん
08/02/01 12:53:21
そんなのあるのか?

804:デフォルトの名無しさん
08/02/01 18:23:08
今、UPnPを使いポートマッピングを行うプログラムを組んでいるんですが、
はじめはポートマッピングに成功するんですが、突然成功しなくなります。
それについて、どういった理由が挙げられるでしょうか。

どなたかご教授下さい。

805:デフォルトの名無しさん
08/02/01 18:32:20
>>791
>SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て

cntはローカル変数なんだし、acceptされるたびに'SvSock.m_Sock[1]'
になるのでは?

806:デフォルトの名無しさん
08/02/01 18:57:24
あげ

807:デフォルトの名無しさん
08/02/01 19:08:31
ローカルだけど、while(1)でその関数抜けないならずっと生きてるんじゃないの。

808:デフォルトの名無しさん
08/02/01 19:18:41
Winsockでhtmlファイルを1024パイトずつ取得し、
calloc等により動的に記憶域を確保
そこに全て入れてからURLを抽出する、
という方法を考えているんですが、

何か、良い方法はありますか?

809:デフォルトの名無しさん
08/02/01 19:21:17
良い方法、というのは、たとえば、Perlでも使っとけ、みたいな話?

810:デフォルトの名無しさん
08/02/01 19:22:22
>>807
確かによく見たらbreak処理が無いな。
え。無限ループって事は配列オーバーしないかい?
あと、Acceptfunc()が呼ばれるタイミングもいまいちわかんないね。FD_ACCEPT直下?

811:デフォルトの名無しさん
08/02/01 19:27:03
それもスレッドから呼ばれるんじゃないの?知らないけど。
Main,Accept, 送受信スレッド連中、みたいな。

812:デフォルトの名無しさん
08/02/01 19:36:32
>>809
効率の良い方法、です。

813:デフォルトの名無しさん
08/02/01 19:37:58
マルチスレッド使ったことなす;・ω・)

ポートマッピングに詳しい人。
>>804をたのみます。

814:デフォルトの名無しさん
08/02/01 20:16:33
>>800
サーバからCloseを発行して、クライアント側ではrecvで0が返ったことを
確認してcloseすればクライアントはTIME_WAITには入らないから大丈夫。

ただし正常系はそれでいいが、例えばサーバが無応答になった場合など、
クライアントから切断せざるをえない場合も発生するよ。

切断用の電文は、>>801のいうように切断したい接続上でやりとりすれば
いいと俺も思う。バイナリを大量に転送中で中断が難しいような場合だと、
転送用の接続と、コマンド用の接続を分けるというのも確かにやるけど(FTPみたいに)。

815:デフォルトの名無しさん
08/02/01 20:36:51
>>804
理由はあまりに多すぎて、いちいちあげる気にならない。

パケットログか、ソースをアップしてくれ。

816:デフォルトの名無しさん
08/02/01 21:54:53
>>815
プログラムはほぼ
URLリンク(www.bosuke.mine.nu)
を参考にしました。ってか、ここのサンプルでもあけられないです。

処理ではWANIPを取得する際に失敗するようです。
ちなみに、二重ルータなんですが、ルータのIPは192.168.xxx.1ではなかったです。
'1'の部分が百いくつだったはず…ここでミスってるんですかね?

ソースはサンプルプログラムのinvoke関数です。
XMLとかわかんないんであまりうまく調べられて無いような感じです。

817:デフォルトの名無しさん
08/02/01 22:19:14
>>816
>'1'の部分が百いくつだったはず…ここでミスってるんですかね?

UPnPは、IPアドレス情報も含めてプロトコル上でやり取りして、自動設定してくれる。
だから、ここは関係ない(はず)。

818:デフォルトの名無しさん
08/02/01 22:22:00
>>816
とりあえずinvoke関数の中のどこでエラーが返ってるかログしこむなりして、
調べれ。

819:デフォルトの名無しさん
08/02/01 22:22:05
二重ルータ?

820:デフォルトの名無しさん
08/02/01 22:36:01
>>817
なるほど

>>819
モデム(ルータ機能付き)>ルータ>★自分&他複数PC
________________>ルータ>複数PC

こんな感じです。

とりあえず、環境と離れるんで
invoke関数の調査は週明けにでもやります。

821:デフォルトの名無しさん
08/02/01 22:39:37
UPnPはエラーならエラーコードがわかるはず

822:デフォルトの名無しさん
08/02/01 22:49:50
>>820
ルータ(1)>ルータ(2)>設定を実行するPC

という環境であるとして、設定したいルータが「ルータ(1)」ならそもそも
できない可能性がある。UPnPはマルチキャストを使ってるのだが、
ルータ(2)がマルチキャストルータでないと、PCで発行した
マルチキャストパケットは、ルータ(2)を超えられない。
で、個人用の安価なルータがマルチキャストルータということは
まずない。

ルータ(2)がマルチキャストルータで、マルチキャストパケットが
ルータ(1)まで届いたとしても、同一ネットワークからじゃないと
UPnPのSOAPリクエストにたいして応答を返さないようなルータっ
ていうのは存在する。

でも、「出来るときと、出来ないときがある。」って書いてあるから、
ちがうのかもだが。

823:デフォルトの名無しさん
08/02/01 22:52:52
あーそれからルータをこえてマルチキャストパケットを届けたいなら、
IGMPメッセージを発行する必要がある。これはUDPソケットに対して、
IGMP_JOINなどをAPI経由で発行する。

やってるかもしれんが。

824:デフォルトの名無しさん
08/02/01 22:53:50
マルチキャストはルータ発見時しか使わないから、
そこをたとえば手動で設定すれば良いんじゃないかな。
ルータ1と2で同じポートを開けないとイケナイのがアレだけど。

825:デフォルトの名無しさん
08/02/01 23:03:41
>>824
おまえアタマイイナ

826:デフォルトの名無しさん
08/02/01 23:05:02
でもなーんか、UPnP使う意味がない気がしてきたな。。。w

827:デフォルトの名無しさん
08/02/01 23:09:02
余談だが、これ気をつけろよ。

「Flashを悪用してUPnP経由でルータの設定を変更する攻撃は、これまでに報告
されたルータ攻撃方法に比べて何百倍も危険性が高いとSymantec。」
URLリンク(www.itmedia.co.jp)

828:デフォルトの名無しさん
08/02/02 13:09:07
recvで1024ずつ一つのhtmlファイルを取得する場合
htmlファイル合計バイト分の記憶域を確保するためにはどうすればいいですかね?

829:デフォルトの名無しさん
08/02/02 13:20:50
最初に1024バイトのバッファを用意してそこに書いていって、足りなくなったら
reallocすればいいやん。

830:デフォルトの名無しさん
08/02/02 13:48:07
C++なもので

831:デフォルトの名無しさん
08/02/02 13:57:16
>>827
それは
1 UPnPでルーターに穴をあける。
2 ルーターのWEB/IFをWAN側からアクセスする。
って事でいいのか?

832:デフォルトの名無しさん
08/02/02 14:08:07
>>830
resizeとかreserveとか

833:デフォルトの名無しさん
08/02/02 14:11:19
>>831
DNSサーバアドレス書き換えて、フィッシングサイトにとばすとかもできるんじゃね。

834:デフォルトの名無しさん
08/02/02 14:20:23
>>833
残念ながら、UPnPにはDNSサーバーを設定するという機能はないのだよ。

835:デフォルトの名無しさん
08/02/02 14:43:42
>>831ができれば書き換えられるんじゃね。

836:デフォルトの名無しさん
08/02/02 14:54:58
char *buf;
buf = (char *)calloc(1024,sizeof(char));
で記憶域を確保して、
確保した領域の大きさを変更する場合をどのように判断したらよいですかね?

837:デフォルトの名無しさん
08/02/02 15:01:21
>>836
ネットワークのスレじゃなくて、プログラミング初心者のとこで聞いてこいよ。

838:デフォルトの名無しさん
08/02/02 15:01:38
日本語でお願いします。

839:デフォルトの名無しさん
08/02/02 15:05:36
>>836
recvの返り値で読み込んだバイト数が分かるから、whileやforでカウントすれば?

840:デフォルトの名無しさん
08/02/02 22:42:55
まぁreallocとか時間かかるから、ある程度大きいバイト数を1ブロックとして、
ブロックごとで領域を確保していった方がいいと思う。いちいちrecvの返り値分だけreallocしていくよりはね。
HTMLファイルだけが対象ならアレだけど・・・。

841:デフォルトの名無しさん
08/02/03 10:39:49
ブロックごとに領域を確保していくっていうのがよくわかりません。

842:デフォルトの名無しさん
08/02/03 12:02:17
age

843:デフォルトの名無しさん
08/02/03 12:10:08
ガジェットの作り方?
URLリンク(www.nifty.com)


844:デフォルトの名無しさん
08/02/03 12:42:26
ブロックごとで領域を確保していく
コードで示して下さるとありがたいのですが、
駄目ですかね?

845:デフォルトの名無しさん
08/02/03 13:00:48
Un*xのsendfileやWindowsのTransmitFileって効果が大きいですか?
boost::asio使おうと思ったんだけどsocketの完全なラッパーなのでsendfileが使えなくてどうしようかなと

846:デフォルトの名無しさん
08/02/03 13:04:55
使われる環境で全然違うから、評価環境つくって測定しなきゃ意味ねー。

847:デフォルトの名無しさん
08/02/03 14:04:06
Webダウンローダーの仕組みってどうなってるんですか?

htmlやjpg等の拡張子判別とか、html内のリンク抽出とか
重複I/O等使っているんでしょうか?

848:デフォルトの名無しさん
08/02/03 14:39:51
一行目と二行目の違いに愕然とした

849:デフォルトの名無しさん
08/02/03 15:25:39
もしかして wget の中身を知りたいの?


850:デフォルトの名無しさん
08/02/03 16:09:30
ちまちま数バイトずつ確保していくよりも、
ドーンと確保して足りなくなったらまたドーンと確保するって事だろ。
コードを示してもらうほどでもない。あと、スレチになりつつある。

851:デフォルトの名無しさん
08/02/03 18:19:01
>>844
ブロックごとでなくても良いから、一回自分で考えて作ってみたら
どうだろう?

852:デフォルトの名無しさん
08/02/03 21:15:39
>>851 に一票

正解を探し回るより、とりあえず動くものを作る方がいろいろ理解できるよ。

そもそも、最近のマシンだと、ちまちまメモリー確保してもそれなりに動くし。

853:デフォルトの名無しさん
08/02/04 00:35:23
てかメモリ確保くらいならサンプルコード腐るほど落ちてる。

854:デフォルトの名無しさん
08/02/04 21:44:58
こんにちは。
winsockでネットゲームを作っているのですが、
サーバーを介さないで4人のクライアント同士で通信し合いたい(peer to peer)場合、
各々が相手3人のクライアントのソケットを持ってる必要があるのですが、
どうやってクライアント側のソケットを取得するのでしょうか?
(ホストのは取得出来ます)




855:デフォルトの名無しさん
08/02/04 22:14:19
TCP?UDP?

856:デフォルトの名無しさん
08/02/04 22:27:53
TCPです。
単純に4人共がlistenして全員が相手3人にconectし合えばいいのかな
と思ったりしましたが、もっと良い方法はありますか?

857:デフォルトの名無しさん
08/02/04 22:32:49
普通のご家庭にはルータがあってNATの向こうにPCがあるもんだが
その環境だと互いにtcpでつなぐのはしんどいぞ
どういうのを想定?

858:デフォルトの名無しさん
08/02/04 22:48:37
>>856
別にそれでいいんじゃない?

>>857
ネットゲーム作ろうかと言う奴なんだから、バーチャルサーバとか
ぐらいは知ってるんじゃないかな。

859:デフォルトの名無しさん
08/02/04 22:56:10
バーチャルサーバ?

860:854
08/02/04 23:15:42
マッチングサーバーを作ってそこで4人組み合わせて後はpeer to peerでと考えています。

接続時に指定するポート番号っていうのはホスト側のアプリケーション識別番号で
クライアント側は自動的に空いてるポートが使用される。。。
という考え方で合っていますか?

4人共がlistenして全員が相手3人にconectし合う場合、
4人共がポート2000の同一番号でlistenしてても問題ないでしょうか?

861:デフォルトの名無しさん
08/02/04 23:22:38
グダグダ考えずに一台をサーバにすればいいじゃないか

862:デフォルトの名無しさん
08/02/05 00:05:32
>>860
問題ない。

て言うか、まずは二台でお互いにコネクション張って実験してみな。

863:854
08/02/05 00:15:44
>>861
その通りなのですが、何故かそういう仕様になっているのです。
何のメリットがあるのか全くもって分かりません(泣

>>862
はい、やってみます。ありがとうございます。


864:デフォルトの名無しさん
08/02/05 00:21:25
1時間で仕様が決まったのかwww

865:デフォルトの名無しさん
08/02/05 00:29:37
仕様を作った馬鹿に質問するなり文句言えばいいのに

866:デフォルトの名無しさん
08/02/05 01:23:39
ハイブリッドP2Pって事か。
NAT越えが出来なくて泣いちゃいそうだな。
かくいう俺も出来ないわけだが。

867:デフォルトの名無しさん
08/02/05 22:34:15
>>863
リアルタイム系のゲームなら、いちいちサーバーを介してデータの
やり取りなんかしてられないので、P2P は別におかしくない。

まあ、それなら TCP と言うのがちょっと疑問だが。

868:デフォルトの名無しさん
08/02/06 03:07:14
P2Pだと同期制御が課題になってくるけどな

869:デフォルトの名無しさん
08/02/07 12:20:11
TCPってダメなの?
俺は、UDPは送信データの欠如があるとかであんまり信用して無いんだが。

870:デフォルトの名無しさん
08/02/07 12:35:35
両方つかえばいいんじゃないか?
UDP -> リアルタイムに反映したいもの ( キー入力、キャラクターの移動ベクトル )
TCP -> 正確にやりとりしたいもの ( 同期取るPCからのデータとか )

871:デフォルトの名無しさん
08/02/07 12:41:26
>>869
TCPは信用しているということなら、
TCPスタックは信用しているって事なので、
アプリの要求から観て、信頼できるかどうかは、
中間層にかかっているのでは?
だからUDPで書いても、アプリに必要なレベルの信頼は保てる。

872:デフォルトの名無しさん
08/02/07 13:33:44
VS2005で
Winsockを使っていてSD-BOTHが定義されていない、と出るのですが、
何でですかね?

873:デフォルトの名無しさん
08/02/07 13:36:01
SD-BOTHが定義されていないから

874:デフォルトの名無しさん
08/02/07 13:48:14
>>873
どうしたら解決出来ますかね?

875:デフォルトの名無しさん
08/02/07 14:39:42
SD-BOTHが定義されていない、と出ないようにする

876:デフォルトの名無しさん
08/02/07 15:41:01
ソケットを閉じるときに
いきなりclosesocketでも問題はないが、
shutdown(socket,SD_BOTH);
とすることがある。
これは送信、受信ともに通信を切断する意味だったと思う。

877:デフォルトの名無しさん
08/02/07 16:22:53
shutdown(s, SHUT_WR);

878:デフォルトの名無しさん
08/02/07 17:36:53
>>814

いろいろと、ありがとうございます。

切断したい時はサーバーからCloseしてもらえば問題なく、また
相手がいなくなった時に自分から Close する場合は

1.相手応答ないので Close。
2.TIME_WAIT 状態になる。
3.TIME_WAIT 満了前に再接続する
4.local port +1 して(空きポートで)即 Connect する。
5.相手いないので Connect 失敗でエラーが返る。
6.エラーなので Close する。

と、接続状態から切断の遷移にならないので、TIME_WAITにはなりませんでした。

ということで、TIME_WAIT状態のソケットが溢れるとしたら、それは、
接続後に自分から切断しまた接続する動作をしてるって事ですね。

879:デフォルトの名無しさん
08/02/07 20:20:46
>>878
相手が存在しない場合、closeの発行ではFINの再送状態になる
わけだからTIME_WAIT状態にはならない。だがサーバがコマンド
に応答しない場合でも、FINに対しては(recvで0が返ったら)
close処理を行う場合、クライアントはTIME_WAIT状態に入る。

そこら辺まで行くと、ちゃんと書籍を横においてTCPの挙動理解
するようにしながら、プログラム造ったほうがいいと思うよ。
リチャード・スティーブンスのTCP/IPvol1一冊あればいい。

880: ◆TCP/IPzk8E
08/02/08 23:44:57
test

881:デフォルトの名無しさん
08/02/09 00:20:13
素晴らしい

882:デフォルトの名無しさん
08/02/09 18:09:17
ほほう

883:デフォルトの名無しさん
08/02/10 07:51:52
質問です。
オンラインのアクションゲームを作りたいのですが、
プレイヤー間の同期を取る方法について詳しく知りたいです。


884:デフォルトの名無しさん
08/02/10 12:30:24
同期なんか取りません
ネットワークの遅延は避けられません
いかに結果の辻褄を合わせて上手く誤魔化すかに注力した方が良いかと思います

885:デフォルトの名無しさん
08/02/10 16:29:09
>>883
相対時間ではなく、絶対時間で動作させる。


886:デフォルトの名無しさん
08/02/11 00:25:12
>>884
推測航法?とかいうので移動を予測するとかいうのは聞いたことがあります。

>>885
クライアント側から「時刻XXXまでに○○へ移動」みたいなものを送る感じでしょうか。
時刻をサーバとクライアントで同期させる必要がありそうですね。
リアルタイム性のあるゲームに利用できるかもいまいちわかりませんが。

というか、クライアント→サーバ間でどのくらい時間かかるかためしたことありませんでした。。
pingとかではかってみます。

887:デフォルトの名無しさん
08/02/11 01:10:55
>>886
最終的にクライアントに戻すんだからクライアント→サーバー→クライアントの時間を考えた方が

888:デフォルトの名無しさん
08/02/11 01:15:24
一定時間ごとにサーバがスナップショット送って同期をとるのが基本
LAN限定にするならそうシビアになることもないけどな

ちなみに演算はサーバ側で行うのが基本
同期とりやすいし、不正もある程度は防げる

889:デフォルトの名無しさん
08/02/11 13:18:35
失礼します。
現在、クライアント←→サーバー型のチャットを作ろうとしています。

ですがネットワークプログラミング自体が今回初めてで、
猫でもわかる~の本を読んでいるのですが何から手をつければいいか分かりません。

どなたか基本的な作り方(?)、もしくは参考になるサイトをご存知の方がいましたら返答お願いいたします。
ちなみに言語はCで考えていますが、C++の方が比較的分かりやすい等あれば変更する予定です。

890:デフォルトの名無しさん
08/02/11 13:51:41
>>889
ソケットプログラミングでググレ
ほとんどは題材がチャットC/S
関数がわからなかったら関数名でググレ

891:デフォルトの名無しさん
08/02/11 13:53:15
>>889
チャットくらいなら、CとかじゃなくてPerl,Ruby,Pythonのようなスクリプト言語
がいいよ。

プログラムの初心者で、オブジェクト指向になじみがなければ、Perl使って
みるといいんじゃないかな。ブラウザ使ってのチャットならPerlでCGIを作る
方法を解説した本が一冊あったほうがいいんじゃない。

892:デフォルトの名無しさん
08/02/11 14:01:57
お早いレスサンクスです

>>890
すいません、素でググるの忘れてました・・・本当に大抵がチャットC/Sのものばかりのようで参考になります。
感謝です

>>891
最終的には3Dのネトゲを作ろうとしているので、Perlなんかで作ってしまうと色々問題が。
そのあたりの事もあるので、C言語で作ろうとしてまして・・・。

893:デフォルトの名無しさん
08/02/11 14:02:00
>>890, 891
TCP のモデル知らずに組んで....
って落ちか?
client より先に server 落したら server 再起動時に
address in use とかエラー帰ってくるとか... ... ...


894:デフォルトの名無しさん
08/02/11 14:11:02
>>892
うーん・・・3Dのネトゲつくりたいなら、TCP/IPの基礎から抑えておく
必要があると思うよ・・・。

入門で以下の本くらいはひとまず読んでみるとか
URLリンク(ssl.ohmsha.co.jp)

何冊か入門本読んだら、リチャード・スティーヴンスの本をそろえて
読む必要があるんじゃない。

895:デフォルトの名無しさん
08/02/11 14:42:13
>>892
> 最終的には3Dのネトゲを作ろうとしているので、
> Perlなんかで作ってしまうと色々問題が。

まずは、ネットワークプログラミングに慣れろと言うことだと思うが。

C 言語がめちゃめちゃ得意でケアレスミスなんて俺には関係ネェとか
言うなら最初から C でもいいけどさ。

# そんな奴は、>>889 みたいな質問はしないだろうし、
# 全角で Perl と書いたりもしないだろうな...。

896:デフォルトの名無しさん
08/02/11 16:16:38
>>895
あぁなるほど、そういう事でしたか・・・失礼しました。
以前多少かじった程度なのでこの際に少し弄ってみることにします。

897:デフォルトの名無しさん
08/02/11 16:25:57
>>896
少し弄るとbitですw

898:デフォルトの名無しさん
08/02/11 16:31:28
P2Pテレビ
URLリンク(www.getmiro.com)(ミロ)
URLリンク(www.v2p.jp)(キーホールテレビ)
URLリンク(www.joost.com)(ジュースト)
URLリンク(www.pplive.com)(ピーピーライブ)
URLリンク(www.ppmate.com)(ピーピーメイト)
URLリンク(www.ppstream.cn)(ピーピーストリーム)
URLリンク(www.sopcast.org)(ソープキャスト)
URLリンク(tvants.en.softonic.com)(テレビの蟻)
URLリンク(www.tvunetworks.com)(TVUプレーヤー)
URLリンク(zattoo.com)(ザトゥー)
URLリンク(www.veoh.com)(ベオテレビ)
その他
URLリンク(tv.uhuru.co.jp)(取説)
URLリンク(cowscorpion.com)(フリーウェア)

899:デフォルトの名無しさん
08/02/11 17:42:49
とりあえずは>>1-のリンクを見るといいんだ

900:デフォルトの名無しさん
08/02/11 18:16:36
       |
  ____  |
  |        |           
          /
          /        /  _____/
          /           |
        /    _/  |   
      ̄           _|
          \ | /    / \
 / ̄| ̄ヽ   ̄ ̄| ̄ ̄ /‐┬┐\  |. ‐┼‐
 |  /   |    ̄ ̄| ̄ ̄   ││   │ __|
 ヽノ   ノ     │    _/___|    し(_丿\

  _____________
 |                    |
 |        |``'''‐- 、      |
 |        l   ∩  `、     |
 |        |   |│   |    │
 |        |   |│  !     |
 |     _,.ィ|   | _.ニ=´‐--、   |
 |   ,、‐' ´_,.ィ|   |>‐'' ⊃  ,)  |
 | (  ⊂ -<!   L.r '"´>''´  |
 |  `''ー---‐''- 、.l>'''´       |
 |   P l a y S t a t i o n    |
 |_______________|

  __   __       __
    / "    / "  =|=    /   /  ヽ  _フ
    (     (   (_    (   ヽ  /   o)

901:デフォルトの名無しさん
08/02/12 14:59:55
コンシューマ機でネトゲーつくったことある人いる?

902:デフォルトの名無しさん
08/02/12 17:22:46
ゲーム製作板行けよ

903:デフォルトの名無しさん
08/02/13 04:03:56
>>901 ありますよ

904:デフォルトの名無しさん
08/02/15 15:14:01
今、TCP転送実験をしているのですが、間違いの原因が分かる方おられませんか?
環境はVC.NET + SDKで勉強してます
TCPでクライアントとサーバプログラムを作成し、ファイル転送実験を行っています。
1MBから100MBくらいのファイルはうまく転送することができるのですが、それ以上の大きなファイルになると、
微妙にファイルサイズが大きくなると言う現象が起きています。サーバはaccept関数をマルチプロセスで動かし、
recv関数もマルチプロセスで行っています。クライアントはsend関数をマルチプロセスで行っています
ファイルサイズが大きくなるほど、ファイルサイズのズレも大きくなるような感じです。
原因の予想がつく方、助言お願いします

905:デフォルトの名無しさん
08/02/15 15:30:43
コード晒せよ

906:デフォルトの名無しさん
08/02/15 15:40:52
ファイルをテキストモードでオープンしていると、LFがくるたびにCR追加されるから
サイズは増えるな。でも100MBまで1つもLFが無いのにそこから入るなんてそうそう無いしなあ
やっぱコード見ないとわからん。

907:デフォルトの名無しさん
08/02/15 17:39:16
recvの戻り値(受信したバイト数)を確認してないとかいうオチ?

908:デフォルトの名無しさん
08/02/15 17:42:09
ネットワークプログラミングって何?

909:904
08/02/15 18:25:45
>>907
するどいご指摘ありがとうございます。
大当たりです。確認を忘れてました。。

910:デフォルトの名無しさん
08/02/15 18:39:54
>>904
こーひーふいたじゃねーか・・・w
ギャグじゃないのだよね・・・w

911:デフォルトの名無しさん
08/02/15 18:40:51
不安すぎるから、送信したデータと受信したデータの内容が
ちゃんと一致するか、テストしとけよw

912:デフォルトの名無しさん
08/02/15 18:41:06
ありえない、騙りじゃないのかよw

913:デフォルトの名無しさん
08/02/15 20:39:18
>>908
telnet上でプログラムすること

914:デフォルトの名無しさん
08/02/15 22:36:01
winsockでsend()でHTTPリクエスト送信してrecv()でデータを受け取るという単純なプログラムを書いています。
yahooや、google等は取得出来たのですが、exciteブログがどうしても取得できません。
エキサイトブログはどの人のブログを試してみても駄目でした。

以下のようなエラーメッセージが出ます。
HTTP/1.1 403 Access Forbidden
Server: Microsoft-IIS/5.0
Date: Fri, 15 Feb 2008 13:28:38 GMT
Content-Type: text/html
--------------: ---

<html><head><title>Directory Listing Denied</title></head>
<body><h1>Directory Listing Denied</h1>This Virtual Directory does not allow contents to be listed.</body></html>

InetSpyを見てHTTPヘッダを同じにしても駄目でした。

エラーメッセージからしてアクセスを拒否られているみたいなのですが解決方法ありますか?

915:デフォルトの名無しさん
08/02/15 22:51:21
取得しようとしてるURLは?

916:デフォルトの名無しさん
08/02/15 23:00:43
http://ユーザID.exblog.jp/
なんだけど、自分のブログとか無くて誰かの晒す訳にはいかないから
URLリンク(www.exblog.jp)
で適当な文字列で検索かけて欲しいです。

とりあえず、誰のでやっても同じでした。

917:デフォルトの名無しさん
08/02/15 23:15:07
telnetでやってだめならあきらめれ

918:デフォルトの名無しさん
08/02/15 23:24:45
>>916
telnet でやったら出来たよ。

$ telnet <hogehoge>.exblog.jp 80
...

GET / HTTP/1.0

HTTP/1.1 404
Server: Microsoft-IIS/5.0
Date: Fri, 15 Feb 2008 14:24:02 GMT
Pragma: no-cache
P3P: CP="NOI DSP CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Pragma: no-cache
Connection: Keep-Alive
Content-Length: 4030
Content-Type: text/html;charset=utf-8
Expires: Fri, 15 Feb 2008 14:24:03 GMT
Cache-control: no-cache
...


919:デフォルトの名無しさん
08/02/15 23:27:16
> HTTP/1.1 403 Access Forbidden

http の勉強しろよ。

> Directory Listing Denied
> This Virtual Directory does not allow contents to be listed.

もしくは、英語の勉強な。

て言うか、telnet で試したら、

telnet ○○.exblog.jp 80
GET / HTTP/1.1
Host: ○○.exblog.jp


で、普通に取得できたぞ。(Host を指定しないと、400 Bad Request で、
丁寧に Host を指定しろよゴラァといってくれるし。)

920:デフォルトの名無しさん
08/02/15 23:35:34
>919
それはHTTP/1.1でリクエスト出してるくせに
必須の筈のHostヘッダを落としたからだ。

921:914
08/02/15 23:36:06
ありがとうございます。
でも、telnetって何ですか?
ググって見たらwindowsに標準のソフト事だとあったけど良く分からない。
もうちょっと、調べてきます。

922:デフォルトの名無しさん
08/02/15 23:44:09
。。。

923:デフォルトの名無しさん
08/02/16 00:17:33
>>921
URLリンク(www.nurs.or.jp)
URLリンク(tonetsutomu.com)
などを嫁


924:914
08/02/16 00:21:20
結局良く分からなかった。
telnetってソフトですよね?Tera Termって言うの落としてみたけど使い方が分からず。
それを使えば、エキサイトブログのデータ取得できるかもしれないけど、
取得したデータを解析する場合プログラムに埋めないと駄目ですよね?
その変が良く分からない・・・。

925:914
08/02/16 00:22:11
と、書いたらレス来てた。
ちょっと読んできます。

926:デフォルトの名無しさん
08/02/16 00:56:46
>>924
ネットワークプログラミングをする時、テキスト系のプロトコル
(http, smtp, pop)をテストするのに実験用汎用クライアントとして
telnetが使えるという事。 もちろん最終的にはプログラムに組み込まなければ
ならないが、>>914のような問題はまずtelnetでちょこちょこと検証が
出来るので便利。

927:914
08/02/16 02:04:05
なるほど、ありがとうございます。
自分はちと先を急ぎすぎたみたいですね・・・。
まず、telnetでの操作を覚えたいと思います。
ご迷惑お掛けしました。

928:デフォルトの名無しさん
08/02/18 16:02:50
はじめまして。質問をさせて下さい。
softbank出版の「WinSock2.0プログラミング」という本のP.45に
次のような記述があります。

・・・このポートという概念が在るおかげで、1つのマシンアドレスで
複数のソケットを使う事が可能となります。ソケットのフルアドレス
(sockaddr)は1つのIPアドレス、プロトコル、ポートから構成されます。
これらの3種類の情報が集まって、1つのソケットを一意に特定します。
同じマシン上にある2つのソケットを、同じプロトコルを使って
同じポートに関連付ける事は出来ません。それぞれが異なるプロトコルを
使うのであれば、同じポートに関連付ける事が出来ます。

そこで、お聞きしたいのですが、>>788以降の書き込みを見ると
この本の記述とは異なるようです。この本は間違っているのでしょうか?

929:デフォルトの名無しさん
08/02/18 16:29:24
>>788の話と何の関係もない気がするんだが

930:デフォルトの名無しさん
08/02/18 16:35:17
788の人はたぶん何か勘違いしてるだけなので気にしなくていいかと

931:デフォルトの名無しさん
08/02/18 16:50:19
>>928
>同じマシン上にある2つのソケットを、同じプロトコルを使って
>同じポートに関連付ける事は出来ません。

アドレスが異なれば、同じプロトコルの同じポートでも関連付けられる。
・・・そういう話じゃないか。

932:デフォルトの名無しさん
08/02/18 16:59:57
>>928
その本捨てた方が良いかも。
本当にその通りに書かれているなら書いてる奴自身がわかってないっぽい。

スティーブンス本で TCP/IP について勉強したら
後は以下のサイトを熟読すれば Winsock についてもほぼ困ることはない。

URLリンク(tangentsoft.net)
URLリンク(www.kt.rim.or.jp)


933:932
08/02/18 17:07:49
>>928
すまん、俺が勘違いしてた。
そこの「プロトコル」ってのはUDPとかTCPとかのレイヤの話か。

934:デフォルトの名無しさん
08/02/18 18:52:31
>>932 が一番わかっていなかった件

935:928
08/02/18 18:54:57
本は正しいのでしょうか?
私の解釈だと、この本の通りであれば、TCPで繋ぐ時
サーバーが同時に接続可能なクライアントの数が
ポートの数に縛られるような気がするのですが・・

936:デフォルトの名無しさん
08/02/18 18:56:42
http で あるサーバー 1 IP で ポートは 80 のみ
なぜ同時に沢山アクセス出来ているんだと思う?

937:デフォルトの名無しさん
08/02/18 18:59:08
>同じマシン上にある2つのソケットを、同じプロトコルを使って
>同じポートに関連付ける事は出来ません。

ここをちゃんと読めてない香具師は多い


938:デフォルトの名無しさん
08/02/18 19:01:44
「一つの(アドレス、プロトコル、ポートで一意)に複数のソケットを割り当てられない」
とは書いてあるが
「一つのソケットに複数のクライアントを繋げない」
とはどこにも書かれていない


939:デフォルトの名無しさん
08/02/18 19:12:45
イメージで、複数つながるときは複数Listenしてると思うんだろう。

940:デフォルトの名無しさん
08/02/18 20:38:33
>>935
ソケットは
・プロトコル
・自分のアドレス
・自分のポート
・相手のアドレス
・相手のポート
の組で区別されるので、自分側が同じアドレス・ポートでも相手側が異なれば異なる
サーバは1個のアドレス・ポートだけでいくつものクライアントを裁ける
ポート数には縛られない
・・・で合ってたっけ?ちょっと自信ない

941:デフォルトの名無しさん
08/02/18 20:38:44
便乗質問ですが
一つのソケットに繋げられるクライアント数の最大数は?
あるいは何によって制限されますか?
メモリ?OSが処理できるプロセス数?スレッド数?

942:デフォルトの名無しさん
08/02/18 20:41:29
>>935
つまり結局、
> サーバーが同時に接続可能なクライアントの数が
> ポートの数に縛られるような気がするのですが・・
その解釈でいいように思える。
unsigned short だから6万個くらいだっけ。
縛られるっつっても、現実問題としては充分だわな。

943:デフォルトの名無しさん
08/02/18 20:44:39
ダウト

944:デフォルトの名無しさん
08/02/18 20:49:01
>>941
openの方法にもよります
FAQにも書いてあるので見ておくとよいかと
また、ライセンスによっても制限があります
Win2000などは10までだったかな

945:デフォルトの名無しさん
08/02/18 20:53:08
>941
1つのソケットで繋げられるのは、1つのクライアントだけだろ?

946:デフォルトの名無しさん
08/02/18 22:01:33
>>944の訂正
2000Proはサーバ用途のソフトは不可
XPProが10
VistaはEURAみたことないので知らん


947:デフォルトの名無しさん
08/02/18 22:43:42
>>928
> ソケットのフルアドレス
> (sockaddr)は1つのIPアドレス、プロトコル、ポートから構成されます。
> これらの3種類の情報が集まって、1つのソケットを一意に特定します。

ここは間違いだね。
これじゃacceptの引数のソケットと、
帰り値のソケットの違いを説明できない。
TCPの接続は>>940の組で識別するということが理解できてないようだ。

ただこれはAPIの本であって、プロトコルの本ではないから、
プロトコルについてはカマーやスティーブンスの本を読んで、
APIの解説はこの本を参照すれば?
もちろんMSDNも。
MSDNはどこに自分の欲しい情報があるか分かりにくいから、
こういう本を一読しておくとWinsock2全体を概観できていいよ。
リファレンスじゃなくて、解説本だからね。


948:デフォルトの名無しさん
08/02/18 22:45:29
>>945
「繋げる」の意味によるなあ。
TCP or UDPとか、マルチキャストとか。

949:デフォルトの名無しさん
08/02/18 23:03:35
色々と理解不十分なのがゴチャゴチャかいてるので、元質問者が混乱しそう
なのでいっておく。

>>940>>947が正解。

950: ◆0uxK91AxII
08/02/18 23:10:43
>>941
Winsockの場合。
URLリンク(www.kt.rim.or.jp)

951:デフォルトの名無しさん
08/02/18 23:54:40
>>948
マルチキャストってソケット関係ないじゃん?

952:デフォルトの名無しさん
08/02/18 23:57:34
>>951
あるよ^^

953:デフォルトの名無しさん
08/02/19 00:36:59
>>952
あるね。ごめんよ^^

954:デフォルトの名無しさん
08/02/19 19:13:41
OSによるとは思うんですが、UnixドメインソケットとループバックIFでTCPではどっちが高速ですか?

955:デフォルトの名無しさん
08/02/19 20:55:10
ループバック

956:デフォルトの名無しさん
08/02/19 21:04:31
>>954
そんくらいはかってみれ

957:デフォルトの名無しさん
08/02/19 22:02:32
>>954
悩むなら両方に対応してオプションで選択できるようにするといいよ

958:デフォルトの名無しさん
08/02/19 22:16:23
「ウィンドウズだとプロセス作成が重い」という話をよく聞くのですが、
ウィンドウズでhttpサーバーを書く場合、どのような構成が適切だと思いますか?

1、1リクエスト=1プロセスを尊守する
2、いくつかのリクエスト(数十~数百)をまとめて一つのプロセスで処理する
3、プロセスは1つ。1リクエスト=1スレッドで行う
4、プロセスは1つ。いくつかのリクエストをまとめて1スレッドで行う
5、プロセスもスレッドも1つ。すべてのリクエストを非同期で処理する

959:デフォルトの名無しさん
08/02/19 22:18:26
>>958
6. apache を使う

960:デフォルトの名無しさん
08/02/19 22:23:30
>>958
組み込みなら5しか選択肢はない

961:デフォルトの名無しさん
08/02/19 22:25:05
>>958
プロセス生成が重いと考えているのに、どうして1と2が選択肢になるのか。



962:デフォルトの名無しさん
08/02/19 22:47:20
7. 複数のスレッドですべてのリクエストを非同期処理する

963:デフォルトの名無しさん
08/02/19 22:59:10
>>958
お前の書くサーバなら2で十分。

964:デフォルトの名無しさん
08/02/20 00:25:57
7、プロセスチーズは雪印

965:デフォルトの名無しさん
08/02/20 10:04:47
雪印はあの事件以降買ってないわ

966:デフォルトの名無しさん
08/02/20 11:54:21
そうだね、雪印はちょっと怖いよね。
だから最近できたメグミルクってとこの買ってるよ。


967:932
08/02/20 13:00:08
>>960
マルチスレッドカーネルくらい書けよ。

968:デフォルトの名無しさん
08/02/20 18:55:48
>>958
IOCP

969: ◆0uxK91AxII
08/02/20 19:38:43
一方、IIS6ではTDIを叩いた。

970:デフォルトの名無しさん
08/02/20 20:59:11
TDIってそのうち非推奨になるって書いてあるけど、次のIISはどうするの?

971:デフォルトの名無しさん
08/02/20 21:40:56
IISはOSと癒着だから。
ミニポートドライバを挟み込むくらいは遣りかねない(w

972:デフォルトの名無しさん
08/02/20 21:57:22
>>967
マルチスレッドカーネルつかってても、組み込みなら1スレッドで非同期で全部やる
常識でしょ

973:デフォルトの名無しさん
08/02/21 09:55:45
>>972
なぜ常識なのかわかんね。
結果として1プロ1スレでやらざるを得ないことは多いけど。

974:デフォルトの名無しさん
08/02/21 14:37:54
スレッド増えるとコンテキストの切り替えで遅くなるからじゃない?

975:デフォルトの名無しさん
08/02/21 16:04:31
タイマによる切り替えだけじゃなくて、デバイスI/O待ちとかで積極的にdispatchするようにしとけば問題ない事が多い。

976:デフォルトの名無しさん
08/02/21 21:44:32
1タスクのスタック領域4kとってるとして、100個接続裁いて100スレッドになると
400kのメモリが必要。そして、さばく接続数に比例して使用するメモリがどんどん
増える。非常に無駄。

977:デフォルトの名無しさん
08/02/21 21:46:53
コンテキストスイッチに時間がかかるのも効率が悪い。

まぁ最近の携帯電話とかだと、鬼のようなスペックつんでるので、携帯電話
メーカーが作るのならいいのかもだけど。「うちのミドルウェアには、HTTP
サーバもついてますよ!1接続、1スレッド必要ですが」とかいったら、
ゼッタイそのミドルウェアは採用されないな。

978:デフォルトの名無しさん
08/02/21 23:49:22
スレッドをプールしてもダメなん?

979:デフォルトの名無しさん
08/02/21 23:59:31
接続数が多くなる場合はIOCP使えってのは常道みたいだが。


980:デフォルトの名無しさん
08/02/22 01:36:54
Winsockの挙動について
connect()するときに、以下の条件

1.プロトコルはTCP
2.HostAddressにDNS名を指定
3.DNS応答に複数IPが含まれている(DNSラウンドロビン等)

において、DNS応答の1つ目のIPアドレスへの接続に失敗した場合、
接続再試行として、DNS応答の2つ目以降のIPアドレスへ接続を行ってくれる?

それとも、接続試行を行うのは一つ目のIPアドレスに対してのみ?

知ってたら教えておくれやす。

981:デフォルトの名無しさん
08/02/22 01:49:38
おまいの使ってるconnect()とやらのパラメータには、何を渡すようになっているか知ってるか?

982:デフォルトの名無しさん
08/02/22 02:58:25
がびーーーん!
参考にしたMSDNのページをよく確認したら、
MFCのCAyncSocket。

逝ってきまつ…

  ;y=ー( ゚д゚)・∵. ターン
  \/| y |)

983:デフォルトの名無しさん
08/02/22 09:46:26
>>979
銭形警部?

984:デフォルトの名無しさん
08/02/22 11:27:47
オレもその略号みるとそれ思い出すんだw
ICPOだけどな

985:デフォルトの名無しさん
08/02/22 14:28:45
>>983-984
お前らのせいで変な見方しか出来なくなったヽ(`Д´)ノ

986:デフォルトの名無しさん
08/02/22 16:44:23
linuxでIOCP無いと思った
windowsで実装されてるようなの。

987:デフォルトの名無しさん
08/02/22 16:56:41
IOCPは特許になっているので、
スケジューラ絡みの部分はLinuxに実装できないが、
aio_*を使えばほとんど同じことができる。

988:デフォルトの名無しさん
08/02/23 14:23:24
IOCPって特許になってたんだ。知らなかった。

989:デフォルトの名無しさん
08/02/25 22:21:24
組み込みのカスは死ねよ

990:デフォルトの名無しさん
08/02/26 11:35:46
日本のソフト産業でシェアあるのってほとんど組み込み系じゃねえか

991:デフォルトの名無しさん
08/02/26 12:33:31
>>989
すべてお膳立てされたPCでのプログラミングしかできないカスは死ねよ。

992: ◆0uxK91AxII
08/02/26 12:42:17
組込みと聞いて見てみたら、窓CEとかJavaなんてのは、よくある話。

993:デフォルトの名無しさん
08/02/26 19:07:56
組み込みと聞いて行ってみたら…
ハードの事は何も分からないで仕切ってる奴がいて
1 octet を CHAR と書けとか
2 octet を WORD と書けとか
4 octet を LWORD と書けとか
...
言われるのもよくある話.


994:デフォルトの名無しさん
08/02/26 22:08:18
別に違和感ないけど。

むしろ、UCHAR, UWORD, ULWORD とかはいらんのか? と思ってしまう。

995:デフォルトの名無しさん
08/02/26 22:59:09
そういえば、これは本当に偶然だったんだけど
azn っていう略称の動作があって、せっかくなので使用可否のフラグを
char aznable;
って書いたら上司に見つかって、2人でウヘラウヘラ笑いあった。

996:デフォルトの名無しさん
08/02/26 23:26:01
>>995
俺もウヘラウヘラした

997:デフォルトの名無しさん
08/02/27 14:59:11
TCPでサイズが8kbくらいのデータを送ろうとするとへにゃるんですが、
TCP送信できるデータには最大サイズみたいなのはありますか?
それとも、何か別の原因が考えられますか?

998:デフォルトの名無しさん
08/02/27 15:06:56
へにゃるって何だよ
具体的に何が起こったのか書け
1回のrecvで受け切れなかったとか、そういうことか?

999:デフォルトの名無しさん
08/02/27 15:11:08
どっちにしろ下の層で細かく分割されるんだ。
TCPやソケットはそういうのを考えなくていいように作られてるんだ。

1000:デフォルトの名無しさん
08/02/27 16:09:40
へにゃりつつウヘラウヘラすればいいさ

1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


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