关于不能socket不能和服务器通讯问题

charllezhou 2011-01-19 09:13:03

#import "SocketController.h"
#import <netinet/in.h>
#import <sys/socket.h>
#import <arpa/inet.h>
#import <CFNetwork/CFSocketStream.h>
#define PORT 8888
#define IPADDRESS "192.168.11.43"
static void socketCallBack(CFSocketRef s,CFSocketCallBackType type,CFDataRef address,const void *dataIn,void *info){

SocketController *socketController = (SocketController *)info;
//SocketController *socketController = [[SocketController alloc]init];
if (flag=YES) {
NSLog(@"Hello7");
if(type == kCFSocketConnectCallBack){

if(dataIn){
SInt32 error = *((SInt32*)dataIn);
NSLog(@"error code %d",error);
}else {
type = kCFSocketDataCallBack;
}
}
if(type == kCFSocketDataCallBack){

CFSocketNativeHandle nativeSocketHandle = *(CFSocketNativeHandle *)info;
CFReadStreamRef readStream = nil;
CFWriteStreamRef writeStream = nil;
CFStreamCreatePairWithSocket(kCFAllocatorDefault, nativeSocketHandle,          &readStream,        &writeStream);

if(readStream && writeStream){

CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);



inStream = (NSInputStream *)readStream;
[inStream retain];
[inStream setDelegate:[socketController self]];
[inStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[inStream open];

outStream = (NSOutputStream *)writeStream;
[outStream retain];
[outStream setDelegate:[socketController self]];
[outStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[outStream open];


//发送数据向服务器
uint8_t message;
NSInteger bytesWritten;
if([outStream hasSpaceAvailable]){
bytesWritten=[outStream write:(const uint8_t *)message maxLength:sizeof(const uint8_t)];

}

NSLog(@"byteWritten=%d",bytesWritten);
//if(-1 == bytesWritten) NSLog(@"error is:%d",);
//else {
//NSLog(@"Print string is:%d",buf);
//}
}/*else {
//close(nativeSocketHandle);
NSLog(@"Hello12");
}*/
if (readStream) {
CFRelease(readStream);
}
if(writeStream) {
CFRelease(writeStream);
}
}
}
}

@implementation SocketController
- (CFSocketRef)initSocket {

CFSocketContext context = {
.version = 0,
.info = self,
.retain = nil,
.release = nil,
.copyDescription = nil
};
//NSLog(@"Hello4");
CFSocketRef socket = CFSocketCreate(
kCFAllocatorDefault,
PF_INET,
SOCK_STREAM,
IPPROTO_TCP,
kCFSocketDataCallBack^kCFSocketConnectCallBack,
socketCallBack,//回调函数 
&context
);

uint16_t port = PORT;

struct sockaddr_in addr4;

memset(&addr4,0,sizeof(addr4));
addr4.sin_family = AF_INET;
addr4.sin_len = sizeof(addr4);
addr4.sin_port = htons(port);

const char* ipAddress = IPADDRESS;

inet_aton(ipAddress, &addr4.sin_addr);

NSData *address = [NSData dataWithBytes:&addr4 length:sizeof(addr4)];
NSLog(@"Hello5");

CFSocketConnectToAddress(socket, (CFDataRef)address, -1);
flag=YES;

CFRunLoopSourceRef source;
source = CFSocketCreateRunLoopSource(nil, socket, 1);
CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
CFRelease(source);
NSLog(@"Hello6");
//NSLog(@"function address is:%d",&socketCallBack);
//NSLog(@"socket address is:%d",&socket);
//NSLog(@"value is:%d",kCFSocketDataCallBack^kCFSocketConnectCallBack);
return socket;

}
...全文
306 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
linux_fay 2011-03-03
  • 打赏
  • 举报
回复
我觉得是不是你的ip或者端口设错了呀?http://topic.csdn.net/u/20110303/10/e0f15741-8d92-4511-bd01-0bbe4b19fd1c.html?13834 帮忙看看,谢谢!

29,030

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧