HTTP-пакеты не отправляются

Я пишу свое приложение для MAC OS X Mavericks. Это должно быть приложение, которое может отправлять запросы POST и GET на сервер. Прежде всего, я пытаюсь отправить запрос POST. Но, к сожалению, это не работает, и я не знаю почему. Когда я пытаюсь перехватить пакеты с помощью сниффера WireShark, он показывает, что пакеты не отправлены. Это мой код:

UInt32 Login(wchar_t* wstrIpAddress)
{
size_t size = wstrIpAddress.length();

//create request body
CFStringRef bodyString = CFSTR("");
CFDataRef bodyData = CFStringCreateExternalRepresentation(kCFAllocatorDefault,
bodyString,
kCFStringEncodingUTF8,
0);
if(bodyData == NULL)
{
cout << "CFStringCreateExternalRepresentation() could not convert the characters to the specified encoding. ""Error code: "<< errno << endl;
return 2;
}

//create headers
CFStringRef headerFieldName = CFSTR("Content-Type");
CFStringRef headerFieldValue = CFSTR("application/x-www-form-urlencoded;charset=base64");

//fix coding wstrIpAddress from wstring to UInt8
CFStringEncoding encoding =
(CFByteOrderLittleEndian == CFByteOrderGetCurrent()) ? kCFStringEncodingUTF32LE : kCFStringEncodingUTF32BE;

CFIndex wstrIpAddressLen = (wcslen(wstrIpAddress.c_str())) * sizeof(wchar_t);

CFStringRef myUrl = CFStringCreateWithBytes(kCFAllocatorDefault,
(UInt8*)wstrIpAddress.c_str(),
wstrIpAddressLen,
encoding,
false);
if(myUrl == NULL)
{
cout << "CFStringCreateWithBytes() had a problem with creating the object. Error code: " << errno << endl;
return 3;
}

//CFStringRef urlEscaped = CFURLCreateStringByAddingPercentEscapes(NULL, myUrl, NULL, NULL, kCFStringEncodingUTF8);

CFURLRef url = CFURLCreateWithString(kCFAllocatorDefault, myUrl, 0);
if(url == NULL)
{
cout << "CFURLCreateWithString() had a problem with creating the object. Error code: " << errno << endl;
return 4;
}

CFStringRef requestMethod = CFSTR("POST");
CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, url, kCFHTTPVersion1_1);
if(myRequest == NULL)
{
cout << "CFHTTPMessageCreateRequest() had a problem with creating the object. Error code: " << errno << endl;
return 5;
}

CFDataRef bodyDataExt = CFStringCreateExternalRepresentation(kCFAllocatorDefault,
bodyString,
kCFStringEncodingUTF8,
0);
if(bodyDataExt == NULL)
{
cout << "CFStringCreateExternalRepresentation() could not convert the characters to the specified encoding. ""Error code: "<< errno << endl;
return 6;
}

CFHTTPMessageSetBody(myRequest, bodyDataExt);
CFHTTPMessageSetHeaderFieldValue(myRequest, headerFieldName, headerFieldValue);
CFReadStreamRef myReadStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest);
//CFErrorRef copyError = CFReadStreamCopyError(myReadStream);
//cout << copyError << endl;
CFRelease(myRequest);
myRequest = NULL;

//you could release the CFHTTP request object immediately after calling CFReadStreamCreateForHTTPRequest
//Because the read stream opens a socket connection with the server specified by the myUrl parameter when the CFHTTP request was created, some
//amount of time must be allowed to pass before the stream is considered to be open

//Opening the read stream also causes the request to be serialized and sent
Boolean bRes = CFReadStreamOpen(myReadStream);
if(bRes == FALSE)
{
CFStreamError myErr = CFReadStreamGetError(myReadStream);
// An error has occurred.
if (myErr.domain == kCFStreamErrorDomainPOSIX) {
// Interpret myErr.error as a UNIX errno.
}
else if (myErr.domain == kCFStreamErrorDomainMacOSStatus) {
// Interpret myErr.error as a MacOS error code.
OSStatus macError = (OSStatus)myErr.error;
// Check other error domains.
}
cout << "ReadStreamOpen error with error code: " << errno << endl;;
return 7;
}
//UInt32 myErrCode = CFHTTPMessageGetResponseStatusCode(myReadStream);
/*if(myErrCode != 200)
{
cout << "Request faild\n" << endl;
return 1;
}*/

//release the message objects
CFRelease(url);
CFRelease(bodyString);
CFRelease(bodyData);
CFRelease(headerFieldName);
CFRelease(headerFieldValue);
CFRelease(bodyDataExt);
bodyDataExt = NULL;
return 0;
}

0

Решение

Я нашел ответ.

  1. Адрес к серверу, например, должен быть в таком формате:
    http://10.0.0.25, но НЕ только ip вот так -> 10.0.0.25.
  2. Мы также должны проверить код статуса из ответа, который гарантирует правильное соединение.

    UInt32 myErrCode = CFHTTPMessageGetResponseStatusCode(myReadStream);
    if(myErrCode != 200)
    {
    cout << "Request faild\n" << endl;
    return 1;
    }
    
0

Другие решения