Функция CFReadStreamOpen не сериализует и не отправляет HTTP-запрос - PullRequest
2 голосов
/ 16 декабря 2010

Я хотел попробовать пример кода, приведенный в руководстве по программированию CFNetwork в подразделе «Связь с HTTP-серверами».Я попробовал тот же пример кода, но проблема в том, что он просто открывает поток, который не отправляет HTTP-запрос.Точный код, который я написал в моем приложении, как показано ниже.Согласно документации, когда я вызываю функцию CFReadStreamOpen, она сериализуется и отправляет http-запрос.Но когда я вижу пакеты в Wireshark.Я вижу только три TCP-пакета, которые на самом деле являются пакетами TCP-соединения с трехсторонним рукопожатием.Так в чем же проблема ????

CFStringRef bodyData = CFSTR("mydata is here"); // Usually used for POST data

CFStringRef headerFieldName = CFSTR("X-My-Favorite-Field");
CFStringRef headerFieldValue = CFSTR("Dreams");

CFStringRef url = CFSTR("http://www.darshan.com");
CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, url, NULL);

CFStringRef requestMethod = CFSTR("POST");
CFHTTPMessageRef myRequest =
    CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, myURL,
                               kCFHTTPVersion1_1);

CFHTTPMessageSetBody(myRequest, bodyData);
CFHTTPMessageSetHeaderFieldValue(myRequest, headerFieldName, headerFieldValue);
CFReadStreamRef myReadStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest);

CFReadStreamOpen(myReadStream);

1 Ответ

2 голосов
/ 18 октября 2011

вот решение, когда вы создаете CFHTTPMessage, вы должны сериализовать его (например, в моем коде я использовал UTF8), а затем записать на сервер.

вот мой пример кода, вы можете следовать этому примеру, он прекрасно работает:

CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault,CFSTR("POST"), myURL, kCFHTTPVersion1_1);  
    CFHTTPMessageSetHeaderFieldValue(myRequest, CFSTR("Content-Type"), CFSTR("application/x-www-form-urlencoded"));
    CFHTTPMessageSetHeaderFieldValue(myRequest, CFSTR("Content-Length"), (CFStringRef)postLength);
    CFHTTPMessageSetBody(myRequest, (CFDataRef)postData); // postData is NSData 
dataReadStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest);

//// Отсюда есть подключение к серверу

CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, 
                                       (CFStringRef) serverHost, 
                                       serverPort, 
                                       &dataReadStream, 
                                       &dataWriteStream);

if (dataReadStream && dataWriteStream) {
    CFReadStreamSetProperty(dataReadStream, 
                            kCFStreamPropertyShouldCloseNativeSocket, 
                            kCFBooleanTrue);
    CFWriteStreamSetProperty(dataWriteStream, 
                             kCFStreamPropertyShouldCloseNativeSocket, 
                             kCFBooleanTrue);

    iStream = (NSInputStream *)dataReadStream;
    [iStream retain];
    [iStream setDelegate:self];
    [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
                       forMode:NSDefaultRunLoopMode];
    [iStream open];

    oStream = (NSOutputStream *)dataWriteStream;
    [oStream retain];
    [oStream setDelegate:self];
    [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
                       forMode:NSDefaultRunLoopMode];
    [oStream open];

/// Теперь напишите вашу команду на сервер

NSString *content = [NSString stringWithFormat:@"Your Command"];
NSString *req = [NSString stringWithFormat:@"POST /client HTTP/1.1\r\nContent-Length: %d\r\n\r\n%@\r\n", [content length], content];

[oStream write:(const UInt8 *)[req UTF8String] maxLength:strlen((char*)[req UTF8String])];

, затем получите уведомление просто не забудьте забыть добавить в файл заголовка

-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...