在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