• 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: Using NSFileHandle for server socket communication
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Using NSFileHandle for server socket communication


  • Subject: Re: Using NSFileHandle for server socket communication
  • From: "Mark Walker" <email@hidden>
  • Date: Sat, 13 Dec 2003 11:21:26 -0700

I appreciate the pointers. Now I have something to sink my teeth into.

Many thanks,

- mark

On Dec 12, 2003, at 2:04 AM, Alastair Houghton wrote:

On 12 Dec 2003, at 01:18, Mark Walker wrote:

-(void)startClient
{
NSLog(@"startClient called");

NSSocketPort *sockPort;
sockPort = [[NSSocketPort alloc] initRemoteWithTCPPort:12345
host:@"mark-walkers-computer"];

NSSocketPort is really for Distributed Objects. Whilst this will work, and is an interesting short-cut, I don't think it's really the right way to go about things. Try something like:

int sockFD = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in sin;
struct hostent *he;

if (sockFD < 0) {
NSLog (@"%s\n", strerror (errno));
return;
}

sin.sin_family = AF_INET;
sin.sin_port = htons (12345);

he = gethostbyname ("mark-walkers-computer");
if (!he) {
NSLog (@"%s\n", hsterror (h_errno));
close (sockFD);
return;
}
memcpy(&sin.sin_addr, he->h_addr, 4);

if (connect (sockFD, (struct sockaddr *)&sin, sizeof (sin)) < 0) {
NSLog (@"%s\n", strerror (errno));
close (sockFD);
return;
}

You should get a fairly specific error message if something goes awry.

There are plenty of books that will explain how to use the sockets APIs; you should probably get one of them to read.

Note also that in the above code, the gethostbyname() function and the connect() function can both block for some time trying to resolve the hostname and then contact the host.

You could also consider using the CFSocket or CFStream APIs to manage your socket for you; CFStream in particular has a function CFStreamCreatePairWithSocketToHost(), which looks pretty useful. (Also, CFStream has a Cocoa counterpart, NSStream, in Panther.) The major benefit of CFSocket/CFStream/NSStream is that they work through the run-loop and can do non-blocking *writes* as well as non-blocking reads, which, as you have probably noticed, NSFileHandle cannot.

Kind regards,

Alastair.
_______________________________________________
cocoa-dev mailing list | email@hidden
Help/Unsubscribe/Archives: http://www.lists.apple.com/mailman/listinfo/cocoa-dev
Do not post admin requests to the list. They will be ignored.

References: 
 >Using NSFileHandle for server socket communication (From: "Mark Walker" <email@hidden>)
 >Re: Using NSFileHandle for server socket communication (From: Alastair Houghton <email@hidden>)

  • Prev by Date: NSArray NSDictionary Tree Q.
  • Next by Date: Re: http proxy config
  • Previous by thread: Re: Using NSFileHandle for server socket communication
  • Next by thread: Sheets trouble.... kinda odd.
  • Index(es):
    • Date
    • Thread