首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS CFSocket和C套接字

iOS CFSocket和C套接字
EN

Stack Overflow用户
提问于 2013-07-29 05:15:49
回答 1查看 3.7K关注 0票数 1

在iOS CFSocket中,处理回调函数的方法如下

代码语言:javascript
复制
      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);

}

在CFSocket中,当我们执行CFSocketCreate时,我们将回调函数放在SocketCreate函数中。

但是对于C代码,Socket和read from Socket如下所示。

代码语言:javascript
复制
 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);

我不知道如何在C代码中实现回调读取函数。每次有东西进入缓冲区时,就会实现回调函数。

EN

回答 1

Stack Overflow用户

发布于 2013-07-29 14:05:25

正如你提到的,BSD套接字不是基于回调的,你需要从read轮询来接收新数据。您可以在主线程上定期调用它,也可以创建一个自定义线程来重复读取数据。

CFSocket在更高的层次上包装了BSD套接字。它有一些很好的特性,我相信它会自动处理线程,并让线程休眠,直到收到数据。重新实现这些功能将不是一个微不足道的过程。

好的资源:

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

BSD Sockets - How to use non-blocking sockets?

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17912972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档