在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和read from 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代码中实现回调读取函数。每次有东西进入缓冲区时,就会实现回调函数。
发布于 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
https://stackoverflow.com/questions/17912972
复制相似问题