#include <RNPacket.h>
Öffentliche Datenelemente | |
RNPacket (void) | |
~RNPacket (void) | |
RNPRESULT | initMessageCallBack (void *pvoidUserContext, const PMESSAGECALLBACK pmcFoo) |
RNPRESULT | sendMessage (void *pvoidData, WORD wBufferSize) |
RNPRESULT | recvMessage (void) |
RNPRESULT | socketConnect (char *pcDestName, int iPort, int iAdressFamily=AF_INET, int iType=SOCK_STREAM, int iProtocol=IPPROTO_IP) |
RNPRESULT | socketAccept (RNSocket *psocketListener) |
RNPRESULT | socketClose (void) |
Private Attribute | |
RNSocket | m_RNSSocket |
Der Socket über den gesendet oder empfangen wird. Mehr... | |
bool | m_bInitialized |
gibt an ob Objekt bereits initialisiert wurde. Mehr... | |
PMESSAGECALLBACK | m_pmcCallBack |
Funktionspointer auf den Messagehandler CallBack. Mehr... | |
void * | m_pvoidUserContext |
Der User Kontext, der bei initialize übergeben wurde. Mehr... | |
char | m_pcBuffer [c_iMaxPacketLength] |
Buffer für teilweise empfangene Nachrichten. Mehr... | |
int | m_iBufferUsage |
Anzahl der Bytes, die noch im Buffer sind. Mehr... |
RNPacket kümmert sich darum, das beim Senden automatisch die Längeninformation dem Paket hinzugefügt wird und diese beim Empfangen wieder entfernt wird.
|
Konstruktor
00027 { 00028 m_bInitialized=false; 00029 m_pmcCallBack=NULL; 00030 m_pvoidUserContext=NULL; 00031 00032 m_iBufferUsage=0; 00033 } |
|
Destruktor
00042 { 00043 socketClose(); 00044 } |
|
|
|
Versucht Daten vom angegebenen Socket zu empfangen, wenn ein Packet empfangen werden kann, wird dieses der MessageCallBack übergeben.
00079 { 00080 if (m_bInitialized == false) 00081 { 00082 return RNP_ERROR_NOT_INITIALIZED; 00083 } 00084 00085 bool bReadable; 00086 00087 if (!m_RNSSocket.isReadable(bReadable,0)) 00088 { 00089 return RNP_ERROR_SOCKET; 00090 } 00091 00092 if (!bReadable) 00093 { 00094 return RNP_SOCKET_NOT_READABLE; 00095 } 00096 00097 WORD wLength; 00098 00099 if (m_iBufferUsage<c_iMaxPacketLength) 00100 { 00101 int iBytesReceived=c_iMaxPacketLength-m_iBufferUsage; 00102 00103 if(!m_RNSSocket.receive( m_pcBuffer+m_iBufferUsage, 00104 &iBytesReceived)) 00105 { 00106 return RNP_SOCKET_NOT_CONNECTED; 00107 } 00108 00109 m_iBufferUsage=+iBytesReceived; 00110 00111 if (iBytesReceived==0) 00112 { 00113 return RNP_SOCKET_NOT_CONNECTED; 00114 } 00115 } 00116 00117 while (true) 00118 { 00119 if (m_iBufferUsage<2) 00120 { 00121 // noch nichtmal die 2 Header Bytes sind da... 00122 return RNP_OK; 00123 } 00124 00125 wLength=*(WORD*)m_pcBuffer; 00126 00127 if (m_iBufferUsage<2+wLength) 00128 { 00129 // kein komplettes Paket da 00130 return RNP_OK; 00131 } 00132 00133 // Speicher für gesamtes Paket besorgen und abholen 00134 void* pvoidData= new char[wLength]; 00135 00136 // Speicher holen fehlgeschlagen?! 00137 if (pvoidData==NULL) 00138 { 00139 return RNP_ERROR_UNDEFINED; // sollte _nie_ vorkommen 00140 } 00141 00142 // Paket in den Speicher kopieren 00143 memcpy(pvoidData,(void*)((char*)m_pcBuffer+2),wLength); 00144 00145 // Bufferlänge anpassem 00146 m_iBufferUsage-=(wLength+2); 00147 00148 if (m_iBufferUsage>0) 00149 { 00150 // ein Teil des nächsten Pakets ist schon da 00151 memmove((void*)m_pcBuffer,(void*)(m_pcBuffer+(wLength+2)),m_iBufferUsage); 00152 } 00153 00154 // den Buffer an den MessageHandler schicken 00155 RNPRESULT rnpTmp; 00156 00157 rnpTmp=m_pmcCallBack(m_pvoidUserContext,pvoidData, wLength); 00158 00159 if (rnpTmp == RNP_BUFFER_RETURNED) 00160 { 00161 delete pvoidData; 00162 } 00163 } 00164 00165 // return RNP_OK; 00166 } |
|
Verschickt ein Paket mit der entsprechenden Grösse über den Socket. Wird nicht alles gesendet ist davon auszugehen, das die Verbindung unterbrochen ist, da ein Paket kaputt ist.
00176 { 00177 if (pvoidData == NULL) 00178 { 00179 return RNP_ERROR_INVALID_PARAM; 00180 } 00181 00182 if (wBufferSize == 0) 00183 { 00184 return RNP_ERROR_INVALID_PARAM; 00185 } 00186 00187 if (m_bInitialized == false) 00188 { 00189 return RNP_ERROR_NOT_INITIALIZED; 00190 } 00191 00192 bool bWriteable; 00193 00194 if (!m_RNSSocket.isWriteable(bWriteable,0)) 00195 { 00196 return RNP_ERROR_SOCKET; 00197 } 00198 00199 if (!bWriteable) 00200 { 00201 return RNP_SOCKET_NOT_WRITEABLE; 00202 } 00203 00204 //Packet und Längeninfo zusammenpacken 00205 int iLength=2+wBufferSize; 00206 00207 char* pcBuffer= new char[iLength]; 00208 00209 *((WORD*)pcBuffer)=wBufferSize; 00210 00211 memcpy((void*)(pcBuffer+2),pvoidData,wBufferSize); 00212 00213 if (!m_RNSSocket.send(pcBuffer, &iLength)) 00214 { 00215 return RNP_ERROR_SOCKET; 00216 } 00217 00218 return RNP_OK; 00219 } |
|
Die Methode akzeptiert eine eingehende Verbinding, die am Listener registriert wird.
00258 { 00259 if (m_bInitialized == false) 00260 { 00261 return RNP_ERROR_NOT_INITIALIZED; 00262 } 00263 00264 bool bReadable; 00265 00266 if(!psocketListener->isReadable(bReadable,100)) 00267 { 00268 return RNP_ERROR_SOCKET; 00269 } 00270 00271 if (!bReadable) 00272 { 00273 return RNP_SOCKET_NOT_CONNECTED; 00274 } 00275 00276 if(!psocketListener->accept(m_RNSSocket)) 00277 { 00278 return RNP_SOCKET_NOT_CONNECTED; 00279 } 00280 00281 return RNP_OK; 00282 } |
|
Schliesst den Socket.
00291 { 00292 if (m_bInitialized == false) 00293 { 00294 return RNP_ERROR_NOT_INITIALIZED; 00295 } 00296 00297 if(!m_RNSSocket.close()) 00298 { 00299 return RNP_ERROR_SOCKET; 00300 } 00301 00302 return RNP_OK; 00303 } |
|
Versucht eine Verbindung zur angegebenen Adresse aufzubauen.
00232 { 00233 if (m_bInitialized == false) 00234 { 00235 return RNP_ERROR_NOT_INITIALIZED; 00236 } 00237 00238 if(!m_RNSSocket.create(iAdressFamily, iType, iProtocol)) 00239 { 00240 return RNP_ERROR_SOCKET; 00241 } 00242 00243 if(!m_RNSSocket.connect(pcDestName, iPort, iAdressFamily)) 00244 { 00245 return RNP_SOCKET_NOT_CONNECTED; 00246 } 00247 00248 return RNP_OK; 00249 } |
|
gibt an ob Objekt bereits initialisiert wurde.
|
|
Anzahl der Bytes, die noch im Buffer sind.
|
|
Buffer für teilweise empfangene Nachrichten.
|
|
Funktionspointer auf den Messagehandler CallBack.
|
|
Der User Kontext, der bei initialize übergeben wurde.
|
|
Der Socket über den gesendet oder empfangen wird.
|