ネットワークプログラミング相談室 Port16
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/12/31(土) 14:07:24Programming 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/
0313デフォルトの名無しさん
2006/02/06(月) 14:35:40> そうなると再送要求のパケットが飛ぶはずですよね?
うーん・・・どうだったかなぁ
なんだか再送信要求のパケットなんて飛ばなかったと思うんだが・・・
0314310
2006/02/06(月) 15:08:13現象が起きたのはLinuxの送信ポートのキャプチャを見てたのですが、
Windowsの受信ポートのキャプチャを見たら、正しいパケットでした。
Linuxの方のetherealのバグかは謎ですが、パケットを拾ってる
タイミングに問題ありなのかな?と思ってます。ちと実験で、
Windowsで送信する際にDSCP値書き換えた場合の送信ポートの
パケットとLinuxで受信したパケットを拾ってちと検証してみます。
再送要求のパケットなんてありませんでしたね(^^;失礼しました。
何分勉強途中なもので。
ありがとうございましたm(__)m
0315デフォルトの名無しさん
2006/02/06(月) 17:35:12パケットをかすめ取っていると、CRCは当然合いません。
0316デフォルトの名無しさん
2006/02/06(月) 18:42:58> なるほど。
あの例えでわかったんかよ(ワラ
>>308
listenじゃなくて次のacceptだろ?
0317310
2006/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> TCP/IPの受信バッファのサイズはRWIN値で設定されているのは
> わかりますが、このサイズを超えたデータを受信した場合は、
> 超えた部分は破棄されると考えて問題ないでしょうか
破棄される
その代わり相手が再送信する
あまりにも送信できないとタイムアウトで切断される
じゃなかったっけ?
0319デフォルトの名無しさん
2006/02/09(木) 19:56:49その後はACKが来るのを待つ。
それが伝送制御ってもんだ。
だからRWINが大きいほうがスループットが上がるんだよ。
0320デフォルトの名無しさん
2006/02/09(木) 21:31:32参考になるようなページを教えて下さい。
0321デフォルトの名無しさん
2006/02/09(木) 23:06:42Checksum Offload 機能でググれ
ただ、いつも>>315の通りなわけじゃない。(断言しているが)
0322デフォルトの名無しさん
2006/02/09(木) 23:09:36またか>>268
0323310
2006/02/10(金) 12:47:44精進しますm(__)m
0324デフォルトの名無しさん
2006/02/10(金) 18:38:01で質問させていただいているものなのですが
ネットワーク関係はこちらのほうがよさそうなので
もし、よろしければ上記のアドレスの疑問なのですが教えていただけないでしょうか。
いろいろ試したところクライアント側の送信がゲームの毎フレームごとに
送信されておらず一定時間ごとに送信されてしまっているため
サーバー側で座標をクライアント側から毎フレームごと得られずカクカクしてしまっているようなのです。
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でも、とりあえずどんな時間間隔でどれくらいのデータが送受信できてるのか確かめないとね
0326デフォルトの名無しさん
2006/02/10(金) 18:47:49C#はよく知らないが、世間で言うところの TCP_NODELAY オプションを
使うといいのではないかな。
0327411
2006/02/10(金) 21:13:29nagleアルゴリズム調べさせていただきTCP_NODELAYに関してもわかりましたが
オプションらしきものがMSのドキュメントを見てもわからないため
UDPでの通信をしてみようと思っています。
>>247
でマウスの位置を送るようなことが書いてあり
リアルタイムデータ送信ならUDPのほうがよいみたいですので。
また、何かありましたらよろしくお願いします
0328デフォルトの名無しさん
2006/02/10(金) 21:16:50setsockopt()とか無いの?
//儚いUDPを使う>>327の強気の態度に惚れるかもしれん
0329324
2006/02/10(金) 22:12:13TCP使用時とほぼ同じ動きを行います。
ゲームの1フレームごとに通信が確立していない可能性が高そうなので
マルチスレッドの部分も含めて非同期通信部分を見直します。
0330411
2006/02/10(金) 22:17:41try catch構文で通信のエラーを破棄する処理を入れれば問題なく動く場合でも
try catch構文をはずすだけでエラーをはいて強制終了する場合がある。
スレッドを用いた場合は明らかに通信の回数が減っている
ただし、スレッドを用いない場合は通信受付待機の時間が
ゲーム画面の1フレームの更新時間にかなりの影響を及ぼし
ゲームにならなくなってしまう。
0331デフォルトの名無しさん
2006/02/10(金) 22:28:580332デフォルトの名無しさん
2006/02/10(金) 22:31:12逆に質問
同期UDPって何だ・・・
0333324
2006/02/10(金) 22:34:50ありがとうございます。
なにぶん未熟なものでして、TCPで使っていた
マルチスレッドを利用したUDPの非同期?通信は試してみたのですが
TCPのときとさほどかわりませんでした。
今行っているゲームの通信部分は3Dモデルの主人公の動きを相手側でも
同じように再現するために座標を送っています。
0334デフォルトの名無しさん
2006/02/10(金) 22:37:02UDP結構使える?
うちのLANだと1〜2%ロスだったけど、WANに出ると正直どうなるかわからんのだ・・
0335デフォルトの名無しさん
2006/02/10(金) 22:39:04tcp_client_instance.NoDelay = true;
0336324
2006/02/10(金) 23:05:04client = new TcpClient("192.168.0.1", port);
client.NoDelay = true;
と定義できました。
しかし、動作は変わりませんでした。やはり非同期通信がうまくいっていないようです。
>>334
自分もLAN環境での実験ですが
やはりロスは出ているようです
0337デフォルトの名無しさん
2006/02/11(土) 00:16:590338デフォルトの名無しさん
2006/02/11(土) 00:59:44あれか?
プログラムレベルで同期処理するのを同期通信って言うのか?
ならノンブロッキングソケット使ってるってことか?
0339デフォルトの名無しさん
2006/02/11(土) 01:06:430340デフォルトの名無しさん
2006/02/11(土) 05:09:34一つのサーバーにhttpリクエストを生み出すことのできるフリーウェアってありますか?
0341デフォルトの名無しさん
2006/02/11(土) 06:10:44wget
0342340
2006/02/11(土) 09:31:210343324
2006/02/11(土) 14:35:11それが原因で接続したり切断されたりしていたようです。
無事3Dゲームのネットワーク化に成功しました。
いろいろありがとうございました。
0344デフォルトの名無しさん
2006/02/12(日) 17:59:08------------------------------
#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そこを20とかに増やしてみては
0347デフォルトの名無しさん
2006/02/12(日) 20:07:45>>346
レスありがとうございます。
いやIPアドレス4バイトなのでcharで4バイト確保しました。
とりあえずchar str[20]位で領域増やしてみます。
0348デフォルトの名無しさん
2006/02/12(日) 22:08:57> いやIPアドレス4バイトなのでcharで4バイト確保しました。
あのな、sizeof("xxx.xxx.xxx.xxx")っていくつか考えてみよう。
0349デフォルトの名無しさん
2006/02/12(日) 22:33:50そうでした、すっかり勘違いしてた。また>>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誰かの自宅サーバっぽいIPアドレスのSMTPサーバに接続しようとしている
ログが多数、残っていました。結局、コネクションは成立していません。
ウイルス、Spyware系のチェックはしたのですが、検出されず。
メールを送ろうとしているプロセスを突き止めるには、どうすればよいでしょうか?
Win2000,VS2004(C++)です。
0351デフォルトの名無しさん
2006/02/13(月) 21:12:43実際どのくらいの頻度でひっくり返る?
0352デフォルトの名無しさん
2006/02/13(月) 21:18:31VC 使えるんなら、netstat -o をズート実行してsmtp へコネクションを
張ったプロセスを見つけたら PID からプロセスの情報を得てログする、
というプログラムを書いて一晩くらい走らせてみては?
0353350
2006/02/13(月) 21:39:21ヤツってメール送る?
0354デフォルトの名無しさん
2006/02/13(月) 21:46:30ポート開けないヤツが使ってると思われ。
0355350
2006/02/13(月) 21:56:13その場合は、どうすればプロセスを特定できるんだろう?
とりあえずVMWare起動したww
0356デフォルトの名無しさん
2006/02/13(月) 22:07:050357350
2006/02/13(月) 22:54:20思い過ごし?
それとミスったけど、ポートはPOP(110)でした。
0358デフォルトの名無しさん
2006/02/13(月) 23:16:46インターバルタイマーが必要で SIGALRM を使用してるんですが、
同じプロセスで 受信処理のために NONBLOCK の select() を使用すると、
タイムアウト設定してコールしてもselect()のタイマーが正常に働きません。
どうすればいいんでしょうか?
できれば子プロセスで処理を分けずに。
またselect() のイベントでイベントハンドラーを起動するような作り方は通常
するんですか?
0359デフォルトの名無しさん
2006/02/13(月) 23:17:35セキュリティ板いけよ。
0360デフォルトの名無しさん
2006/02/13(月) 23:18:34> インターバルタイマーが必要で SIGALRM を使用してるんですが、
そこもselect()使えば?
0361デフォルトの名無しさん
2006/02/13(月) 23:20:41もちろん状況次第だが、関西地方のフレッツ ADSL で、
結構ひっくり返ったことがある。
# ソフトがバグってて、パケット逆転したら受信してい
# た画像がブロックノイズだらけになって、ばれた。
0362358
2006/02/13(月) 23:23:160363デフォルトの名無しさん
2006/02/14(火) 02:45:55中断させたいときは、別のスレッドなどから
shutdown、closesocket、などを呼んで中断させる方法しか思い浮かばないのですが、
もっとスマートな方法はありませんか?
0364デフォルトの名無しさん
2006/02/14(火) 03:11:50同様に、WindowsならEventSelectでEventを待つよ。
IOCPのサンプルなんかで、このやり方を使ってる。
0365デフォルトの名無しさん
2006/02/14(火) 03:23:16なるほど結構ひっくり返るもんなんだな
0366デフォルトの名無しさん
2006/02/14(火) 08:38:34UNIXならsignal受けてEINTRのexeptionで復帰させるとか、
selecltじゃなくてpoll使ってurgent data受けるとか。
selectとurgent dataもOKなのかもしれないけれど、
undocumentedなので使ったことなし。
0367デフォルトの名無しさん
2006/02/14(火) 13:03:28>>366
返信ありがとうございます。
一緒にパイプを持って、それで抜けるようにします。
0368デフォルトの名無しさん
2006/02/14(火) 16:29:49経験上、帯域上限辺りまで使うと結構ひっくり返る希ガス
0369デフォルトの名無しさん
2006/02/14(火) 20:03:38SIO_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;
}
0370319
2006/02/16(木) 19:56:51> (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するまでの準備の部分に何か誤りがあるのでしょうか?
0371369
2006/02/16(木) 19:58:410372デフォルトの名無しさん
2006/02/16(木) 22:27:260373デフォルトの名無しさん
2006/02/18(土) 01:05:12オープンしたソケットで利用中のNICのMACアドレスを得る方法を
教えていただけますでしょうか?
接続元、接続先のMACアドレスどちらでもかまいません。
OSはWindows XPです。
0374デフォルトの名無しさん
2006/02/18(土) 01:10:16で、IPX_ADDRESS_DATA::nodenumかな。
もちろん、IPXソケット限定だけど。
0375373
2006/02/18(土) 18:57:240376デフォルトの名無しさん
2006/02/19(日) 12:29:090377デフォルトの名無しさん
2006/02/21(火) 21:47:270378^ω^ ◆8vOv.D2p4.
2006/02/22(水) 18:47:13自分で立てる→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:570380デフォルトの名無しさん
2006/02/22(水) 22:18:47作っているのですが、切断時に
Socket.Close()
を行うと下記の例外が発生するのですが、
どうすれば回避できるでしょうか?
----------------
破棄されたオブジェクトにアクセスできません。
オブジェクト名 'System.Net.Sockets.Socket' です。
0381デフォルトの名無しさん
2006/02/22(水) 23:03:51ソケットのファイルディスクリプタ(int)から通信が行われている自分側のポート番号取得することは可能?
accept したあとの子プロセスから呼び出される関数で、ファイルディスクリプタはもらうんだけど
struct sock_addr_in の構造体はスコープ外で直接アクセスできない、という条件です。
0382デフォルトの名無しさん
2006/02/22(水) 23:07:570383デフォルトの名無しさん
2006/02/22(水) 23:26:33�d!
0384デフォルトの名無しさん
2006/02/22(水) 23:33:12このスレはアンチM$の粘着UNIXオタが常駐してるだけだから
winsockのまともな返答は期待できないと思った方が良い
そうだよな
おまえら
0385デフォルトの名無しさん
2006/02/22(水) 23:35:40このスレは「UNIXネットワークプログラミング相談室」と改名するか
UNIX板に移動した方がいいんじゃないかって
UNIX厨は隔離板から出てくるなよ
0386デフォルトの名無しさん
2006/02/22(水) 23:40:35みたいなのはおれも感じてたが。
そうか。
0387デフォルトの名無しさん
2006/02/22(水) 23:44:31俺としては「WinSockプログラミング相談室」の方がいいかなあ。
UNIX厨が出てこられるとマジうざいんで。
0388382
2006/02/22(水) 23:51:46中身のないレスをするアンチUNIX厨は鬱陶しい。
0389デフォルトの名無しさん
2006/02/23(木) 00:09:20( ゚д゚) UNIX厨言われちゃってるよ…
_(__つ/ ̄ ̄ ̄/_
\/ /
 ̄ ̄ ̄
( ゚д゚ )
_(__つ/ ̄ ̄ ̄/_
\/ /
 ̄ ̄ ̄
( ゚д゚)
_(__つ/ ̄ ̄ ̄/_
\/ /
 ̄ ̄ ̄
( ゚д゚ )
_(__つ/ ̄ ̄ ̄/_
\/ /
 ̄ ̄ ̄
0390デフォルトの名無しさん
2006/02/23(木) 00:49:27C:\WINDOWS\system32\drivers\etcにある
hostsファイルに記述したホスト名から
IPアドレスを取得したいのですが、取得できません。
どうしてでしょうか?
例えばhostsファイルに
38.25.63.10 x.acme.com
のようにかいてgethostbynameでx.acme.comを指定してやれば
38.25.63.10が取得できると思っているのですが・・・
0391デフォルトの名無しさん
2006/02/23(木) 01:01:36コードさらさないでどうやってこたえろと
0392デフォルトの名無しさん
2006/02/23(木) 01:44:46とか数年前の記憶を元にほざいてみる。
0394382
2006/02/23(木) 01:48:21ファイル名?
HOSTSで合ってるよ。
http://book.itzero.com/read/others/0505/Oreilly.Ipv6.Network.Administration.Mar.2005.eBook-LiB_html/0596009348/ipv6na-CHP-5-SECT-3.html
0395デフォルトの名無しさん
2006/02/23(木) 10:58:07たぶんそのソケットが既にCloseされてるから。
Connectedプロパティを確認してみてください。
なぜCloseされているのかはプログラムの作者以外誰にもわからない。
0396デフォルトの名無しさん
2006/02/23(木) 20:38:55簡単なネットワーク対戦可能なインベーダーを作成中なのですが、
一般的に皆様がこのようなゲームを作成する場合、常に移動すべく玉の
座標情報送信処理は、どのような感じ・どのぐらいの間隔で行ってるのでしょうか?
(20msに一回、UDPにて更新処理を行おうかと思っていますが…)
0397デフォルトの名無しさん
2006/02/23(木) 23:25:26動いたら送信
動かなかったら送信しない
このとき送るのは可能な限り
差分ではなく適当な絶対値
0398デフォルトの名無しさん
2006/02/23(木) 23:59:33動きが計算できるタマだったらいちいち送る必要はないんじゃないか?
プレイヤーの座標を最優先する。
0399396
2006/02/24(金) 01:40:24動きに関しては誘導弾など可変の性質を持つものがあるので計算はできないです。
普段の座標情報(弾道)送信処理は
弾座標送信←20ms→弾座標送信←20ms→弾座標送信←20ms→弾座標送信…
のようになっていて、
キー入力によるプレイヤー座標の送信処理が発生した場合に
弾座標送信←x→人座標送信←20ms-x→弾座標送信←20ms→弾座標送信…
└ ←20ms→ ┘
のような作りになっています。用はプレイヤー移動による座標送信処理は
定期的に20msごとに行われるサイクルの、その20msの中のどこかに割り込みが
入るみたいな感じで作ってあります。
二番目の質問である>どのくらいの間隔で行っているのでしょうか
というのは質問の仕方が悪かったです。
上記の仕組みで、間隔の20msは値として小さすぎるなどの問題はないでしょうか?
0400デフォルトの名無しさん
2006/02/24(金) 01:42:12遅延問題も兼ねるので、そのあたりはまるっきりあなたのセンスかと
0401デフォルトの名無しさん
2006/02/24(金) 01:57:29そのへんの見極めが出来てないようでは
0402396
2006/02/24(金) 02:09:07云々以前の問題ですね・・やはり最適な値というか、問題なさそーな
値を自分で見つけるしかないということですかね。
ロックオンとか無しでの手動誘導です。プログラミング自体慣れていないので
アルゴリズム的なセンスがないのは痛感してます…
色々と参考になりました。ありがとうございます。
0403390
2006/02/24(金) 07:44:44hostsファイルに記述してgethostbynameを呼ぶと復帰値NULLで
取得できませんでした。
lmhostsファイルに記述してgethostbynameを呼ぶと復帰値からIPアドレスを
取得できました。
どうしてhostsファイルを見にいってくれないんだろう?
0404デフォルトの名無しさん
2006/02/24(金) 07:49:440405デフォルトの名無しさん
2006/02/24(金) 17:50:41lngReturn = NetMessageBufferSend(NULL,address,fromname,
(BYTE *)msg,sizeof(WCHAR) * lstrlenW(msg));
Win2kではfromnameが反映され正常に送信できますが
WinXPSP2ではlngReturnに0xE1が戻ってきます。
fromnameをNULLにすれば正常送信できますが、勝手にマシン名が入ってしまいます。
何故?
XPでもfromnameを反映できる方法がありますか
0406597
2006/02/25(土) 09:17:04TCPの最初と最後の3wayとかの部分も自分で書くんですよね?
で、送るのはsendtoで良いと思うのですが、受け取るのはrecvfromですか?
つまり、生ソケットでTCP/IPを使う場合、UDP用のAPIを使うの?
0407デフォルトの名無しさん
2006/02/25(土) 09:27:55だから普通send, recv。
>>6に実装リストあるよ。
0408デフォルトの名無しさん
2006/02/26(日) 00:20:38> hosts ファイルに記述して gethostbyname
> を呼ぶと復帰値 NULL で取得できませんでした。
ちゃんとマニュアル読めよ。
Return Values
If no error occurs, gethostbyname returns a pointer
to the hostent structure described above. Otherwise,
it returns a null pointer and a specific error number
can be retrieved by calling WSAGetLastError.
host ファイルを見に行く以前の問題だよ。
0409デフォルトの名無しさん
2006/02/27(月) 04:10:48SOCKET client_sock = accept(...);
HANDLE event = CreateEvent(...); // マニュアルリセットはfalse
...
WSAEventSelect( client_sock, event, FD_READ | FD_CLOSE );
...
while(1)
{
result = WaitForMultipleObjects( event_size, event_array, false, INFINITE );
switch( result )
{
....
}
}
サーバーサイドはこのような感じなのです。
クライアントサイドで、
send( ... ); //1回目
send( ... ); //2回目
などとやると、1回目は、WaitForMultipleObjectsから戻り、正常に受信するのですが、
二回目以降がWaitForMultipleObjectsから戻ってきません。
1回目と2回目の間にSleep(10)などを入れると、二回目も正常に受信するのですが、
これはどういうことなのでしょうか?
0410デフォルトの名無しさん
2006/02/27(月) 05:40:421回目の処理が終わる前に受信しちゃうんでない?
0411デフォルトの名無しさん
2006/02/27(月) 07:14:110412デフォルトの名無しさん
2006/02/27(月) 08:53:05何で擬似パケットを用意するのですか?
■ このスレッドは過去ログ倉庫に格納されています