我做一个client的socket连接,
使用CFSocketCreate创建socket连接,
CFSocektConnectToAddress建立连接然后分别创建CFReadStream和CFWriteStream
使用CFStreamCreatePairWithSocket把输入输出流关联到socket上
CFReadStreamOpen和CFWriteStreamOpen打开流
然后执行CFReadStreamScheduleWithRunLoop和CFWriteStreamScheduleWithRunLoop但是当我使用CFReadStreamRead或CFWriteStreamWrite进行读写的时候,会block掉.
使用CFWriteStreamCanAcceptBytes和CFReadStreamHasBytesAvailable查看readStream和writeStream状态
返回的都是false,说明他们不能被读写.请问是什么原因呀 socket = CFSocketCreate(kCFAllocatorDefault,
PF_INET, SOCK_STREAM, IPPROTO_TCP,
0, NULL, NULL);
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_len = sizeof(sin);
sin.sin_family = AF_INET;
sin.sin_port = htons(****); // port we want to connect on
sin.sin_addr.s_addr = inet_addr("***.***.***.****");
CFDataRef address = CFDataCreate(NULL,(unsigned char*)&sin,sizeof(sin));
CFTimeInterval timeout = 10 ; // how long to wait before returning
CFSocketError e = CFSocketConnectToAddress(socket,address,timeout);
if(e != kCFSocketSuccess )
{
NSLog(@"Could not bind to address");
}
else
{
NSLog(@"Bind to address succeeded");
char joke[] = "Why did the chicken cross the road?";
CFDataRef data_test = CFDataCreate(NULL, (unsigned char*)&joke, sizeof(joke));
CFSocketError err = CFSocketSendData(socket, address, data_test, 10);
if (err == kCFSocketSuccess) {
NSLog(@"Send Succeeded!");
}
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
//Get readStream & writeStream
CFSocketNativeHandle sock = *(CFSocketNativeHandle *) socket;
CFStreamCreatePairWithSocket(kCFAllocatorDefault,
sock,
&readStream,
&writeStream);
//Open readStream & writeStream
if (CFReadStreamOpen (readStream))
{
NSLog(@"CFReadStreamOpen Succeeded");
}
else
{
NSLog(@"CFReadStreamOpen Failed");
}
if (CFWriteStreamOpen (writeStream))
{
NSLog(@"CFWriteStreamOpen Succeeded");
}
else
{
NSLog(@"CFWriteStreamOpen Failed");
}
//Schedule the stream into a run loop
CFReadStreamScheduleWithRunLoop(readStream,
CFRunLoopGetCurrent(),
kCFRunLoopCommonModes);
CFWriteStreamScheduleWithRunLoop(writeStream,
CFRunLoopGetCurrent(),
kCFRunLoopCommonModes);
//Assigns a client to receive callback for the stream while in the run loop.
if (CFReadStreamSetClient (readStream,
kCFStreamEventOpenCompleted |
kCFStreamEventHasBytesAvailable |
kCFStreamEventCanAcceptBytes |
kCFStreamEventErrorOccurred |
kCFStreamEventEndEncountered,
mySocketReadCallBack,
NULL ) )
{
NSLog(@"Set read callBack Succeeded");
}
else
{
NSLog(@"Set read callBack Failed");
}
if (CFWriteStreamSetClient (writeStream,
kCFStreamEventOpenCompleted |
kCFStreamEventHasBytesAvailable |
kCFStreamEventCanAcceptBytes |
kCFStreamEventErrorOccurred |
kCFStreamEventEndEncountered,
mySocketWriteCallBack,
NULL) )
{
NSLog(@"Set write callBack Succeeded");
}
else
{
NSLog(@"Set write callBack Failed");
}
NSLog(@"CFReadStreamGetStatus=%d", CFReadStreamGetStatus(readStream));
NSLog(@"CFWriteStreamGetStatus=%d", CFWriteStreamGetStatus(writeStream));
//Write to socket
char data[] = "Beware the Jabberwocky.\n";
CFIndex bytes_sent = 0;
int send_len = 0;
//if (!CFWriteStreamCanAcceptBytes(writeStream))
//{
// NSLog(@"writeStream can not be written to");
//}
//else
//{
// NSLog(@"writeStream can be written to");
/*
NSLog(@"before send");
bytes_sent = CFWriteStreamWrite(writeStream,
data + send_len,
(strlen(data)+1) - send_len);
if (bytes_sent < 0)
{
NSLog(@"send failed!");
}
else
{
NSLog(@"send succeeded!");
}
*/
// send_len += bytes_sent;
//}
//Write end
//Read from socket
//if (!CFReadStreamHasBytesAvailable(readStream))
//{
// NSLog(@"readStream has not byte available");
//}
//else
//{
NSLog(@"before read");
char buffer[1024];
CFIndex bytes_recvd;
int recv_len = 0;
memset(buffer, 0, sizeof(buffer));
while (!strchr(buffer, '\n') && recv_len < sizeof(buffer)) {
bytes_recvd = CFReadStreamRead(readStream,
(unsigned char*)(buffer + recv_len),
sizeof(buffer) - recv_len);
if (bytes_recvd < 0) {
//Error has occurred. Close the socket and return.
}
recv_len += bytes_recvd;
}
NSLog(@"recv_len=%d", recv_len);
//}
//Read over }
CFSocketInvalidate(socket) ;
CFRelease(address);
CFRelease(socket);
使用CFSocketCreate创建socket连接,
CFSocektConnectToAddress建立连接然后分别创建CFReadStream和CFWriteStream
使用CFStreamCreatePairWithSocket把输入输出流关联到socket上
CFReadStreamOpen和CFWriteStreamOpen打开流
然后执行CFReadStreamScheduleWithRunLoop和CFWriteStreamScheduleWithRunLoop但是当我使用CFReadStreamRead或CFWriteStreamWrite进行读写的时候,会block掉.
使用CFWriteStreamCanAcceptBytes和CFReadStreamHasBytesAvailable查看readStream和writeStream状态
返回的都是false,说明他们不能被读写.请问是什么原因呀 socket = CFSocketCreate(kCFAllocatorDefault,
PF_INET, SOCK_STREAM, IPPROTO_TCP,
0, NULL, NULL);
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_len = sizeof(sin);
sin.sin_family = AF_INET;
sin.sin_port = htons(****); // port we want to connect on
sin.sin_addr.s_addr = inet_addr("***.***.***.****");
CFDataRef address = CFDataCreate(NULL,(unsigned char*)&sin,sizeof(sin));
CFTimeInterval timeout = 10 ; // how long to wait before returning
CFSocketError e = CFSocketConnectToAddress(socket,address,timeout);
if(e != kCFSocketSuccess )
{
NSLog(@"Could not bind to address");
}
else
{
NSLog(@"Bind to address succeeded");
char joke[] = "Why did the chicken cross the road?";
CFDataRef data_test = CFDataCreate(NULL, (unsigned char*)&joke, sizeof(joke));
CFSocketError err = CFSocketSendData(socket, address, data_test, 10);
if (err == kCFSocketSuccess) {
NSLog(@"Send Succeeded!");
}
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
//Get readStream & writeStream
CFSocketNativeHandle sock = *(CFSocketNativeHandle *) socket;
CFStreamCreatePairWithSocket(kCFAllocatorDefault,
sock,
&readStream,
&writeStream);
//Open readStream & writeStream
if (CFReadStreamOpen (readStream))
{
NSLog(@"CFReadStreamOpen Succeeded");
}
else
{
NSLog(@"CFReadStreamOpen Failed");
}
if (CFWriteStreamOpen (writeStream))
{
NSLog(@"CFWriteStreamOpen Succeeded");
}
else
{
NSLog(@"CFWriteStreamOpen Failed");
}
//Schedule the stream into a run loop
CFReadStreamScheduleWithRunLoop(readStream,
CFRunLoopGetCurrent(),
kCFRunLoopCommonModes);
CFWriteStreamScheduleWithRunLoop(writeStream,
CFRunLoopGetCurrent(),
kCFRunLoopCommonModes);
//Assigns a client to receive callback for the stream while in the run loop.
if (CFReadStreamSetClient (readStream,
kCFStreamEventOpenCompleted |
kCFStreamEventHasBytesAvailable |
kCFStreamEventCanAcceptBytes |
kCFStreamEventErrorOccurred |
kCFStreamEventEndEncountered,
mySocketReadCallBack,
NULL ) )
{
NSLog(@"Set read callBack Succeeded");
}
else
{
NSLog(@"Set read callBack Failed");
}
if (CFWriteStreamSetClient (writeStream,
kCFStreamEventOpenCompleted |
kCFStreamEventHasBytesAvailable |
kCFStreamEventCanAcceptBytes |
kCFStreamEventErrorOccurred |
kCFStreamEventEndEncountered,
mySocketWriteCallBack,
NULL) )
{
NSLog(@"Set write callBack Succeeded");
}
else
{
NSLog(@"Set write callBack Failed");
}
NSLog(@"CFReadStreamGetStatus=%d", CFReadStreamGetStatus(readStream));
NSLog(@"CFWriteStreamGetStatus=%d", CFWriteStreamGetStatus(writeStream));
//Write to socket
char data[] = "Beware the Jabberwocky.\n";
CFIndex bytes_sent = 0;
int send_len = 0;
//if (!CFWriteStreamCanAcceptBytes(writeStream))
//{
// NSLog(@"writeStream can not be written to");
//}
//else
//{
// NSLog(@"writeStream can be written to");
/*
NSLog(@"before send");
bytes_sent = CFWriteStreamWrite(writeStream,
data + send_len,
(strlen(data)+1) - send_len);
if (bytes_sent < 0)
{
NSLog(@"send failed!");
}
else
{
NSLog(@"send succeeded!");
}
*/
// send_len += bytes_sent;
//}
//Write end
//Read from socket
//if (!CFReadStreamHasBytesAvailable(readStream))
//{
// NSLog(@"readStream has not byte available");
//}
//else
//{
NSLog(@"before read");
char buffer[1024];
CFIndex bytes_recvd;
int recv_len = 0;
memset(buffer, 0, sizeof(buffer));
while (!strchr(buffer, '\n') && recv_len < sizeof(buffer)) {
bytes_recvd = CFReadStreamRead(readStream,
(unsigned char*)(buffer + recv_len),
sizeof(buffer) - recv_len);
if (bytes_recvd < 0) {
//Error has occurred. Close the socket and return.
}
recv_len += bytes_recvd;
}
NSLog(@"recv_len=%d", recv_len);
//}
//Read over }
CFSocketInvalidate(socket) ;
CFRelease(address);
CFRelease(socket);
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货