C ++: порядок переменных членов с сокетами в WinCE7

Я пишу программу для 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).

Я уверен, что это глупая тривиальная концепция, которую мне не хватает, но я не могу решить эту проблему.

Моя благодарность всем, кто мог бы помочь.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]