gpt4 book ai didi

iOS CFSocket 和 C 套接字

转载 作者:太空宇宙 更新时间:2023-11-04 03:54:26 27 4
gpt4 key购买 nike

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

      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 和从 Socket 读取如下。

 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 代码中实现回调读取函数。每次有东西进入缓冲区时都会执行回调函数。

最佳答案

如您所述,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

关于iOS CFSocket 和 C 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17912972/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com