简体   繁体   中英

iOS CFSocket and C Socket

in iOS CFSocket the way handle callback function is as followed

      void receiveData(CFSocketRef s, 
                         CFSocketCallBackType type, 
                         CFDataRef address, 
                         const void *data, 
                         void *info)
{

}


int main ()
{
    CFSocketRef s = CFSocketCreate(NULL, PF_INET, 
                                            SOCK_STREAM, IPPROTO_TCP, 
                                            kCFSocketDataCallBack, 
                                            receiveData, 
                                            NULL);
    struct sockaddr_in      sin; 
    struct hostent           *host;

    host = gethostbyname("localhost");      
    memset(&sin, 0, sizeof(sin));
    memcpy(&(sin.sin_addr), host->h_addr,host->h_length); 
    sin.sin_family = AF_INET;
    sin.sin_port = htons(888);

    CFDataRef address, data;
    UInt8 message[] = "Hello world";
    CFRunLoopSourceRef source;

    address = CFDataCreate(NULL, (UInt8 *)&sin, sizeof(sin));
    data = CFDataCreate(NULL, message, sizeof(message));

    CFSocketConnectToAddress(s, address, 0);
    CFSocketSendData(s, NULL, data, 0);

}

in CFSocket when we do a CFSocketCreate we put the callback function in the SocketCreate function.

But for C Code the Socket and read from Socket is as followed.

 sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
    error("ERROR connecting");
printf("Please enter the message: ");
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(sockfd,buffer,strlen(buffer));
if (n < 0) 
     error("ERROR writing to socket");
bzero(buffer,256);
n = read(sockfd,buffer,255);

I don't how to implement the callback read function inside the C Code. The callback function would be implemented every time something come into the buffer.

As you noted BSD sockets is not callback based, you need to poll from read to receive new data. You can call this periodically on the main thread or create a custom thread for reading data repeatedly.

CFSocket wraps BSD sockets at a higher level. It has some nice features, I believe that it automatically handles threading, and sleeps the thread until data is received. Reimplemnenting these features would not be a trivial process.

Good resources:

http://beej.us/guide/bgnet/

BSD Sockets - How to use non-blocking sockets?

http://man7.org/linux/man-pages/man2/poll.2.html

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM