クライアント側のプログラミング

クライアント側は待つ必要はない.
そのまま,サーバに接続し,それがダメならダメでしたと報告すればいいだけなのだ.
それでは,待つところまで.

if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
return;
struct sockaddr_in server_addr;
struct hostent* server_host;
// clear with zero
bzero((char *)&server_addr, sizeof(server_addr));
// initialize
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
// get host information
server_host = gethostbyname("localhost");
bcopy((char *)server_host->h_addr, (char *)&server_addr.sin_addr.s_addr, server_host->h_length);
// try to connetct
if(connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0)
printf("error?n");
free(server_host);

これでサーバと接続することができる.

Cocoa・・・NSFileHandle

次にCocoaでサクっとイベントをうけとりたいときには,以下のようにNSFileHandleを初期化する.

if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
return;
// make file handle
NSFileHandle *fileHandle = [[NSFileHandle alloc] initWithFileDescriptor: sockfd];
struct sockaddr_in server_addr;
struct hostent* server_host;
// clear with zero
bzero((char *)&server_addr, sizeof(server_addr));
// initialize
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
// get host information
server_host = gethostbyname("localhost");
bcopy((char *)server_host->h_addr, (char *)&server_addr.sin_addr.s_addr, server_host->h_length);
// try to connetct
if(connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0)
printf("error?n");
free(server_host);
// set notification from filehandle
[[NSNotificationCenter defaultCenter] addObserver: self
selector: @selector(receiveMessage:)
name: NSFileHandleReadCompletionNotification
object: fileHandle];
// set notify
[fileHandle readInBackgroundAndNotify];

これでNSFileHandleを利用して,サーバと通信することができる.
この場合,データを受け取ったときにreceiveMessageが呼び出されることになる.

ソースコード

http://code.google.com/p/sonson-code/source/browse/#svn/trunk/mac/socket