首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

SOCKET接收XML数据出现丢掉,

2012-12-16 
SOCKET接收XML数据出现丢失,急本帖最后由 lordman1982 于 2012-06-12 10:17:11 编辑我用vc++6.0 用socket

SOCKET接收XML数据出现丢失,急
本帖最后由 lordman1982 于 2012-06-12 10:17:11 编辑 我用vc++6.0 用socket编程 采用TCP/IP协议收发某个设备发送的XML数据。
(1)多数时候能接收到一个完整的XML,但有时候又只 接收到一个XML文件的一半,另一半会出现在下次发送的数据中。
(2)设备发送的时候在特定条件下会把2个或3个XML文件一次发送上来,这样是否合理?我不知该怎么判断一个XML文件的结束位置。
(3)有时候发送上来的数据会丢失一些字符。例如
<?xml version="1.0" encoding="UTF-8"?>..........
我接收到的可能只是:
ding="UTF-8"?>..........
前面的就没有了,丢失了。
还有的时候接收到的是:
<?xml ve j y...n="1.0" encoding="UTF-8"?>
就是说,中间会出现一些乱码。

上面三个问题我不知道是不是由于使用SOCKET的recv函数不当造成的?我的调用方法是在while(1)循环里面:
int RecvByte=recv(clientSocket,receiveBuf,2000,0);
sleep(2000);
receiveBuf 的容量肯定是足够的,发上来的XML最多300字节。

请各位高手帮帮忙,小弟先谢谢啦。

补充说明:设备发送的数据格式是固定的,就是一个接一个的XML文件,没有其他信息,特定条件下会一次发送几个XML.所以我只能从软件方面考虑如何解决。
[最优解释]
使用分包机制啊,不然的话你用TCP就是会出现沾包现象的。这需要发送方支持。如果发送方不管这些那你就得自己想办法通过XML判断结束位置了,这可不太好搞。
[其他解释]
你用的阻塞的IO还是其他的模型,贴一下recv那完整的代码吧,为什么要Sleep呢?
[其他解释]
字符编码等问题,XML编码跟发送接收的字符处理有问题
[其他解释]
不知道你用的是哪个xml解释器,我说下我用tinyxml。

最简单的协议 数据长度 +xml。

发送的时候,获取xml长度 然后前几个字节放长度,

接收端,先获取长度头,然后recv 是否完整,如果不完整继续接受。

如果要发多个xml,也就是处理字符串的事
[其他解释]
多recv几次就完整了
[其他解释]
问题补充:我是用tinyxml解析数据的,但接收到的数据经常出现乱码,或丢失字符,就像我提问中提到的,此时tinyxml解析的时候就会报错。请问出现乱码或丢失字符的原因是什么?如何避免?
[其他解释]
应该是你接受的的问题。你穿的文件? 还是buffer?直接传buffer啊,我这里也是封装的tinyXML没问题,还有就是 线程安全???
[其他解释]
设备发送的是XML数据流,不是文件。我用SOCKET接收到的数据存储在char数组里,但是有时候接收的数据里包含乱码。
[其他解释]
发送方和接收方都不互相交流吗,接收方怎么知道另一端发送过来的数据收全了没有?
如果单线程发送数据,是不会粘的。
[其他解释]
下面是我写的代码:


///////////首先是建立SOCKET连接/////////////////////        
int err;
WORD versionRequired;
WSADATA wsaData;
versionRequired=MAKEWORD(1,1);
err=WSAStartup(versionRequired,&wsaData);//协议库的版本信息

if (!err)
{
printf("客户端嵌套字已经打开!\n");
}
else
{
printf("客户端的嵌套字打开失败!\n");
return 0;//结束
}

SOCKET clientSocket=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN clientsock_in;
char ip_addr[16]={"192.168.1.5"};
clientsock_in.sin_addr.S_un.S_addr=inet_addr(ip_addr);
clientsock_in.sin_family=AF_INET;
clientsock_in.sin_port=htons(10001);
connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR));//开始连接
///////////然后在while(1)循环中接收xml数据/////////////////////  
char receiveBuf2[2000];
while (1)
{
/////////////发送数据////////////////////////////////////
 char* sendBuf=
"<?xml version="1.0" encoding="UTF-8"?>\
<CommandMessage MessageType="Request">\
<DeviceIdentification>\
<DeviceName>APU01</DeviceName>\
</DeviceIdentification>\
<RequestorIdentification>\
<DeviceName>Computer</DeviceName>\
</RequestorIdentification>\
<Command>\


<SimpleCommand>Ping</SimpleCommand>\
</Command>\
</CommandMessage>";

int sentnum=send(clientSocket,sendBuf,strlen(sendBuf)+1,0);

if (sentnum>0&&sentnum!=SOCKET_ERROR)
{
printf("%s\n","发送成功");
}
else
{
printf("%s\n","发送失败");
}


/////////////接收数据////////////////////////////////////

for (int i=0;i<2000;i++)
{
receiveBuf2[i]='\0';
}
int RecvByte=recv(clientSocket,receiveBuf2,2000,0);

if (RecvByte==0
[其他解释]
RecvByte==SOCKET_ERROR)
{
printf("%s\n","接收失败");
}
else
{
printf("%s\n","接收成功");
}


printf("%s\n", receiveBuf2);
Sleep(2000);

}      


上述代码接收到的数据中,有时候是完整的,有时候开头是
<?xml ve j y...n="1.0" encoding="UTF-8"?>
或者
ding="UTF-8"?>..........

[其他解释]
非常感谢各位的指点,经过2天的努力我发现了问题所在,不是我接收的有问题,而是发送方发出的XML数据本身就包含了乱码,我接收到的是正确的数据。我贴的代码是没有问题的。

热点排行