0

私は WinCE7 用のプログラムを作成しており、プログラムが TCP 通信に使用する静的ライブラリ クラスをセットアップしようとしています。したがって、メンバー変数の順序が異なると、プログラムがさまざまな方法で停止しました。コードの一部:

ヘッダ:

FxTcp.h

#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>

class FxServer {

    // Variables

    SOCKET s ;

    int bytesExpected ;
    int bytesToReceive ;
    int cbXfer ;
    int cbTotalRcvd ;
    int cbRemoteAddrSize ;
    fd_set fdReadSet ;

    LPWSTR lastError ;

    SOCKADDR_STORAGE ssRemoteAddr ;

public:

    // Constructors

    FxServer() ;
    FxServer( char * serverAddr ) ;
    FxServer( char * serverAddr , char * serverPort ) ;

    // Methods

    int connect() ;

    int deviceRead( char devType , bool multiDev , char * pBuf , UINT32 first , UINT16 numDev = 1 ) ;

    void release() ;

} ;

ソース:

#include "StdAfx.h"
#include "MelsecFxTcp.h"

int FxServer::deviceRead( char devType , bool multiDev , char * pBuf , UINT32 first , UINT16 numDev ) {

    int cbXfer = 0 ;

    // PARSE INPUTS...

    // COMPOSE AND SEND MESSAGE...

    // RECEIVE AND PARSE RESPONSE

    FD_ZERO( &fdReadSet ) ;
    FD_SET( s , &fdReadSet ) ;

    cbRemoteAddrSize = sizeof( ssRemoteAddr ) ;

    // Receive the first 2 bytes...

    cbTotalRcvd = 0 ;
    bytesToReceive = 2 ;
    do {
        cbXfer = recvfrom( s , pBuf + cbTotalRcvd , sizeof(char)*2 , 0 , (SOCKADDR*)&ssRemoteAddr , &cbRemoteAddrSize ) ;
        cbTotalRcvd += cbXfer ;
    } while ( cbXfer > 0 && cbTotalRcvd < bytesToReceive ) ;

この場合、プログラムは正確に recvfrom 関数の呼び出しでフリーズします。しかし、次のように、ヘッダーの最後の 2 つのメンバー変数の順序を入れ替えると:

    SOCKADDR_STORAGE ssRemoteAddr ;

    LPWSTR lastError ;

その後、プログラムはバイトを受信し続けますが、次の例のように、数行後のメソッドの実行中に文字列を使用しようとすると、再びフリーズします。

StringCchPrintf( lastError , sizeof(char)*256 , TEXT("Message for the user") ) ;

通信コードがメイン プログラムにあるテストでは、すべてが完全に正常に動作していました (LPWSTR 文字列は使用しませんでした)。

私が見逃しているのはばかげた些細な概念だと確信していますが、これを解決することはできません。

助けてくれる人に感謝します。

4

0 に答える 0