• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: How to maintain the socket connection in open status and send datas repeatedly
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: How to maintain the socket connection in open status and send datas repeatedly


  • Subject: Re: How to maintain the socket connection in open status and send datas repeatedly
  • From: Jim Luther <email@hidden>
  • Date: Wed, 26 Aug 2009 10:05:16 -0700

The current IETF RFC for "Hypertext Transfer Protocol -- HTTP/1.1" is at: <http://www.ietf.org/rfc/rfc2616.txt>

The IETF is revisiting HTTP/1.1 with the Hypertext Transfer Protocol Bis (httpbis) working group. You can see the work they are doing at: <http://tools.ietf.org/wg/httpbis/ >

I also recommend the O'Reilly book "HTTP: The Definitive Guide" (search for "ISBN 10: 1-56592-509-2 or ISBN 13: 9781565925090" to find it) for a "non-spec" explanation of HTTP.

- Jim

On Aug 25, 2009, at 10:25 PM, Jeremy Wyld wrote:

By default HTTP 1.0 closes connections. There are many books and articles covering this subject. The RFCs are readily available for download. I suggest reading them and making sure you are very familiar with them if you are going to go down the path of implementing it yourself.

jeremy

On Aug 25, 2009, at 10:20 PM, Ramesh P <email@hidden> wrote:

Thanks Jeremy and Jens for your quick responses.
I have modified my code to NSStream and removed the connection:close from my http url.
Here is my code:


-(void)startSocket{
NSHost *host = [NSHost hostWithName:@"192.168.1.77"];
if(host) {
[NSStream getStreamsToHost:host port:8080 inputStream:&iStream outputStream:&oStream] ;
[self openStream];
NSLog(@"input stream %@", nil==iStream?@"was not created":@"was created");
NSLog(@"output stream %@", nil==oStream?@"was not created":@"was created");
}
}


- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent) eventCode {
switch (eventCode) {
case NSStreamEventHasBytesAvailable:
{
NSLog(@"Bytes Available");
if ( !mdata ) {
mdata = [[NSMutableData data] retain];
}
uint8_t buf[1024];
unsigned int len = 0;
while ([iStream hasBytesAvailable]){
len = [(NSInputStream *)stream read:buf maxLength: 1024];
if (len ) {
[mdata appendBytes:(const void *)buf length:len];
NSString *response=[[NSString alloc] initWithData:mdata encoding:NSASCIIStringEncoding];
NSLog(@"%@",response);
}else {
NSLog(@"No Buffer!");
}
}
mdata=nil;
break;
}
case NSStreamEventErrorOccurred:
{
NSError *theError = [stream streamError];
NSAlert *theAlert = [[NSAlert alloc] init];
[theAlert setMessageText:@"Error reading stream!"];
[theAlert setInformativeText:[NSString stringWithFormat:@"Error %i: %@",[theError code], [theError localizedDescription]]];
[theAlert addButtonWithTitle:@"OK"];
[theAlert runModal];
[stream close];
[stream release];
break;
}
case NSStreamEventEndEncountered:
{
[self closeStream];
break;
}
case NSStreamEventNone:
{
break;
}
case NSStreamEventOpenCompleted:{
break;
}
case NSStreamEventHasSpaceAvailable:
{
NSLog(@"Space Available");
NSString * str = [NSString stringWithFormat: @"GET / filereflex/xp.html?user=demo&mac=%@&systemname=macintosh HTTP/1.0\r \n\r\nContent-Length: 100000000000\r\n\r\n",[GetPrimaryMacAddress getmacaddress]];
const uint8_t * rawstring =(const uint8_t *)[str UTF8String];
NSInteger bytesWritten=[oStream write:rawstring maxLength:strlen(rawstring)];
if(bytesWritten==-1)
NSLog(@"written null");
else
NSLog(@"written successfully");


            [stream close];
            break;
        }
        default:
            break;
    }
}

-(void)openStream{
[iStream retain];
[oStream retain];
[iStream setDelegate:self];
[oStream setDelegate:self];
[iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[iStream open];
[oStream open];
}


-(void)closeStream{
[iStream close];
[oStream close];
[iStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[oStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[iStream setDelegate:nil];
[oStream setDelegate:nil];
[iStream release];
[oStream release];
iStream=nil;
oStream=nil;
}


Again I am facing the same problem. Writing and reading the data successfully at first time and entering to NSStreamEventEndEncountered event. I am not able to maintain the connection in opened status.
Here is my output:


2009-08-26 10:47:46.106 FileReflexMacClient[508:10b] input stream was created
2009-08-26 10:47:46.108 FileReflexMacClient[508:10b] output stream was created
2009-08-26 10:47:46.118 FileReflexMacClient[508:10b] Space Available
2009-08-26 10:47:46.122 FileReflexMacClient[508:10b] written successfully
2009-08-26 10:47:46.163 FileReflexMacClient[508:10b] Bytes Available
2009-08-26 10:47:46.163 FileReflexMacClient[508:10b] HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=E757EA68C6CAD6BA0FED9C70E8ACD05C; Path=/ filereflex
Date: Wed, 26 Aug 2009 05:10:35 GMT
Connection: close
BEGIN
2009-08-26 10:47:46.330 FileReflexMacClient[508:10b] Bytes Available
2009-08-26 10:47:46.331 FileReflexMacClient[508:10b] No Buffer!
2009-08-26 10:47:46.332 FileReflexMacClient[508:10b] end


Help me in this.
Thanks,
Ramesh.P

>>On Tue, Aug 25, 2009 at 10:31 PM, Jens Alfke <email@hidden> wrote:
>>This isn't directly related to the bug in your code (which Jeremy's already pointed out), but you >>could use the NSStream class instead of the CFStream API and make your code a lot simpler >>& cleaner.


—Jens


On Tue, Aug 25, 2009 at 8:25 PM, Jeremy Wyld <email@hidden> wrote:
First off, your HTTP request has a "Connection: Close" which is telling the server to close it.


jeremy


On Aug 25, 2009, at 3:04 AM, email@hidden wrote:

Hi all,
I need to connect the server using socket connection and need to send the heartbeat at particular time intervals in the same opened connection. I created the socket connection using the CFSocket. Here is my code.
#import "CFSocketController.h"
#import "GetPrimaryMacAddress.h"
@implementation CFSocketController
NSMutableData *mdata;


static void ReadStreamClientCallBack(CFReadStreamRef stream, CFStreamEventType type, void *clientCallBackInfo ) {
NSLog(@"entering end");
switch (type)
{
case kCFStreamEventEndEncountered:
{
CFReadStreamClose(stream);
break;
}
case kCFStreamEventErrorOccurred:
break;
case kCFStreamEventHasBytesAvailable:
{
if ( !mdata ) {
mdata = [[NSMutableData data] retain];
}
uint8_t buf[1024];
unsigned int len = 0;
while([stream hasBytesAvailable]){
len = [(NSInputStream *)stream read:buf maxLength:1024];
NSLog(@"length:%@",[[NSString alloc]initWithFormat:@"%i",len]);
if (len ) {
[mdata appendBytes:(const void *)buf length:len];
NSString *response=[[NSString alloc]initWithData:mdata encoding:NSASCIIStringEncoding];
NSLog(@"%@",response);
}else {
NSLog(@"No Buffer!");
}
mdata=nil;
}
break;
}
case kCFStreamEventNone:
break;
case kCFStreamEventOpenCompleted:
break;
}
}


static void WriteStreamClientCallBack( CFWriteStreamRef stream, CFStreamEventType type, void *clientCallBackInfo ) {
switch (type)
{
case kCFStreamEventEndEncountered:
{
NSLog(@"end o");
CFWriteStreamClose(stream);
break;
}
case kCFStreamEventErrorOccurred:
break;
case kCFStreamEventCanAcceptBytes:
{
NSString * reqStr = [NSString stringWithFormat: @"GET /filereflex/ xp.html?user=demo&mac=%@&systemname=macintosh HTTP/1.0\r\n\r \nConnection: Close\r\nContent-Length: 100000000000\r\n\r\n", [GetPrimaryMacAddress getmacaddress]];
const UInt8 *rawstring = (const UInt8 *)[reqStr UTF8String];
CFWriteStreamWrite(stream, rawstring, strlen((char *)rawstring));
}
case kCFStreamEventNone:
break;
case kCFStreamEventOpenCompleted:
break;
}
}



- (void)connect{
NSString *iHostname = [[NSString alloc] initWithString:@"192.168.1.77"];
NSString *iPort = [[NSString alloc]initWithString:@"8080"];


CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
static const CFOptionFlags kReadNetworkEvents = kCFStreamEventEndEncountered |
kCFStreamEventErrorOccurred |
kCFStreamEventHasBytesAvailable |
kCFStreamEventOpenCompleted |
kCFStreamEventNone;
static const CFOptionFlags kWriteNetworkEvents = kCFStreamEventEndEncountered |
kCFStreamEventErrorOccurred |
kCFStreamEventCanAcceptBytes |
kCFStreamEventOpenCompleted |
kCFStreamEventNone;
CFStreamClientContext ctxt = {0,(void*)NULL,NULL,NULL,NULL};
CFHostRef hostRef = CFHostCreateWithName(kCFAllocatorDefault, (CFStringRef)iHostname);


CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault, hostRef, [iPort intValue],
&readStream, &writeStream);
//CFSocketStreamPairSetSecurityProtocol(readStream, writeStream, kCFStreamSocketSecurityNone);


CFReadStreamSetClient(readStream, kReadNetworkEvents, ReadStreamClientCallBack, &ctxt);
CFWriteStreamSetClient(writeStream, kWriteNetworkEvents, WriteStreamClientCallBack, &ctxt);
CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
CFWriteStreamScheduleWithRunLoop(writeStream, CFRunLoopGetCurrent (), kCFRunLoopDefaultMode);
CFReadStreamOpen(readStream);
CFWriteStreamOpen(writeStream);
}


@end


Using the above code i can write and read the data only once. After that it automatically calls the kCFStreamEventEndEncountered event and closing the connection. But i need the connection should remains open always and need to send the data at particular intervals. How can i achieve this? Is there anything related to my server?
Thanks in advance.
Ramesh.P _______________________________________________
Do not post admin requests to the list. They will be ignored.
Macnetworkprog mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden


_______________________________________________
Do not post admin requests to the list. They will be ignored.
Macnetworkprog mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden

_______________________________________________ Do not post admin requests to the list. They will be ignored. Macnetworkprog mailing list (email@hidden) Help/Unsubscribe/Update your Subscription: This email sent to email@hidden
References: 
 >How to maintain the socket connection in open status and send datas repeatedly (From: email@hidden)
 >Re: How to maintain the socket connection in open status and send datas repeatedly (From: Jeremy Wyld <email@hidden>)
 >Re: How to maintain the socket connection in open status and send datas repeatedly (From: Ramesh P <email@hidden>)
 >Re: How to maintain the socket connection in open status and send datas repeatedly (From: Jeremy Wyld <email@hidden>)

  • Prev by Date: Re: Nonlinear limits on the number or rate of NSURLConnections
  • Next by Date: Re: Nonlinear limits on the number or rate of NSURLConnections
  • Previous by thread: Re: How to maintain the socket connection in open status and send datas repeatedly
  • Next by thread: Re: How to maintain the socket connection in open status and send datas repeatedly
  • Index(es):
    • Date
    • Thread