2012-11-29 64 views
0

我试图使用write()命令写入套接字。我需要写入的数据是结构类型,它包含charint数据类型值。但是,当我将数据写入服务器套接字时,int变量的值被损坏。我总是收到价值为16777216读取()和写入()到套接字返回损坏值

我从Solaris机器写入Linux机器。 Solaris是一个32位机器,Linux是一个64位机器。这对我的问题有什么影响吗?

我使用htonl/ntohl,反之亦然,用于将int埃格尔值从服务器传递给服务器。但是如果我将整个结构类型写入套接字,我该如何使用它?任何人都可以帮我解决这个问题吗?

PCHAR data = NULL; 
int size = sizeof(WSMsg); 
int retry = 10; 
data = new char [sizeof(WSMsg)]; 
memcpy(data, msg, sizeof(WSMsg)); 
int n = write(fd, &data[0], size); 

这是我的代码部分。这里WSMsg是结构类型,并有intchar类型的值。

我正在从数据库表中写入一个包含数字char类型值的特定行。我正在写这样的不同行的不同表格。所以如果我需要使用htonl/ntohl那么我需要将所有这些数字转换为网络字节。由于我有20个或更多的表格及其具有整数类型值的结构,因此对于我来说,将所有这些数据转换并发送都是一项耗时的工作。

+3

为什么不直接用结构调用'write'?即'write(fd,msg,sizeof(WSMsg))' –

+0

我可以这样做,但是当我在另一端收到数据时,我的整数值会被损坏。如果我将数据从Solaris传输到Solaris或从Linux传输到Linux,那么一切正常。当我从Solaris写入Linux时,问题就出现了,反之亦然。 –

+0

“Solaris”通常意味着“SPARC”是大端,而“Linux”通常意味着“x86或ARM”。因此写一个完整的结构导致腐败并不令人惊讶。 – Damon

回答

2

看来你有字节顺序的问题。有几种不同的方法可以解决这个问题:一种方法是查看serialization,即将发送的结构转换为独立于字节顺序问题的格式;另一个解决方案是创建您的结构的副本,并使用例如htons/htonl需要的地方:

WSMsg temp = *msg; 
temp.someShortField = htons(temp.someShortField); 
// etc. 

然后当然做在接收侧相反。