IOS에서 Socket의 일반적인 처리

001    /* Send TCP transport data packet */    
002    void    
003    tcp_data_send(NSOutputStream *os, void *data, int length)    
004    {    
005        int sent, total = 0;    
006        while (total < length) {    
007            sent = [os write:data + total  maxLength:length - total];    
008            if (sent < 0) {    
009                error("send: %s
", strerror(errno));     010                return;     011            }     012            total += sent;     013        }     014    }     015     016    /* Receive TCP transport data packet */     017    STREAM     018    tcp_data_recv(NSInputStream *is, void *data, uint32 length)     019    {     020        int rcvd = 0;     021     022        while (length > 0)     023        {     024            rcvd = [is read:data maxLength:length];     025            if (rcvd < 0)     026            {     027                error("recv: %s
", strerror(errno));     028                return NULL;     029            }     030            else if (rcvd == 0)     031            {     032                error("Connection closed
");     033                return NULL;     034            }     035     036            data += rcvd;     037            length -= rcvd;     038        }     039     040        return data;     041    }     042     043    /* Establish a TCP connection */     044    BOOL     045    tcp_establist_connect(NSInputStream *is, NSOutputStream *os, const char *server, int tcpPort)     046    {     047        is = nil;     048        os = nil;     049        CFReadStreamRef cfis = nil;     050        CFWriteStreamRef cfos = nil;     051        volatile ConnectionErrorCode errorCode;     052     053        CFStreamCreatePairWithSocketToHost(NULL,     054                                           CFStringCreateWithCString(NULL, server, kCFStringEncodingASCII),     055                                           tcpPort,     056                                           &cfis,     057                                           &cfos);     058     059        is = (NSInputStream *)cfis;     060        os = (NSOutputStream *)cfos;     061     062        if (is == nil || os == nil)     063        {     064            errorCode = ConnectionErrorGeneral;     065            return False;     066        }     067     068        [is open];     069        [os open];     070     071        // Wait until the output socket can be written to (this is the alternative to     072        //  letting NSOutputStream block later when we do the first write:)     073        time_t start = time(NULL);     074        int timedOut = False;     075        while (![os hasSpaceAvailable] && !timedOut && errorCode != ConnectionErrorCanceled)     076        {     077            usleep(1000); // sleep for a millisecond     078            timedOut = (time(NULL) - start > TIMOUT_LENGTH);     079        }     080     081        if (timedOut == True)     082        {     083            errorCode = ConnectionErrorTimeOut;     084            return False;     085        }     086        else if (errorCode == ConnectionErrorCanceled)     087        {     088            return False;     089        }     090     091        [is setDelegate:self];     092        [is scheduleInRunLoop:inputRunLoop forMode:NSDefaultRunLoopMode];     093     094        return True;     095    }     096     097    char *     098    tcp_get_address(NSOutputStream *os)     099    {     100        CFWriteStreamRef stream;     101        CFSocketNativeHandle socket;     102        CFDataRef data;     103     104        stream = (CFWriteStreamRef)os;     105        data = CFWriteStreamCopyProperty(stream, kCFStreamPropertySocketNativeHandle);     106        socket = *(CFSocketNativeHandle *)CFDataGetBytePtr(data);     107     108        char *ipaddr = malloc(32);     109        struct sockaddr_in sockaddr;     110        socklen_t len = sizeof(sockaddr);     111        if (getsockname(socket, (struct sockaddr *) &sockaddr, &len) == 0)     112        {     113            unsigned char *ip = (unsigned char *) &sockaddr.sin_addr;     114            sprintf(ipaddr, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);     115        }     116        else     117            strcpy(ipaddr, "127.0.0.1");     118        return ipaddr;     119    }     120     121    // Invoked on incoming data arrival, starts the processing of incoming packets     122    - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)streamEvent     123    {     124        //...     125    }

좋은 웹페이지 즐겨찾기