Hi Folks, I'm having some issues with an small socket based server I'm writing, and I was hoping I could get some help.
My code (attached below) us supposed to read an HTTP Post message coming from a power meter, parse it, and return a proper HTTP 200 Ok message. The problem is that the socket fails to send the entire message as one message, creating a fragmented message which the power meter then fails to read and accept. Is there any way to force the socket to send the entire message at once? Am I doing anything wrong? Is there an easier way to implement this functionality? Thanks, Guy Davidson Code: # server application to read data from power meter # listens on port 80 # receives HTTP POST messages # author: Maria Kazandjieva <[EMAIL PROTECTED]>, Guy Davidson <[EMAIL PROTECTED]> # updated: July 7th, 2008: staring to add database writing functionality import time import datetime #datetime for response message from socket import * #socket module import DataPacket #local file with data packet class import library import MySQLdb #formats a proper response message myHost = "" myPort = 80 #response = "HTTP/1.1 200 OK\r\nDate: Fri, 20 June 2008 20:40:34 GMT\r \nServer:SING\r\nX-Powered-By: maria\r\nContent-Length: 7\r \nConnection:close\r\nContent-Type: text/html\r\n\r\n[0!:20]\n" #initializing the socket: s = socket(AF_INET, SOCK_STREAM) # create a TCP socket s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) # allow port reuse? I hope s.bind((myHost, myPort)) # bind it to the server port s.listen(50) # allow 50 simultaneous pending connections print('Socket initialized') #intializing the database db = MySQLdb.connect(host='localhost', user='powernet', passwd='jplicks', db='test') cursor = db.cursor() print('Database cursor intialized') while 1: print('In while 1') connection, address = s.accept() # connection is a new socket print('Accepted a connection') # TODO: # verify connection is from powernet so we don't get random connections to port 80 # best way to get the data would be: # read until we get all the headers # parse Content header to get length of data # read for that many additional bytes while 1: print('In while 1 2') data = connection.recv(4096) # receive up to 4K bytes print('First set of data receieved:') #print(data) ''' if data: print data #connection.send(response) #send response; OK 200 HTTP message else: break ''' if data: # second read should recieve the rest of the packet # finding how long the content is length = data.find('Content-Length: ') print('Index of "Content-Length" = ' + str(length)) length = int(data[length+16:length+18]) # adding the bytes from the "Content-Type section:" length += 51 data += connection.recv(length) print('Second set of data received:') print(data) if data: #print('Found data:') #print data #print the string data packet = DataPacket.DataPacket(data) #use the string data to create a DataPacket object print(packet) #print the contents of the object, I hope :) #we have a packet, let's write it to the mysql DB packet.mysql_insert(cursor) #connection.send(response) #send response; OK 200 HTTP message print('Sending response') response = library.response_message() #get the response message totalsent = 0 #initialize a variable to track how much we've sent so far while totalsent < len(response): #while we haven't sent everything sent = connection.send(response[totalsent:]) #send whatever we can starting where we stopped totalsent += sent #increment the count of how much we've sent. else: print('No data') break else: print('No data') break -- http://mail.python.org/mailman/listinfo/python-list