2013-05-09 95 views
-3

我正在使用TCP套接字。我正在使用写入功能将数据发送到打开的套接字。C write()函数发送2个字节的十六进制

write(Socket_Fd,“test”,4);

这是有效的。但是当我这样做时。

#include <stdio.h> 
#include <stdlib.h> 

typedef unsigned char BYTE; 

typedef struct LANC 
{ 
BYTE START; 
BYTE END; 

} LCODE; 


int main(int argc, char *argv[]){ 

LCODE COMMAND; 
COMMAND.START = 0x28; 
COMMAND.END = 0x06; 

short value = (COMMAND.START << 8) | COMMAND.END; 

write(socket_FD, value, sizeof(value); 

return 0; 
} 

当我检查值的大小我得到2个字节这是正确的,因为我结合了0x28和0x06。所以做一个printf。

printf("%x\n", value); 

output is: 2806 which is correct. 

printf("%d\n", sizeof(value); 

output is: 2 bytes which is correct. 

我在尝试使用write将十六进制写入打开的套接字时出现错误。我究竟做错了什么?

+1

你对你的问题的描述是不明确的。在你的示例代码中,'socket_FD'不是有效的套接字句柄,所以我认为这不是你真正的代码。你可以更新你的问题,以显示真实的代码吗?更好的描述“我得到一个错误”也会有帮助。 – simonc 2013-05-09 12:29:00

+2

'我正在尝试使用写入将十六进制写入打开的套接字时出现错误。我做错了什么?'你*不*显示失败的代码;只有有效的代码。 – wildplasser 2013-05-09 12:29:04

+0

@simonc,是的,这不是真正的代码,我只是做了它,但它是我得到错误的完整代码的一部分,我现在没有完整的代码,因为我在家里,代码是在办公室。我得到的错误是写功能。例如传递一个int类型的值来写入函数。 – demic0de 2013-05-09 12:33:45

回答

3

你在一行中提交了两个令人厌恶的错误(它是如何编译的?)。你传递一个整数(值)到write()它期望一个指针(不会编译,你试图欺骗我们关于你的代码)。其次,你正在做一些与endian有关的事情,也就是说,在不同的处理器上,你会得到不同的结果,这取决于“value”的高位字节在内存中是第一位还是第二位。

解决方案:

unsigned char value[2] = {COMMAND.START, COMMAND.END}; 

write(socket_FD, value, sizeof(value)); 
+2

另外,请检查'write()'的返回值。 – 2013-05-09 12:36:38

+0

对不起,这只是我从头开始创建的一个虚拟示例代码,而不是真正的代码。而且是的,我忘了提到它不会编译,因为我得到写函数的错误。 – demic0de 2013-05-09 12:39:48

+0

所以你在家里的实际代码甚至没有编译?在提出任何问题之前解决该问题请尽快阅读[常问问题](http://stackoverflow.com/faq),并始终制作一份SSCCE([简短,独立,正确的示例](http://sscce.org/)),因为这有助于人们帮你。 – 2013-05-09 12:42:05