Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "UDPAPITest.h"
00025 #include <arpa/inet.h>
00026 #include <stdlib.h>
00027 #include <stdio.h>
00028 #include <string.h>
00029
00030
00031 char ACK[] = "I got it.";
00032
00033 FILE *fp;
00034
00035 void
00036 UDPTestInit()
00037 {
00038 TSCont cont;
00039 TSMutex readMutexp;
00040 unsigned long ip;
00041
00042 ip = inet_addr("209.131.48.79");
00043 readMutexp = TSMutexCreate();
00044 cont = TSContCreate(&handle_callbacks, readMutexp);
00045
00046 INKUDPBind(cont, ip, 1813);
00047 }
00048
00049
00050 void
00051 printN(const char *start, int length)
00052 {
00053 int i;
00054 for (i = 0; i < length; i++)
00055 fprintf(fp, "%c", *(start + i));
00056 fprintf(fp, "\n");
00057 }
00058
00059 int
00060 handle_callbacks(TSCont cont, TSEvent event, void *e)
00061 {
00062 INKUDPacketQueue packetQueue;
00063 INKUDPPacket packet;
00064 TSIOBufferBlock recvBuffBlock;
00065 TSIOBufferReader reader;
00066 TSIOBuffer iobuffer;
00067 INKUDPConn UDPConn;
00068 unsigned int ip;
00069 int port;
00070 int *sizep;
00071 int size;
00072 char sendBuff[32];
00073 const char *buf;
00074 int avail, total_len;
00075 char recv_buffer[4096];
00076
00077
00078 fp = fopen("UDPServer.log", "a+");
00079
00080 switch (event) {
00081
00082 case TS_NET_EVENT_DATAGRAM_OPEN:
00083 fprintf(fp, "open event called\n");
00084 UDPConn = (INKUDPConn) e;
00085 INKUDPRecvFrom(cont, UDPConn);
00086 break;
00087
00088
00089 case TS_NET_EVENT_DATAGRAM_READ_READY:
00090 fprintf(fp, "read ready event called\n");
00091 packetQueue = (INKUDPacketQueue) e;
00092 total_len = 0;
00093 while ((packet = INKUDPPacketGet(packetQueue)) != NULL) {
00094 recvBuffBlock = INKUDPPacketBufferBlockGet(packet);
00095 iobuffer = TSIOBufferCreate();
00096 reader = TSIOBufferReaderAlloc(iobuffer);
00097 TSIOBufferAppend(iobuffer, recvBuffBlock);
00098 buf = TSIOBufferBlockReadStart(recvBuffBlock, reader, &avail);
00099
00100 if (avail > 0) {
00101 fprintf(fp, "Received message is\n");
00102 printN(buf, avail);
00103 fprintf(fp, "message length = %i\n", avail);
00104 memcpy((char *) &recv_buffer + total_len, buf, avail);
00105 TSIOBufferReaderConsume(reader, avail);
00106 total_len += avail;
00107 }
00108
00109
00110 ip = INKUDPPacketFromAddressGet(packet);
00111 port = INKUDPPacketFromPortGet(packet);
00112 fprintf(fp, "port = %d\n", port);
00113
00114 UDPConn = (INKUDPConn) INKUDPPacketConnGet(packet);
00115 INKUDPSendTo(cont, UDPConn, ip, port, ACK, strlen(ACK));
00116
00117
00118 INKUDPPacketDestroy(packet);
00119 TSIOBufferReaderFree(reader);
00120 TSIOBufferDestroy(iobuffer);
00121 }
00122
00123 break;
00124
00125 case TS_NET_EVENT_DATAGRAM_WRITE_COMPLETE:
00126 break;
00127
00128 }
00129 fclose(fp);
00130 return TS_EVENT_CONTINUE;
00131 }