/** * @brief This function processes the delete port to IGD(Internet Gateway Device). * @return 0: success, -2: Invalid UPnP Step, -1: reply packet timeout, 1: received xml parse error, other: UPnP error code */ signed short DeletePortProcess( SOCKET sockfd, /**< a socket number. */ const char* protocol, /**< a procotol name. "TCP" or "UDP" */ const unsigned int extertnal_port /**< an external port number. */ ) { short len=0; long endTime=0; uint32 ipaddr; uint16 port; // Check UPnP Step if(UPnP_Step < 2) return -2; // Make "Delete Port" XML(SOAP) memset(content, '\0', MAX_BUFFER); MakeSOAPDeleteControl(content, protocol, extertnal_port); // Make HTTP POST Header memset(send_buffer, '\0', MAX_BUFFER); len = strlen(content); MakePOSTHeader(send_buffer, len, DELETE_PORT); strcat(send_buffer, content); #ifdef UPNP_DEBUG printf("%s\r\n", send_buffer); #endif ipaddr = inet_addr((uint8*)descIP); ipaddr = swapl(ipaddr); port = ATOI(descPORT, 10); // Connect to IGD(Internet Gateway Device) if(TCPClientOpen(sockfd, PORT_UPNP, (uint8*)&ipaddr, port) == FAIL) printf("TCP Socket Error!!\r\n"); // Send "Delete Port" Message while(GetTCPSocketStatus(sockfd) != STATUS_ESTABLISHED); TCPSend(sockfd, (void *)send_buffer, strlen(send_buffer)); // Receive Reply memset(recv_buffer, '\0', MAX_BUFFER); Delay_ms(500); endTime = my_time + 3; while (TCPRecv(sockfd, (void *)recv_buffer, MAX_BUFFER) <= 0 && my_time < endTime); // Check Receive Buffer of W5200 if(my_time >= endTime){ // Check Timeout TCPClose(sockfd); return -1; } // TCP Socket Close TCPClose(sockfd); #ifdef UPNP_DEBUG printf("\r\nReceiveData\r\n%s\r\n", recv_buffer); #endif // Parse Replied Message return parseDeletePort(recv_buffer); }
/** * @brief This function gets the description message from IGD(Internet Gateway Device). * @return 0: success, -2: Invalid UPnP Step, -1: reply packet timeout, 1: received xml parse error */ signed char GetDescriptionProcess( SOCKET sockfd /**< a socket number. */ ) { char ret_value=0; long endTime=0; uint32 ipaddr; uint16 port; // Check UPnP Step if(UPnP_Step < 1) return -2; // Make HTTP GET Header memset(send_buffer, '\0', MAX_BUFFER); MakeGETHeader(send_buffer); #ifdef UPNP_DEBUG printf("%s\r\n", send_buffer); #endif ipaddr = inet_addr((uint8*)descIP); ipaddr = swapl(ipaddr); port = ATOI(descPORT, 10); // Connect to IGD(Internet Gateway Device) if(TCPClientOpen(sockfd, PORT_UPNP, (uint8*)&ipaddr, port) == FAIL) printf("TCP Socket Error!!\r\n"); // Send Get Discription Message while(GetTCPSocketStatus(sockfd) != STATUS_ESTABLISHED); TCPSend(sockfd, (void *)send_buffer, strlen(send_buffer)); // Receive Reply memset(recv_buffer, '\0', MAX_BUFFER); Delay_ms(500); endTime = my_time + 3; while (TCPRecv(sockfd, (void *)recv_buffer, MAX_BUFFER) <= 0 && my_time < endTime); // Check Receive Buffer of W5200 if(my_time >= endTime){ // Check Timeout TCPClose(sockfd); return -1; } // TCP Socket Close TCPClose(sockfd); #ifdef UPNP_DEBUG printf("\r\nReceiveData\r\n%s\r\n", recv_buffer); #endif // Parse Discription Message if((ret_value = parseDescription(recv_buffer)) == 0) UPnP_Step = 2; return ret_value; }
//processing http protocol , and excuting the followed fuction. void WebServer(uint8 s) { int ret; uint32 header_len=0, content_len=0, received_len=0; char sub[10]; /* http service start */ ret = TCPRecv(s, (int8*)rx_buf, MAX_URI_SIZE); if(ret > 0){ // If Received.. *(((uint8*)rx_buf)+ret) = '\0'; if(strstr(rx_buf, "Content-Length: ")){ mid((char*)rx_buf, "Content-Length: ", "\r\n", sub); content_len=atoi(sub); header_len = (uint32)(strstr(rx_buf, "\r\n\r\n") - rx_buf + 4); received_len = ret; while(received_len!=(content_len+header_len)) { ret = TCPRecv(s, (int8*)rx_buf+received_len, MAX_URI_SIZE); received_len+=ret; } *(((uint8*)rx_buf)+received_len) = '\0'; } HTTPProcessor(s, (char*)rx_buf); // request is processed memset(rx_buf,0x00,MAX_URI_SIZE); TCPDisconnect(s); } else if(ret == SOCKERR_NOT_TCP){ // Not TCP Socket, It's UDP Socket DBG("UDP Socket Close"); UDPClose(s); } else if(ret == SOCKERR_CLOSED){ // Socket Closed LOGA("HTTP Server Started - ch(%d)",(uint16)s); TCPServerOpen(s, DEFAULT_HTTP_PORT); } if(GetTCPSocketStatus(s) == SOCKERR_CLOSE_WAIT){// Close waiting TCPClose(s); } }
void loopback_tcps(uint8 ch, uint16 port) { int ret; int SendLen, ReSendLen; ret = TCPRecv(ch, data_buf, TX_RX_MAX_BUF_SIZE); if(ret > 0) { // Received SendLen = TCPSend(ch, data_buf, ret); if(SendLen < ret) { while(SendLen != ret) { ReSendLen = TCPReSend(ch); if(ReSendLen > 0) { SendLen += ReSendLen; } else if(ReSendLen == ERROR_WINDOW_FULL) { LOG("Window Full"); TCPClose(ch); DBG("TCP Socket Close"); while(1); } else { break; } } } } else if(ret == ERROR_NOT_TCP_SOCKET) { // Not TCP Socket, It's UDP Socket DBG("UDP Socket Close"); UDPClose(ch); } else if(ret == ERROR_CLOSED) { // Socket Closed LOGA("TCP Loop-Back Started - ch(%d)",(uint16)ch); TCPServerOpen(ch, port); } if(GetTCPSocketStatus(ch) == STATUS_CLOSE_WAIT) { // Close waiting TCPClose(ch); } }
void ftp_client_DTP(uint8 sock) { int len; int idx; switch( GetTCPSocketStatus(sock) ) { case STATUS_ESTABLISHED: if(bRunDTP) { bRunDTP = 0; #ifdef Debug printf("< FTP_DTP Connect OK>\r\n"); #endif } len = TCPRecv(sock, data_buf, TX_RX_MAX_BUF_SIZE); if( len > 0 ) { for( idx = 0; idx < len; idx++ ) { if( idx == 0 ) printf("\r\n"); printf("%c",data_buf[idx]); } } if( bRunPutFile ) { bRunPutFile = 0; TCPSend(sock, (void *)PUTFILE, strlen(PUTFILE)); TCPClose(sock); } break; case STATUS_CLOSE_WAIT: len = TCPRecv(sock, data_buf, TX_RX_MAX_BUF_SIZE); if( len > 0 ) { for( idx = 0; idx < len; idx++ ) { if( idx == 0 ) printf("\r\n"); printf("%c",data_buf[idx]); } } if( bRunPutFile ) { bRunPutFile = 0; TCPSend(sock, (void *)PUTFILE, strlen(PUTFILE)); } TCPClose(sock); break; case STATUS_CLOSED: TCPClose(sock); if( TCPServerOpen( sock, DTP_Port++ ) == 0 ) { printf("\r\nDTP Socket Open Error"); break; } if( DTP_Port > 70000 ) DTP_Port = FTP_Client_TCPS_Port; bRunDTP = 1; break; } }