プロが教えるわが家の防犯対策術!

すみません。よくわからなくなったので教えてください。

非同期処理を行いwindowprocで送信、受信の処理をしているのですが、一部わかりません。

[内容]
クライアントからデータを送信してもらい、サーバ側で受信をして、サーバ側で受信後、クライアントへ送信をしたいのですが....


[サーバ側ソース抜粋]
::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
int EventErrorCoode;
int len;

switch(message)
{
case FM_TCPPROC:
EventErrorCoode = WSAGETSELECTERROR(lParam);
switch(WSAGETSELECTEVENT(lParam)){
case FD_CONNECT:
//コネクトされたときの処理
break;

case FD_ACCEPT:
if(EventErrorCoode != 0){
NetWork_LogOut();
break;
}
// 状態判定処理
if(NetWork_Accept() == FALSE){
   //失敗したときの処理
}
break;

case FD_READ:
// データの受信メッセージ
if(NetWork_Recv() == FALSE){
 
}
break;

 case FD_WRITE:
//テスト折り返し送信
 SendData = "折り返し";
 strcpy(Recv_Buffer,SendData);
 len = send(server_s, Recv_Buffer, strlen(Recv_Buffer),0);
break;

   :
   :

return CDialog::WindowProc(message, wParam, lParam);
}

::NetWork_Recv()
{

int nResult;
int len;

nResult = recv(client_s, (CHAR *)Recv_Buffer, RECV_SIZE - 1, 0);
Recv_Buffer[nResult] = '\0';

return TRUE;
}

*非同期処理はsocket作成後しています。
クライアントから送信されたデータが、FD_READで認識し、NetWork_Recv()関数を使って受信します。
その後、空になった時点で、FD_WRITEを実行すると思っていたのですが、recvされた後、データは空にならないのでしょうか?

A 回答 (1件)

あーあ、WindowProcオーバーライドしちゃってるんだってのはおいといて(^^;;




>クライアントから送信されたデータが、FD_READで認識し、NetWork_Recv()関数を使って受信します。
>その後、空になった時点で、FD_WRITEを実行すると思っていたのですが、recvされた後、データは空にならないのでしょうか?

FD_WRITEは、「ソケットの送信バッファに空きができたことを通知」なんだから、受信の終了とは関係ないような。
クライアントへデータを投げつけ終わった(残りを投げることができる)タイミングを知るためのものだと思うんですが。

FD_CONNECTの直後、FD_READの前にFD_WRITE来てませんか?
    • good
    • 0
この回答へのお礼

いつもありがとうございます。

>あーあ、WindowProcオーバーライドしちゃってるんだってのはおいといて(^^;;
MFCの使い方よく知らなくて、すみません。(^^;
いろいろ事情があり、急遽VC++での開発になったので....
教えて頂いているのに、本当に申し訳ありません。

いろいろ調べてみたら、sendの使いかたが間違っていました。すみませんでした。

気が焦っていたみたいで、見落としがありました。

お礼日時:2005/05/27 10:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!