私は 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 文字列は使用しませんでした)。
私が見逃しているのはばかげた些細な概念だと確信していますが、これを解決することはできません。
助けてくれる人に感謝します。