I am looking for suggestions on the best way to send/receive data from a remote GPRS device, over port 80.
Creating a plain TCP socket on a random port works fine, but m
Will simply sending base64 encoded data work?
There is no need to use base 64 encoding - this will simply increase the number of bytes you must transfer. Mobile operators normally limit mangling of responses to content types that they understand - i.e. images, stylesheets, etc.
How are the HTTP sessions handled?
HTTP sessions are normally handled either via a URL query parameter or via a cookie value. However, from what you have said it doesn't sound like sessions are necessary.
Arbitrary sockets can be kept alive for a long time, but HTTP verbs are usually short lived. Does this mean I will need to create a new connection for each packet of data?
HTTP requests can last for an arbitrarily long period of time, just as for raw TCP sockets. A GET request can last for hours if necessary. You need not create a new connection for each request — take a look at the Connection: Keep-Alive
HTTP header.
Or is there a way to send server responses in chunks, over a single connection?
If you don't know the length of the response you can either omit a Content-Length header or, preferably, use the Transfer-Encoding: chunked
HTTP header.
In what ways can an ISP proxy mess with the data, or the headers? For example, a proxy can sometimes keep a connection alive, even if the server closes it.
ISPs don't tend to reveal the changes they make to HTTP responses. If you are concerned about this a simple solution would be to encrypt the data and specify a Content-Encoding
HTTP header. This would require you to control both the HTTP client and server.
ASP.NET C# implementation of Uploading binary data like images as POST request to target URL:.
http://technowide.net/2012/09/01/upload-binary-data-http-post/
If possible, you could just send the data as HTTP requests and responses.
HTTP is perfectly capable of handling binary data: images are sent over HTTP all the time, and they're binary. People upload and download files of arbitrary data types all the time with no problem.
Just give it a mime type of "application/octet-stream" -- which is basically a generic mime type for binary data with no further specification of just what sort -- and any proxies along the way should leave it alone.