请问各位你们是如何解决粘包问题的?
有人说在包头附带包大小。但是我不清楚如何设置,因为涉及到包大小是int类型然后又要转换成char类型,然后又要跟包内容进行结合形成“包头+包内容”的形式转发出去。
比如我在发送端发送“helloworld”包内容,共10个字节,我就设置包头为10,那么整个包就是"10helloworld"。
我在接收端接收到的包要怎么判断这个包大小是10而不是1呢?我不想设置标识位,有人建议包头固定为2个字节,就是int类型的2个字节,这样可以程序固定读取头2个字节作为包头。2个字节的包头要转换成char类型再传送出去我这里有点不懂。比如说我要传送长度为256的字符串,就是int 256用itoa转成字符串那就是"256"可是占用了3个字节啊,如果我固定读取2个字节,那可是只能读到25啊!?求助啊!
有人说在包头附带包大小。但是我不清楚如何设置,因为涉及到包大小是int类型然后又要转换成char类型,然后又要跟包内容进行结合形成“包头+包内容”的形式转发出去。
比如我在发送端发送“helloworld”包内容,共10个字节,我就设置包头为10,那么整个包就是"10helloworld"。
我在接收端接收到的包要怎么判断这个包大小是10而不是1呢?我不想设置标识位,有人建议包头固定为2个字节,就是int类型的2个字节,这样可以程序固定读取头2个字节作为包头。2个字节的包头要转换成char类型再传送出去我这里有点不懂。比如说我要传送长度为256的字符串,就是int 256用itoa转成字符串那就是"256"可是占用了3个字节啊,如果我固定读取2个字节,那可是只能读到25啊!?求助啊!
用流协议,必须自己组包,这是基本常识。如何组包? 当然是根据上层协议。
{
char szHead[2];
USHORT usID;
char cCmdType;
USHORT usLength;
char szData[MAX_DATA_LENG];
char szCRC[2];
char szTail[2];
DataPacket()
{
*szHead = 0x00;
*(szHead +1) = 0x00;
usID = 0;
cCmdType = 0x00;
memset(szData,0,MAX_DATA_LENG);
*szCRC = 0x00;
*(szCRC + 1) = 0x00;
*szTail = 0x00;
*(szTail + 1) = 0x00;
}
}DATAPACKET ,*PDATAPACKET;发送的时候自己封包,接收的时候自己解包。
typedef struct DataPacket
{
char szHead[2];
USHORT usID;
char cCmdType;
USHORT usLength;
char szData[MAX_DATA_LENG];
char szCRC[2];
char szTail[2];
DataPacket()
{
*szHead = 0x00;
*(szHead +1) = 0x00;
usID = 0;
cCmdType = 0x00;
memset(szData,0,MAX_DATA_LENG);
*szCRC = 0x00;
*(szCRC + 1) = 0x00;
*szTail = 0x00;
*(szTail + 1) = 0x00;
}
}DATAPACKET ,*PDATAPACKET;
不能直接发送这个结构体,要封包处理
int packetlen;
char databuf[1];
}data_packet, *pdata_packet;//server
strcpy(message,"X=1366");
length=strlen(message) + sizeof(data_packet);
pdata_packet sdata = (pdata_packet)malloc(length);
sdata->packetlen = length;
strcpy(sdata->packetlen, message);
if (send(*m_socket,sdata,length,0)==SOCKET_ERROR )
{
AfxMessageBox("无法发送屏幕分辨率数据");
return 0;
}
//client
pdata_packet rdata;
int ret,packetlen, readlen = 0;
ret = recv(m_socket,&packetlen,4,0);
if(ret != SOCKET_ERROR) {
rdata = (pdata_packet)malloc(packetlen);
rdata->packetlen = packetlen;
readlen += ret;
while(readlen <= packetlen) {
ret = recv(m_socket, (char *)rdata + readlen, packlen - readlen, 0);
if(ret != SOCKET_ERROR)readlen += ret;
else {
AfxMessageBox("接收错误");
closesocket(m_socket);
return false;
}
}
}