1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 #define TYPE_REQUEST 0 6 #define TYPE_RESPONSE 1 7 8 #define TOKEN_OPTION 0 9 10 #define RTSP_ERROR_SUCCESS 0 11 #define RTSP_ERROR_NO_MEMORY -1 12 #define RTSP_ERROR_MALFORMED -2 13 14 #define SEQ_INVALID -1 15 16 #define FLAG_ALLOCATED_OPTION_FIELDS 0x1 17 #define FLAG_ALLOCATED_MESSAGE_BUFFER 0x2 18 #define FLAG_ALLOCATED_OPTION_ITEMS 0x4 19 #define FLAG_ALLOCATED_PAYLOAD 0x8 20 21 #define CRLF_LENGTH 2 22 #define MESSAGE_END_LENGTH (2 + CRLF_LENGTH) 23 24 typedef struct _OPTION_ITEM { 25 char flags; 26 char* option; 27 char* content; 28 struct _OPTION_ITEM* next; 29 } OPTION_ITEM, *POPTION_ITEM; 30 31 // In this implementation, a flag indicates the message type: 32 // TYPE_REQUEST = 0 33 // TYPE_RESPONSE = 1 34 typedef struct _RTSP_MESSAGE { 35 char type; 36 char flags; 37 int sequenceNumber; 38 char* protocol; 39 POPTION_ITEM options; 40 char* payload; 41 int payloadLength; 42 43 char* messageBuffer; 44 45 union { 46 struct { 47 // Request fields 48 char* command; 49 char* target; 50 } request; 51 struct { 52 // Response fields 53 char* statusString; 54 int statusCode; 55 } response; 56 } message; 57 } RTSP_MESSAGE, *PRTSP_MESSAGE; 58 59 int parseRtspMessage(PRTSP_MESSAGE msg, char* rtspMessage, int length); 60 void freeMessage(PRTSP_MESSAGE msg); 61 void createRtspResponse(PRTSP_MESSAGE msg, char* messageBuffer, int flags, char* protocol, int statusCode, char* statusString, int sequenceNumber, POPTION_ITEM optionsHead, char* payload, int payloadLength); 62 void createRtspRequest(PRTSP_MESSAGE msg, char* messageBuffer, int flags, char* command, char* target, char* protocol, int sequenceNumber, POPTION_ITEM optionsHead, char* payload, int payloadLength); 63 char* getOptionContent(POPTION_ITEM optionsHead, char* option); 64 void insertOption(POPTION_ITEM* optionsHead, POPTION_ITEM opt); 65 void freeOptionList(POPTION_ITEM optionsHead); 66 char* serializeRtspMessage(PRTSP_MESSAGE msg, int* serializedLength); 67