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 }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
useEffect 안에서의 리턴??인스타 클론하다가 또 다시 배운 기능이다. useEffect안에서 리턴을 한다?? 찾아보니 componentWillUnmount와 같은 효과를 낸다는 것이다. useEffect안에서 return을 하면 정리의 개념으...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.