Код такой:
Код
TCPStringSend("SETUP rtsp://192.168.1.57:554/video.mp4/trackID=1 RTSP/1.0\r\nCSeq: 2\r\nUser-Agent: LibVLC/1.1.10 (LIVE555 Streaming Media v2011.05.25)\r\nTransport: RTP/AVP;unicast;client_port=54884-54885\r\nSession: 327b23c6643c9869\r\n\r\n");
TCPStringSend("QETUP rtsp://192.168.1.57:554/video.mp4/trackID=1 RTSP/1.0\r\nCSeq: 2\r\nUser-Agent: LibVLC/1.1.10 (LIVE555 Streaming Media v2011.05.25)\r\nTransport: RTP/AVP;unicast;client_port=54884-54885\r\nSession: 327b23c6643c9869\r\n\r\n");
TCPStringSend("PLAY rtsp://192.168.1.57:554/video.mp4/ RTSP/1.0\r\nCSeq: 3\r\nUser-Agent: LibVLC/1.1.10 (LIVE555 Streaming Media v2011.05.25)\r\nSession: 327b23c6643c9869\r\nRange: npt=0.000-\r\n\r\n");
TCPStringSend("QETUP rtsp://192.168.1.57:554/video.mp4/trackID=1 RTSP/1.0\r\nCSeq: 2\r\nUser-Agent: LibVLC/1.1.10 (LIVE555 Streaming Media v2011.05.25)\r\nTransport: RTP/AVP;unicast;client_port=54884-54885\r\nSession: 327b23c6643c9869\r\n\r\n");
TCPStringSend("PLAY rtsp://192.168.1.57:554/video.mp4/ RTSP/1.0\r\nCSeq: 3\r\nUser-Agent: LibVLC/1.1.10 (LIVE555 Streaming Media v2011.05.25)\r\nSession: 327b23c6643c9869\r\nRange: npt=0.000-\r\n\r\n");
В ходе решения проблемы я временно ограничил вывод строк 100 символами. В итоге, такие пакеты были получены компом (выделена область, содержащая строку):
Пакет номер РАЗ:
Нажмите для просмотра прикрепленного файла
Пакет номер ДВА:
Нажмите для просмотра прикрепленного файла
Пакет номер ТРИ:
Нажмите для просмотра прикрепленного файла
Видно, что строка №1 дошла коряво. При этом были попытки заранее определить строки, сделать их переменными, но именно 3 строки отправлялись с глюками (две и одна - нормально). Я проверил содержание elf файла, но там все три строки хранятся правильно:
Нажмите для просмотра прикрепленного файла
Подскажите пожалуйста где я мог ошибиться. Спасибо
PS Приведу на всякий случай коды своих процедур:
Код
int TCPStringSend(const char *DataBuffer)
{
u16 DataSize = 0;
//while(/*DataBuffer[DataSize]*/*(DataBuffer + DataSize) != 0) DataSize++;
TCPPackageSend(&SOURCE_IP_ADDRESS[0], &DESTINATION_IP_ADDRESS[0], DEVICE_DEFAULT_PORT, RTSP_DEFAULT_PORT, TCP_PSH | TCP_ACK, 0, DataBuffer, /*DataSize*/100);
TCPClSequenceNum = TCPClSequenceNum + DataSize;
return 0;
}
{
u16 DataSize = 0;
//while(/*DataBuffer[DataSize]*/*(DataBuffer + DataSize) != 0) DataSize++;
TCPPackageSend(&SOURCE_IP_ADDRESS[0], &DESTINATION_IP_ADDRESS[0], DEVICE_DEFAULT_PORT, RTSP_DEFAULT_PORT, TCP_PSH | TCP_ACK, 0, DataBuffer, /*DataSize*/100);
TCPClSequenceNum = TCPClSequenceNum + DataSize;
return 0;
}
Код
int TCPDataSend(const char *DataBuffer, u16 DataSize)
{
TCPPackageSend(&SOURCE_IP_ADDRESS[0], &DESTINATION_IP_ADDRESS[0], DEVICE_DEFAULT_PORT, RTSP_DEFAULT_PORT, TCP_PSH | TCP_ACK, 0, DataBuffer, DataSize);
TCPClSequenceNum = TCPClSequenceNum + DataSize;
return 0;
}
{
TCPPackageSend(&SOURCE_IP_ADDRESS[0], &DESTINATION_IP_ADDRESS[0], DEVICE_DEFAULT_PORT, RTSP_DEFAULT_PORT, TCP_PSH | TCP_ACK, 0, DataBuffer, DataSize);
TCPClSequenceNum = TCPClSequenceNum + DataSize;
return 0;
}
Код
void TCPPackageSend(u8 *SourceIPAddr, u8 *DestinationIPAddr, u16 SourcePort, u16 DestinationPort, u8 Flags, u8 AddOptions, const char *DataBuffer, u16 DataSize)
{
u8 BufferToSend[1500];
u8 HeaderLength = 20;
u16 BytesCounter = 0;
u16 PacketLength = 0;
u16 HeaderCheckSum = 0x0000;
if(AddOptions == 1)
{
PacketLength = DataSize + 32;
BufferToSend[20] = 0x02;
BufferToSend[21] = 0x04;
BufferToSend[22] = 0x05;
BufferToSend[23] = 0xB4;
BufferToSend[24] = 0x01;
BufferToSend[25] = 0x03;
BufferToSend[26] = 0x03;
BufferToSend[27] = 0x08;
BufferToSend[28] = 0x01;
BufferToSend[29] = 0x01;
BufferToSend[30] = 0x04;
BufferToSend[31] = 0x02;
HeaderLength = 32;
PacketLength = DataSize + HeaderLength;
for(BytesCounter = HeaderLength; BytesCounter < PacketLength; BytesCounter++) BufferToSend[BytesCounter] = DataBuffer[BytesCounter - HeaderLength];
}
else
{
HeaderLength = 20;
PacketLength = DataSize + HeaderLength;
for(BytesCounter = HeaderLength; BytesCounter < PacketLength; BytesCounter++) BufferToSend[BytesCounter] = DataBuffer[BytesCounter - HeaderLength];
}
BufferToSend[0] = (u8)((SourcePort & 0xFF00) >> 8); //Порт отправителя
BufferToSend[1] = (u8)(SourcePort & 0x00FF);
BufferToSend[2] = (u8)((DestinationPort & 0xFF00) >> 8); //Порт получателя
BufferToSend[3] = (u8)(DestinationPort & 0x00FF);
BufferToSend[4] = (u8)((TCPClSequenceNum & 0xFF000000) >> 24);
BufferToSend[5] = (u8)((TCPClSequenceNum & 0x00FF0000) >> 16);
BufferToSend[6] = (u8)((TCPClSequenceNum & 0x0000FF00) >> 8);
BufferToSend[7] = (u8)(TCPClSequenceNum & 0x000000FF);
BufferToSend[8] = (u8)((TCPSrvSequenceNum & 0xFF000000) >> 24);
BufferToSend[9] = (u8)((TCPSrvSequenceNum & 0x00FF0000) >> 16);
BufferToSend[10] = (u8)((TCPSrvSequenceNum & 0x0000FF00) >> 8);
BufferToSend[11] = (u8)(TCPSrvSequenceNum & 0x000000FF);
BufferToSend[12] = HeaderLength * 4;
BufferToSend[13] = Flags;
BufferToSend[14] = (u8)((TCP_WINDOW_SIZE & 0xFF00) >> 8);
BufferToSend[15] = (u8)(TCP_WINDOW_SIZE & 0x00FF);
BufferToSend[16] = 0;
BufferToSend[17] = 0;
BufferToSend[18] = 0;
BufferToSend[19] = 0;
HeaderCheckSum = tcp_sum_calc(PacketLength, SourceIPAddr, DestinationIPAddr, 0, &BufferToSend[0]);
BufferToSend[16] = (u8)((HeaderCheckSum & 0xFF00) >> 8); //Контрольная сумма
BufferToSend[17] = (u8)(HeaderCheckSum & 0x00FF);
IPPackageSend(SourceIPAddr, DestinationIPAddr, TCP_PROTOCOL_TYPE, &BufferToSend[0], PacketLength);
}
{
u8 BufferToSend[1500];
u8 HeaderLength = 20;
u16 BytesCounter = 0;
u16 PacketLength = 0;
u16 HeaderCheckSum = 0x0000;
if(AddOptions == 1)
{
PacketLength = DataSize + 32;
BufferToSend[20] = 0x02;
BufferToSend[21] = 0x04;
BufferToSend[22] = 0x05;
BufferToSend[23] = 0xB4;
BufferToSend[24] = 0x01;
BufferToSend[25] = 0x03;
BufferToSend[26] = 0x03;
BufferToSend[27] = 0x08;
BufferToSend[28] = 0x01;
BufferToSend[29] = 0x01;
BufferToSend[30] = 0x04;
BufferToSend[31] = 0x02;
HeaderLength = 32;
PacketLength = DataSize + HeaderLength;
for(BytesCounter = HeaderLength; BytesCounter < PacketLength; BytesCounter++) BufferToSend[BytesCounter] = DataBuffer[BytesCounter - HeaderLength];
}
else
{
HeaderLength = 20;
PacketLength = DataSize + HeaderLength;
for(BytesCounter = HeaderLength; BytesCounter < PacketLength; BytesCounter++) BufferToSend[BytesCounter] = DataBuffer[BytesCounter - HeaderLength];
}
BufferToSend[0] = (u8)((SourcePort & 0xFF00) >> 8); //Порт отправителя
BufferToSend[1] = (u8)(SourcePort & 0x00FF);
BufferToSend[2] = (u8)((DestinationPort & 0xFF00) >> 8); //Порт получателя
BufferToSend[3] = (u8)(DestinationPort & 0x00FF);
BufferToSend[4] = (u8)((TCPClSequenceNum & 0xFF000000) >> 24);
BufferToSend[5] = (u8)((TCPClSequenceNum & 0x00FF0000) >> 16);
BufferToSend[6] = (u8)((TCPClSequenceNum & 0x0000FF00) >> 8);
BufferToSend[7] = (u8)(TCPClSequenceNum & 0x000000FF);
BufferToSend[8] = (u8)((TCPSrvSequenceNum & 0xFF000000) >> 24);
BufferToSend[9] = (u8)((TCPSrvSequenceNum & 0x00FF0000) >> 16);
BufferToSend[10] = (u8)((TCPSrvSequenceNum & 0x0000FF00) >> 8);
BufferToSend[11] = (u8)(TCPSrvSequenceNum & 0x000000FF);
BufferToSend[12] = HeaderLength * 4;
BufferToSend[13] = Flags;
BufferToSend[14] = (u8)((TCP_WINDOW_SIZE & 0xFF00) >> 8);
BufferToSend[15] = (u8)(TCP_WINDOW_SIZE & 0x00FF);
BufferToSend[16] = 0;
BufferToSend[17] = 0;
BufferToSend[18] = 0;
BufferToSend[19] = 0;
HeaderCheckSum = tcp_sum_calc(PacketLength, SourceIPAddr, DestinationIPAddr, 0, &BufferToSend[0]);
BufferToSend[16] = (u8)((HeaderCheckSum & 0xFF00) >> 8); //Контрольная сумма
BufferToSend[17] = (u8)(HeaderCheckSum & 0x00FF);
IPPackageSend(SourceIPAddr, DestinationIPAddr, TCP_PROTOCOL_TYPE, &BufferToSend[0], PacketLength);
}