Tanichev 0 26 августа, 2011 Опубликовано 26 августа, 2011 (изменено) · Жалоба По мере работы с процессором появляются новые вопросы. Следующая "неадекватность" в работе программы проявилась в передаче указателя строки и последующего вывода её через ETHERNET. Код такой: 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"); В ходе решения проблемы я временно ограничил вывод строк 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; } 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; } 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); } Изменено 26 августа, 2011 пользователем Tanichev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться