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