void ILibReadSSDP(SOCKET ReadSocket, struct SSDPClientModule *module) { int bytesRead = 0; char* buffer = (char*)malloc(4096); struct sockaddr_in addr; int addrlen = sizeof(struct sockaddr_in); struct packetheader *packet; struct packetheader_field_node *node; struct parser_result* pnode; char* Location = NULL; char* UDN = NULL; int Timeout = 0; int Alive = 0; int OK; int rt; bytesRead = recvfrom(ReadSocket, buffer, 4096, 0, (struct sockaddr *) &addr, &addrlen); if(bytesRead<=0) { FREE(buffer); return; } packet = ILibParsePacketHeader(buffer,0,bytesRead); if(packet->Directive==NULL) { /* M-SEARCH Response */ if(packet->StatusCode==200) { node = packet->FirstField; while(node!=NULL) { if(strncasecmp(node->Field,"LOCATION",8)==0) { Location = (char*)MALLOC(node->FieldDataLength+1); memcpy(Location,node->FieldData,node->FieldDataLength); Location[node->FieldDataLength] = '\0'; } if(strncasecmp(node->Field,"CACHE-CONTROL",13)==0) { pnode = ILibParseString(node->FieldData, 0, node->FieldDataLength, "=", 1); pnode->LastResult->data[pnode->LastResult->datalength] = '\0'; Timeout = atoi(pnode->LastResult->data); ILibDestructParserResults(pnode); } if(strncasecmp(node->Field,"USN",3)==0) { pnode = ILibParseString(node->FieldData, 0, node->FieldDataLength, "::", 2); pnode->FirstResult->data[pnode->FirstResult->datalength] = '\0'; UDN = pnode->FirstResult->data+5; ILibDestructParserResults(pnode); } node = node->NextField; } if(module->FunctionCallback!=NULL) { module->FunctionCallback(module,UDN,-1,Location,Timeout,module->Reserved); } } } else { /* Notify Packet */ if(strncasecmp(packet->Directive,"NOTIFY",6)==0) { OK = 0; rt = 0; node = packet->FirstField; while(node!=NULL) { node->Field[node->FieldLength] = '\0'; if(strncasecmp(node->Field,"NT",2)==0 && node->FieldLength==2) { node->FieldData[node->FieldDataLength] = '\0'; if(strncasecmp(node->FieldData,module->DeviceURN,module->DeviceURNLength)==0) { OK = -1; } else if(strncasecmp(node->FieldData,"upnp:rootdevice",15)==0) { rt = -1; } else { break; } } if(strncasecmp(node->Field,"NTS",3)==0) { if(strncasecmp(node->FieldData,"ssdp:alive",10)==0) { Alive = -1; rt = 0; } else { Alive = 0; OK = 0; } } if(strncasecmp(node->Field,"USN",3)==0) { pnode = ILibParseString(node->FieldData, 0, node->FieldDataLength, "::", 2); pnode->FirstResult->data[pnode->FirstResult->datalength] = '\0'; UDN = pnode->FirstResult->data+5; ILibDestructParserResults(pnode); } if(strncasecmp(node->Field,"LOCATION",8)==0) { Location = (char*)MALLOC(node->FieldDataLength+1); memcpy(Location,node->FieldData,node->FieldDataLength); Location[node->FieldDataLength] = '\0'; } if(strncasecmp(node->Field,"CACHE-CONTROL",13)==0) { pnode = ILibParseString(node->FieldData, 0, node->FieldDataLength, "=", 1); pnode->LastResult->data[pnode->LastResult->datalength] = '\0'; Timeout = atoi(pnode->LastResult->data); ILibDestructParserResults(pnode); } node = node->NextField; } if(OK!=0 || rt!=0) { if(module->FunctionCallback!=NULL) { module->FunctionCallback(module,UDN,Alive,Location,Timeout,module->Reserved); } } } } if(Location!=NULL) {FREE(Location);} ILibDestructPacket(packet); FREE(buffer); }
void ILibMiniWebServerProcessSocket(struct ILibMWSHTTPReaderObject *Reader) { int bytesReceived; int i; struct packetheader_field_node *node; char* CharStar; if(Reader->BodySize==0) { /* Still Reading Headers */ bytesReceived = recv(Reader->ClientSocket,Reader->Header+Reader->HeaderIndex,2048-Reader->HeaderIndex,0); if(bytesReceived==0) { if(Reader->PacketHeader!=NULL) {ILibDestructPacket(Reader->PacketHeader);} if(Reader->Body_MallocSize!=0) {FREE(Reader->Body);} Reader->Body = NULL; Reader->Body_MallocSize = 0; Reader->PacketHeader = NULL; closesocket(Reader->ClientSocket); Reader->ClientSocket = 0xFFFFFFFF; return; } Reader->HeaderIndex += bytesReceived; if(Reader->HeaderIndex>4) { /* Must have read at least 4 bytes to perform check */ for(i=0;i<(Reader->HeaderIndex - 3);i++) { if (Reader->Header[i] == '\r' && Reader->Header[i+1] == '\n' && Reader->Header[i+2] == '\r' && Reader->Header[i+3] == '\n') { /* Finished Header */ Reader->PacketHeader = ILibParsePacketHeader(Reader->Header,0,i+4); Reader->PacketHeader->ReceivingAddress = Reader->LocalIPAddress; Reader->BodySize = -1; Reader->Body_Read = 0; node = Reader->PacketHeader->FirstField; while(node!=NULL) { if(strncasecmp(node->Field,"CONTENT-LENGTH",14)==0) { CharStar = (char*)MALLOC(1+node->FieldDataLength); memcpy(CharStar,node->FieldData,node->FieldDataLength); CharStar[node->FieldDataLength] = '\0'; Reader->BodySize = atoi(CharStar); FREE(CharStar); break; } node = node->NextField; } if(Reader->BodySize!=-1) { if(Reader->BodySize!=0) { Reader->Body = (char*)MALLOC(Reader->BodySize); Reader->Body_MallocSize = Reader->BodySize; } else { Reader->Body = NULL; Reader->Body_MallocSize = 0; } } else { Reader->Body = (char*)MALLOC(4096); Reader->Body_MallocSize = 4096; } if(Reader->HeaderIndex>i+4 && Reader->BodySize!=0) { /* Part of the body is in here */ memcpy(Reader->Body,Reader->Header+i+4,Reader->HeaderIndex-(&Reader->Header[i+4]-Reader->Header)); Reader->Body_BeginPointer = 0; Reader->Body_EndPointer = Reader->HeaderIndex-(int)(&Reader->Header[i+4]-Reader->Header); Reader->Body_Read = Reader->Body_EndPointer; if(Reader->BodySize==-1 || Reader->Body_Read>=Reader->BodySize) { DEBUGSTATEMENT(printf("Close\r\n")); Reader->FunctionCallback(Reader,Reader->PacketHeader,Reader->Body,&Reader->Body_BeginPointer,Reader->Body_EndPointer - Reader->Body_BeginPointer,-1,Reader->user); while(Reader->Body_BeginPointer!=Reader->Body_EndPointer && Reader->Body_BeginPointer!=0) { memcpy(Reader->Body,Reader->Body+Reader->Body_BeginPointer,Reader->Body_EndPointer-Reader->Body_BeginPointer); Reader->Body_EndPointer = Reader->Body_EndPointer-Reader->Body_BeginPointer; Reader->Body_BeginPointer = 0; Reader->FunctionCallback(Reader,Reader->PacketHeader,Reader->Body,&Reader->Body_BeginPointer,Reader->Body_EndPointer,-1,Reader->user); } if(Reader->PacketHeader!=NULL) {ILibDestructPacket(Reader->PacketHeader);} if(Reader->Body_MallocSize!=0) {FREE(Reader->Body);} Reader->Body = NULL; Reader->Body_MallocSize = 0; Reader->PacketHeader = NULL; closesocket(Reader->ClientSocket); Reader->ClientSocket = 0xFFFFFFFF; } else { Reader->FunctionCallback(Reader,Reader->PacketHeader,Reader->Body,&Reader->Body_BeginPointer,Reader->Body_EndPointer - Reader->Body_BeginPointer,0,Reader->user); while(Reader->Body_BeginPointer!=Reader->Body_EndPointer && Reader->Body_BeginPointer!=0) { memcpy(Reader->Body,Reader->Body+Reader->Body_BeginPointer,Reader->Body_EndPointer-Reader->Body_BeginPointer); Reader->Body_EndPointer = Reader->Body_EndPointer-Reader->Body_BeginPointer; Reader->Body_BeginPointer = 0; Reader->FunctionCallback(Reader,Reader->PacketHeader,Reader->Body,&Reader->Body_BeginPointer,Reader->Body_EndPointer,0,Reader->user); } } } else { /* There is no body, but the packet is here */ Reader->Body_BeginPointer = 0; Reader->Body_EndPointer = 0; if(Reader->BodySize<=0) { Reader->FunctionCallback(Reader,Reader->PacketHeader,NULL,&Reader->Body_BeginPointer,0,-1,Reader->user); if(Reader->PacketHeader!=NULL) {ILibDestructPacket(Reader->PacketHeader);} if(Reader->Body_MallocSize!=0) {FREE(Reader->Body);} Reader->Body = NULL; Reader->Body_MallocSize = 0; Reader->PacketHeader = NULL; closesocket(Reader->ClientSocket); Reader->ClientSocket = 0xFFFFFFFF; } else { Reader->FunctionCallback(Reader,Reader->PacketHeader,NULL,&Reader->Body_BeginPointer,0,0,Reader->user); } } break; } } } } else { /* Reading Body Only */ if(Reader->Body_BeginPointer == Reader->Body_EndPointer) { Reader->Body_BeginPointer = 0; Reader->Body_EndPointer = 0; } else { if(Reader->Body_BeginPointer!=0) { Reader->Body_EndPointer = Reader->Body_BeginPointer; } } if(Reader->Body_EndPointer == Reader->Body_MallocSize) { Reader->Body_MallocSize += 4096; Reader->Body = (char*)realloc(Reader->Body,Reader->Body_MallocSize); } bytesReceived = recv(Reader->ClientSocket,Reader->Body+Reader->Body_EndPointer,Reader->Body_MallocSize-Reader->Body_EndPointer,0); Reader->Body_EndPointer += bytesReceived; Reader->Body_Read += bytesReceived; Reader->FunctionCallback(Reader, Reader->PacketHeader, Reader->Body+Reader->Body_BeginPointer, &Reader->Body_BeginPointer, Reader->Body_EndPointer - Reader->Body_BeginPointer, 0, Reader->user); while(Reader->Body_BeginPointer!=Reader->Body_EndPointer && Reader->Body_BeginPointer!=0) { memcpy(Reader->Body,Reader->Body+Reader->Body_BeginPointer,Reader->Body_EndPointer-Reader->Body_BeginPointer); Reader->Body_EndPointer = Reader->Body_EndPointer-Reader->Body_BeginPointer; Reader->Body_BeginPointer = 0; Reader->FunctionCallback(Reader,Reader->PacketHeader,Reader->Body,&Reader->Body_BeginPointer,Reader->Body_EndPointer,0,Reader->user); } if((Reader->BodySize!=-1 && Reader->Body_Read>=Reader->BodySize)||(bytesReceived==0)) { if(Reader->Body_BeginPointer == Reader->Body_EndPointer) { Reader->Body_BeginPointer = 0; Reader->Body_EndPointer = 0; } Reader->FunctionCallback(Reader, Reader->PacketHeader, Reader->Body, &Reader->Body_BeginPointer, Reader->Body_EndPointer, -1,Reader->user); if(Reader->PacketHeader!=NULL) {ILibDestructPacket(Reader->PacketHeader);} if(Reader->Body_MallocSize!=0) {FREE(Reader->Body);} Reader->Body = NULL; Reader->Body_MallocSize = 0; Reader->PacketHeader = NULL; closesocket(Reader->ClientSocket); Reader->ClientSocket = 0xFFFFFFFF; } if(Reader->Body_BeginPointer==Reader->Body_EndPointer) { Reader->Body_BeginPointer = 0; Reader->Body_EndPointer = 0; } } }