Socket error 10014

Socket error 10014
От:

VictorProg

 
Дата:  08.10.04 06:53
Оценка:

Всем день добрый. Может вопрос и глупый, но я всёже спрошу.
Вот вызываю я WSARecv метод. Он читает данные нормально, но потом вдруг получается ошибка 10014.
В описании ошибки сказано:


Socket error (#10014): Bad address

Analyse & Solutions: The system detected an invalid pointer address in attempting to use a pointer argument of a call. This error occurs if an application passes an invalid pointer value, or if the length of the buffer is too small. For instance, if the length of an argument, which is a sockaddr structure, is smaller than the sizeof(sockaddr).

sockaddr

The sockaddr structure varies depending on the protocol selected. Except for the sa_family parameter, sockaddr contents are expressed in network byte order.

In Windows Sockets 2, the name parameter is not strictly interpreted as a pointer to a sockaddr structure. It is presented in this manner for Windows Sockets compatibility. The actual structure is interpreted differently in the context of different address families. The only requirements are that the first u_short is the address family and the total size of the memory buffer in bytes is namelen.

Т.е. судя повсему произошла ошибка при которой пропал адрес сервера с которым я общался. Что это может быть и как с этим бороться?

Заранее спасибо.

От:

butcher

Россия

http://bu7cher.blogspot.com
Дата:  08.10.04 07:07
Оценка:

Здравствуйте, VictorProg, Вы писали:

VP>Всем день добрый. Может вопрос и глупый, но я всёже спрошу.

VP>Вот вызываю я WSARecv метод. Он читает данные нормально, но потом вдруг получается ошибка 10014.
VP>Т.е. судя повсему произошла ошибка при которой пропал адрес сервера с которым я общался.
Нет, вы неправильно заполнили второй параметр функции WSARecv.

VP>Что это может быть и как с этим бороться?

Ошибка в программе, передавать правильные параметры.

https://rsdn.org/tools/member.aspx?id=butcher


Нет ничего невозможного..

От: Аноним

 
Дата:  08.10.04 07:08
Оценка:

Здравствуйте, VictorProg, Вы писали:

VP>Всем день добрый. Может вопрос и глупый, но я всёже спрошу.

VP>Вот вызываю я WSARecv метод. Он читает данные нормально, но потом вдруг получается ошибка 10014.
VP>В описании ошибки сказано:

VP>

VP>Socket error (#10014): Bad address

VP>Analyse & Solutions: The system detected an invalid pointer address in attempting to use a pointer argument of a call. This error occurs if an application passes an invalid pointer value, or if the length of the buffer is too small. For instance, if the length of an argument, which is a sockaddr structure, is smaller than the sizeof(sockaddr).


VP>sockaddr


VP>The sockaddr structure varies depending on the protocol selected. Except for the sa_family parameter, sockaddr contents are expressed in network byte order.


VP>In Windows Sockets 2, the name parameter is not strictly interpreted as a pointer to a sockaddr structure. It is presented in this manner for Windows Sockets compatibility. The actual structure is interpreted differently in the context of different address families. The only requirements are that the first u_short is the address family and the total size of the memory buffer in bytes is namelen.

VP>

VP>Т.е. судя повсему произошла ошибка при которой пропал адрес сервера с которым я общался. Что это может быть и как с этим бороться?



VP>Заранее спасибо.

ошибка 10014 это WSAEFAULT : The system detected an invalid pointer address in attempting to use a pointer argument in a call.
а в отношениее WSARecv : The lpBuffers parameter is not completely contained in a valid part of the user address space.
так что это значит что в своем приложении что-то у тебя с буфером не то… а sockaddr это так, для примера


Re[2]: Socket error 10014

От:

VictorProg

 
Дата:  08.10.04 07:12
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, VictorProg, Вы писали:


VP>>Всем день добрый. Может вопрос и глупый, но я всёже спрошу.

VP>>Вот вызываю я WSARecv метод. Он читает данные нормально, но потом вдруг получается ошибка 10014.
VP>>В описании ошибки сказано:

VP>>

VP>>Socket error (#10014): Bad address

VP>>Analyse & Solutions: The system detected an invalid pointer address in attempting to use a pointer argument of a call. This error occurs if an application passes an invalid pointer value, or if the length of the buffer is too small. For instance, if the length of an argument, which is a sockaddr structure, is smaller than the sizeof(sockaddr).


VP>>sockaddr


VP>>The sockaddr structure varies depending on the protocol selected. Except for the sa_family parameter, sockaddr contents are expressed in network byte order.


VP>>In Windows Sockets 2, the name parameter is not strictly interpreted as a pointer to a sockaddr structure. It is presented in this manner for Windows Sockets compatibility. The actual structure is interpreted differently in the context of different address families. The only requirements are that the first u_short is the address family and the total size of the memory buffer in bytes is namelen.

VP>>

VP>>Т.е. судя повсему произошла ошибка при которой пропал адрес сервера с которым я общался. Что это может быть и как с этим бороться?



VP>>Заранее спасибо.


А>ошибка 10014 это WSAEFAULT : The system detected an invalid pointer address in attempting to use a pointer argument in a call.

А>а в отношениее WSARecv : The lpBuffers parameter is not completely contained in a valid part of the user address space.
А>так что это значит что в своем приложении что-то у тебя с буфером не то… а sockaddr это так, для примера

Ок. Спасибо большое. Буду думать над этим


Re[2]: Socket error 10014

От:

VictorProg

 
Дата:  08.10.04 07:13
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, VictorProg, Вы писали:


VP>>Всем день добрый. Может вопрос и глупый, но я всёже спрошу.

VP>>Вот вызываю я WSARecv метод. Он читает данные нормально, но потом вдруг получается ошибка 10014.
VP>>В описании ошибки сказано:

VP>>

VP>>Socket error (#10014): Bad address

VP>>Analyse & Solutions: The system detected an invalid pointer address in attempting to use a pointer argument of a call. This error occurs if an application passes an invalid pointer value, or if the length of the buffer is too small. For instance, if the length of an argument, which is a sockaddr structure, is smaller than the sizeof(sockaddr).


VP>>sockaddr


VP>>The sockaddr structure varies depending on the protocol selected. Except for the sa_family parameter, sockaddr contents are expressed in network byte order.


VP>>In Windows Sockets 2, the name parameter is not strictly interpreted as a pointer to a sockaddr structure. It is presented in this manner for Windows Sockets compatibility. The actual structure is interpreted differently in the context of different address families. The only requirements are that the first u_short is the address family and the total size of the memory buffer in bytes is namelen.

VP>>

VP>>Т.е. судя повсему произошла ошибка при которой пропал адрес сервера с которым я общался. Что это может быть и как с этим бороться?



VP>>Заранее спасибо.


А>ошибка 10014 это WSAEFAULT : The system detected an invalid pointer address in attempting to use a pointer argument in a call.

А>а в отношениее WSARecv : The lpBuffers parameter is not completely contained in a valid part of the user address space.
А>так что это значит что в своем приложении что-то у тебя с буфером не то… а sockaddr это так, для примера

Просто этот класс написан дядьками из Микрософт для работы с секурными коннектами. Вот в нём и трабл.


Re[3]: Socket error 10014

От:

butcher

Россия

http://bu7cher.blogspot.com
Дата:  08.10.04 07:25
Оценка:

Здравствуйте, VictorProg, Вы писали:

VP>Просто этот класс написан дядьками из Микрософт для работы с секурными коннектами. Вот в нём и трабл.

Всё ещё с этими CSecureEvtSyncSocket классами возитесь? Странно как-то, можно линк где вы его взяли, посмотреть что это за детище MS?

https://rsdn.org/tools/member.aspx?id=butcher


Нет ничего невозможного..

От:

VictorProg

 
Дата:  08.10.04 07:26
Оценка:

Здравствуйте, VictorProg, Вы писали:

VP>Всем день добрый. Может вопрос и глупый, но я всёже спрошу.

VP>Вот вызываю я WSARecv метод. Он читает данные нормально, но потом вдруг получается ошибка 10014.
VP>В описании ошибки сказано:

VP>

VP>Socket error (#10014): Bad address

VP>Analyse & Solutions: The system detected an invalid pointer address in attempting to use a pointer argument of a call. This error occurs if an application passes an invalid pointer value, or if the length of the buffer is too small. For instance, if the length of an argument, which is a sockaddr structure, is smaller than the sizeof(sockaddr).


VP>sockaddr


VP>The sockaddr structure varies depending on the protocol selected. Except for the sa_family parameter, sockaddr contents are expressed in network byte order.


VP>In Windows Sockets 2, the name parameter is not strictly interpreted as a pointer to a sockaddr structure. It is presented in this manner for Windows Sockets compatibility. The actual structure is interpreted differently in the context of different address families. The only requirements are that the first u_short is the address family and the total size of the memory buffer in bytes is namelen.

VP>

VP>Т.е. судя повсему произошла ошибка при которой пропал адрес сервера с которым я общался. Что это может быть и как


с этим бороться?

Кто нить помогите плиз, бо я уже незнаю что делать. Это стандартные вещи из студии, они работают глюкаво. Подскажите плиз. Или подскажите как используя WSA сокеты получить информацию о том, скока данных мне пришло в ответе?
VP>Заранее спасибо.


Re[4]: Socket error 10014

От:

VictorProg

 
Дата:  08.10.04 07:29
Оценка:

Здравствуйте, butcher, Вы писали:

B>Здравствуйте, VictorProg, Вы писали:


VP>>Просто этот класс написан дядьками из Микрософт для работы с секурными коннектами. Вот в нём и трабл.

B>Всё ещё с этими CSecureEvtSyncSocket классами возитесь? Странно как-то, можно линк где вы его взяли, посмотреть что это за детище MS?

CSecureEvtSyncSocket — это взято из документации из студии по работе с секурными сокетами на ATL


Re[4]: Socket error 10014

От:

VictorProg

 
Дата:  08.10.04 07:31
Оценка:

Здравствуйте, butcher, Вы писали:

B>Здравствуйте, VictorProg, Вы писали:


VP>>Просто этот класс написан дядьками из Микрософт для работы с секурными коннектами. Вот в нём и трабл.

B>Всё ещё с этими CSecureEvtSyncSocket классами возитесь? Странно как-то, можно линк где вы его взяли, посмотреть что это за детище MS?

У меня просто нет времени изобретать велосипед. Посему я его и взял. Он просто подключается и т.д.


Re[2]: Socket error 10014

От:

butcher

Россия

http://bu7cher.blogspot.com
Дата:  08.10.04 07:34
Оценка:

Здравствуйте, VictorProg, Вы писали:

VP>>Что это может быть и как с этим бороться?

Код покажите..

VP>Кто нить помогите плиз, бо я уже незнаю что делать. Это стандартные вещи из студии, они работают глюкаво. Подскажите плиз. Или подскажите как используя WSA сокеты получить информацию о том, скока данных мне пришло в ответе?

VP>>Заранее спасибо.

int WSARecv(
  SOCKET s,
  LPWSABUF lpBuffers,
  DWORD dwBufferCount,
  LPDWORD lpNumberOfBytesRecvd,
  LPDWORD lpFlags,
  LPWSAOVERLAPPED lpOverlapped,
  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
/*
lpNumberOfBytesRecvd 
    [out] Pointer to the number of bytes received by this call if the receive operation completes immediately. */

или, для случая с OVERLAPPED:

BOOL WSAGetOverlappedResult(
  SOCKET s,
  LPWSAOVERLAPPED lpOverlapped,
  LPDWORD lpcbTransfer,
  BOOL fWait,
  LPDWORD lpdwFlags
);

https://rsdn.org/tools/member.aspx?id=butcher


Нет ничего невозможного..


Re[3]: Socket error 10014

От:

VictorProg

 
Дата:  08.10.04 07:49
Оценка:

Здравствуйте, butcher, Вы писали:

B>Здравствуйте, VictorProg, Вы писали:


VP>>>Что это может быть и как с этим бороться?

B>Код покажите..

VP>>Кто нить помогите плиз, бо я уже незнаю что делать. Это стандартные вещи из студии, они работают глюкаво. Подскажите плиз. Или подскажите как используя WSA сокеты получить информацию о том, скока данных мне пришло в ответе?

VP>>>Заранее спасибо.
B>

B>int WSARecv(
B>  SOCKET s,
B>  LPWSABUF lpBuffers,
B>  DWORD dwBufferCount,
B>  LPDWORD lpNumberOfBytesRecvd,
B>  LPDWORD lpFlags,
B>  LPWSAOVERLAPPED lpOverlapped,
B>  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
B>);
B>/*
B>lpNumberOfBytesRecvd 
B>    [out] Pointer to the number of bytes received by this call if the receive operation completes immediately. */
B>


B>или, для случая с OVERLAPPED:
B>

B>BOOL WSAGetOverlappedResult(
B>  SOCKET s,
B>  LPWSAOVERLAPPED lpOverlapped,
B>  LPDWORD lpcbTransfer,
B>  BOOL fWait,
B>  LPDWORD lpdwFlags
B>);
B>

Проблема вся в том, что ошибка у меня возникает при WSARecv. Т.е. перед вызовом этого метода, я хочу получить реальное количество данных, которые меня ждут, правильно подготовить буффер для чтения, а уж потом вызывать WSARecv.


Re[4]: Socket error 10014

От:

butcher

Россия

http://bu7cher.blogspot.com
Дата:  08.10.04 08:02
Оценка:

Здравствуйте, VictorProg, Вы писали:

VP>Проблема вся в том, что ошибка у меня возникает при WSARecv. Т.е. перед вызовом этого метода, я хочу получить реальное количество данных, которые меня ждут, правильно подготовить буффер для чтения, а уж потом вызывать WSARecv.

Оно вам надо? См. ioctlsocket/WSAIoctl + FIONREAD. Обычно это считается «дурным стилем». Задайте буфер 64K, и читайте, если будет мало, дочитаете в следующем вызове.

https://rsdn.org/tools/member.aspx?id=butcher


Нет ничего невозможного..


Re[5]: Socket error 10014

От:

VictorProg

 
Дата:  08.10.04 08:06
Оценка:

Здравствуйте, butcher, Вы писали:

B>Здравствуйте, VictorProg, Вы писали:


VP>>Проблема вся в том, что ошибка у меня возникает при WSARecv. Т.е. перед вызовом этого метода, я хочу получить реальное количество данных, которые меня ждут, правильно подготовить буффер для чтения, а уж потом вызывать WSARecv.

B>Оно вам надо? См. ioctlsocket/WSAIoctl + FIONREAD. Обычно это считается «дурным стилем». Задайте буфер 64K, и читайте, если будет мало, дочитаете в следующем вызове.

Дело в том, что я так и делаю. Я задал примерное количество при ините буфера и читаю WSARecv. Вот и получаю ошибку, что ему мало этого места.


Re[6]: Socket error 10014

От:

butcher

Россия

http://bu7cher.blogspot.com
Дата:  08.10.04 08:12
Оценка:

Здравствуйте, VictorProg, Вы писали:

VP>Дело в том, что я так и делаю. Я задал примерное количество при ините буфера и читаю WSARecv. Вот и получаю ошибку, что ему мало этого места.

WSAEFAULT не означает нехватки места в буфере, ошибка происходит, когда передан неверный указатель, например NULL (может быть и другим, «The lpBuffers parameter is not completely contained in a valid part of the user address space.»)…

https://rsdn.org/tools/member.aspx?id=butcher


Нет ничего невозможного..


Re[7]: Socket error 10014

От:

VictorProg

 
Дата:  08.10.04 08:15
Оценка:

Здравствуйте, butcher, Вы писали:

B>Здравствуйте, VictorProg, Вы писали:


VP>>Дело в том, что я так и делаю. Я задал примерное количество при ините буфера и читаю WSARecv. Вот и получаю ошибку, что ему мало этого места.

B>WSAEFAULT не означает нехватки места в буфере, ошибка происходит, когда передан неверный указатель, например NULL (может быть и другим, «The lpBuffers parameter is not completely contained in a valid part of the user address space.»)…

Понятно. Надо пересмотреть всё заново. Там ноги растут аж с atlhttp


Re[6]: Socket error 10014

От: Аноним

 
Дата:  08.10.04 08:16
Оценка:

Здравствуйте, VictorProg, Вы писали:

VP>Здравствуйте, butcher, Вы писали:


B>>Здравствуйте, VictorProg, Вы писали:


VP>>>Проблема вся в том, что ошибка у меня возникает при WSARecv. Т.е. перед вызовом этого метода, я хочу получить реальное количество данных, которые меня ждут, правильно подготовить буффер для чтения, а уж потом вызывать WSARecv.

B>>Оно вам надо? См. ioctlsocket/WSAIoctl + FIONREAD. Обычно это считается «дурным стилем». Задайте буфер 64K, и читайте, если будет мало, дочитаете в следующем вызове.

VP>Дело в том, что я так и делаю. Я задал примерное количество при ините буфера и читаю WSARecv. Вот и получаю ошибку, что ему мало этого места.

ну так покажите кусочек кода.

lpBuffers в WSARecv должен указывать на массив структур WSABUF
каждый элемент которого это WSABUF в свою очередь содержит указатель на буфер и его реальную длину
естественно wsabuf уже должен быть проинициализирован
например

  buf: WSABUF;
  BytesRecvd: dword;
...
  buf.len := 65000;
  buf.buf := AllocMem(buf.len);
  ret := WSARecv(skt, @buf, 1, @BytesRecvd, .........);

ну и так далее


Re[7]: Socket error 10014

От:

VictorProg

 
Дата:  08.10.04 08:29
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, VictorProg, Вы писали:


VP>>Здравствуйте, butcher, Вы писали:


B>>>Здравствуйте, VictorProg, Вы писали:


VP>>>>Проблема вся в том, что ошибка у меня возникает при WSARecv. Т.е. перед вызовом этого метода, я хочу получить реальное количество данных, которые меня ждут, правильно подготовить буффер для чтения, а уж потом вызывать WSARecv.

B>>>Оно вам надо? См. ioctlsocket/WSAIoctl + FIONREAD. Обычно это считается «дурным стилем». Задайте буфер 64K, и читайте, если будет мало, дочитаете в следующем вызове.

VP>>Дело в том, что я так и делаю. Я задал примерное количество при ините буфера и читаю WSARecv. Вот и получаю ошибку, что ему мало этого места.



А>ну так покажите кусочек кода.


А>lpBuffers в WSARecv должен указывать на массив структур WSABUF

А>каждый элемент которого это WSABUF в свою очередь содержит указатель на буфер и его реальную длину
А>естественно wsabuf уже должен быть проинициализирован
А>например

А>

А>  buf: WSABUF;
А>  BytesRecvd: dword;
А>...
А>  buf.len := 65000;
А>  buf.buf := AllocMem(buf.len);
А>  ret := WSARecv(skt, @buf, 1, @BytesRecvd, .........);
А>



А>ну и так далее

Вот кусок кода чтения:

inline bool CSecureEvtSyncSocket::internalRead(const unsigned char *pBuff, DWORD *pdwSize) 
{
    // if we aren't already connected we'll wait to see if the connect
    // event happens
    if (WAIT_OBJECT_0 != WaitForSingleObject((HANDLE)m_hEventConnect , m_dwSocketTimeout))
    {
        m_dwLastError = WSAENOTCONN;
        return false; // not connected
    }

    if (WAIT_ABANDONED == WaitForSingleObject((HANDLE)m_hEventRead, 0))
    {
        m_dwLastError = WSAEINPROGRESS;
        return false; // another write on is blocking this socket
    }

    bool bRet = true;
    WSABUF buff;
    buff.buf = (char*)pBuff;
    buff.len = *pdwSize;
    *pdwSize = 0;
    DWORD dwFlags = 0;
    WSAOVERLAPPED o;
    ZeroMemory(&o, sizeof(o));

    // protect against re-entrency
    m_csRead.Lock();
    o.hEvent = m_hEventRead;
    WSAResetEvent(o.hEvent);
    if (WSARecv(m_socket, &buff, 1, pdwSize, &dwFlags, &o, 0))
    {
        DWORD dwLastError = WSAGetLastError();
        if (dwLastError != WSA_IO_PENDING)
        {
            m_dwLastError = dwLastError;
            bRet = false;
        }
    }

    // wait for the read to complete
    if (bRet && WAIT_OBJECT_0 == WaitForSingleObject((HANDLE)o.hEvent, m_dwSocketTimeout))
    {
        dwFlags = 0;
        if (WSAGetOverlappedResult(m_socket, &o, pdwSize, FALSE, &dwFlags))
            bRet = true;
        else
        {
            m_dwLastError = ::GetLastError();
            bRet = false;
        }

    }

    m_csRead.Unlock();
    return bRet;
}

Писал не я.


Re[8]: Socket error 10014

От: Аноним

 
Дата:  08.10.04 08:33
Оценка:

VP>Вот кусок кода чтения:

VP>

VP>inline bool CSecureEvtSyncSocket::internalRead(const unsigned char *pBuff, DWORD *pdwSize) 
...
VP>



VP>Писал не я.

верю

а вот что подается на вход internalRead() ?
тот самый буфер, которому ай как плохо…
оно то где и с чем вызывается?


Re[8]: Socket error 10014

От:

Александр

Россия

 
Дата:  08.10.04 08:33
Оценка:

Здравствуйте, VictorProg, Вы писали:

А вот этот кусок зачем???
VP>


VP>    if (WAIT_ABANDONED == WaitForSingleObject((HANDLE)m_hEventRead, 0))
VP>    {
VP>        m_dwLastError = WSAEINPROGRESS;
VP>        return false; // another write on is blocking this socket
VP>    }

VP>

http://flintspb.amillo.net/Pic/1.gif


Re[8]: Socket error 10014

От:

butcher

Россия

http://bu7cher.blogspot.com
Дата:  08.10.04 08:34
Оценка:

Здравствуйте, VictorProg, Вы писали:

Ошибка судя по всему там, где выделяется буфер и вызывается эта функция..
VP>

VP>inline bool CSecureEvtSyncSocket::internalRead(const unsigned char *pBuff, DWORD *pdwSize) 
VP>

https://rsdn.org/tools/member.aspx?id=butcher


Нет ничего невозможного..

Подождите ...

Wait...

  • Переместить
  • Удалить
  • Выделить ветку

Пока на собственное сообщение не было ответов, его можно удалить.

  • Remove From My Forums
  • Question

  • Hi I am trying to develop a bluetooth application which will connect my laptop with my phone.
    I stuck to the winsock error 10014 and i cant figure out what really wrong with the code.

    Error code 10014 — 

    Bad address.

    The system detected an invalid pointer address in attempting to use a pointer argument of a call. This error occurs if an application passes an invalid pointer value, or if the length of the buffer is too small. For instance, if the length of an argument, which is a sockaddr structure, is smaller than the sizeof(sockaddr).

    I am not sure how can i check which pointer is bad or check the length of argument.

    I attached the code 

    1 // abhinavdec14client.cpp : Defines the entry point for the console application.  
    2  
    3 //  
    4  
    5 #include «stdafx.h»  
    6  
    7 #include <initguid.h> 
    8  
    9 #include <winsock2.h> 
    10  
    11 #include <ws2bth.h> 
    12  
    13 #include <stdio.h> 
    14  
    15 DEFINE_GUID(OBEXFileTransfer, 0x00001106, 0x0000, 0x1000, 0x80,0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb);  
    16  
    17 int SDPGetPort( const char *addr, LPGUID guid )  
    18  
    19 {  
    20  
    21 int port = 0;  
    22  
    23 HANDLE h;  
    24  
    25 WSAQUERYSET *qs;  
    26  
    27 DWORD flags = 0;  
    28  
    29 DWORD qs_len;  
    30  
    31 bool done;  
    32  
    33 qs_len = sizeof(WSAQUERYSET);  
    34  
    35 qs = (WSAQUERYSET*) malloc( qs_len );  
    36  
    37 ZeroMemory( qs, qs_len );  
    38  
    39 qs->dwSize = sizeof(WSAQUERYSET);  
    40  
    41 qs->lpServiceClassId = guid;  
    42  
    43 qs->dwNameSpace = NS_BTH;  
    44  
    45 qs->dwNumberOfCsAddrs = 0;  
    46  
    47 qs->lpszContext = (LPSTR) addr;  
    48  
    49 flags = LUP_FLUSHCACHE | LUP_RETURN_ADDR;  
    50  
    51 wprintf (L»GUID ,%d %d»,&qs_len,sizeof(WSAQUERYSET) );  
    52  
    53 if( SOCKET_ERROR == WSALookupServiceBegin( qs, flags, &h )) {  
    54  
    55 wprintf (L»Socket create, error 1 -%dn», WSAGetLastError ());  
    56  
    57 //ExitProcess(2);  
    58  
    59 }  
    60  
    61 done = false;  
    62  
    63 while ( ! done ) {  
    64  
    65 if( SOCKET_ERROR == WSALookupServiceNext( h, flags, &qs_len, qs ) ) {  
    66  
    67 wprintf (L»Socket create, error 2 -%dn», WSAGetLastError ());  
    68  
    69 int error = WSAGetLastError();  
    70  
    71 if( error == WSAEFAULT ) {  
    72  
    73 free(qs);  
    74  
    75 qs = (WSAQUERYSET*) malloc( qs_len );  
    76  
    77 } else if (error == WSA_E_NO_MORE ) {  
    78  
    79 done = true;  
    80  
    81 } else {  
    82  
    83 wprintf (L»Socket create, error 3- %dn», WSAGetLastError ());  
    84  
    85 //ExitProcess(2);  
    86  
    87 }  
    88  
    89 } else {  
    90  
    91 port =  
    92  
    93 ((SOCKADDR_BTH*)qs->lpcsaBuffer->RemoteAddr.lpSockaddr)->port;  
    94  
    95 }  
    96  
    97 }  
    98  
    99 free(qs);  
    100  
    101 WSALookupServiceEnd( h );  
    102  
    103 return port;  
    104  
    105 }  
    106  
    107 int _tmain(int argc, _TCHAR* argv[])  
    108  
    109 {  
    110  
    111 SOCKET sock;  
    112  
    113 SOCKADDR_BTH sa = { 0 };  
    114  
    115 int sa_len = sizeof(sa);  
    116  
    117 // initialize windows sockets  
    118  
    119 WORD wVersionRequested;  
    120  
    121 WSADATA wsaData;  
    122  
    123 wVersionRequested = MAKEWORD( 2, 0 );  
    124  
    125 if( WSAStartup( wVersionRequested, &wsaData ) != 0 ) {  
    126  
    127 ExitProcess(2);  
    128  
    129 }  
    130  
    131 // parse the specified Bluetooth address  
    132  
    133 LPSTR abhi = «00:1d:fd:8e:21:8d»;  
    134  
    135 int abhisize = sizeof (abhi);  
    136  
    137 if( abhisize < 2 ) {  
    138  
    139 fprintf(stderr, «usage: rfcomm-client <addr>n»  
    140  
    141 «n addr must be in the form (XX:XX:XX:XX:XX:XX)»);  
    142  
    143 //ExitProcess(2);  
    144  
    145 }  
    146  
    147 if( SOCKET_ERROR == WSAStringToAddress( abhi, AF_BTH,  
    148  
    149 NULL, (LPSOCKADDR) &sa, &sa_len ) ) {  
    150  
    151 wprintf (L»String to address %dn», WSAGetLastError ());  
    152  
    153 //ExitProcess(2);  
    154  
    155 }  
    156  
    157 // query it for the right port  
    158  
    159 // create the socket  
    160  
    161 sock = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);  
    162  
    163 if( SOCKET_ERROR == sock ) {  
    164  
    165 wprintf (L»Socket create, error %dn», WSAGetLastError ());  
    166  
    167 //ExitProcess(2);  
    168  
    169 }  
    170  
    171 // fill in the rest of the SOCKADDR_BTH struct  
    172  
    173 sa.port = SDPGetPort(abhi, (LPGUID) &OBEXFileTransfer);  
    174  
    175 //if( sa.port == 0 ) {  
    176  
    177 //ExitProcess(2);  
    178  
    179 //}  
    180  
    181 if( SOCKET_ERROR == connect( sock, (LPSOCKADDR) &sa, sa_len ) ) {  
    182  
    183 wprintf (L»Socket connect, error %dn», WSAGetLastError ());  
    184  
    185 //ExitProcess(2);  
    186  
    187 }  
    188  
    189 send( sock, «hello!», 6, 0 );  
    190  
    191 closesocket(sock);  
    192  
    193 Sleep(10000);  
    194  
    195 return 0;  
    196  
    197 }  
    198  

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    >
    вызываю connect — ловлю ошибку 10014.
    , как лечить?

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    06.08.11, 07:12

      ситуация ткая мне в длл приходит вызов — законнектить сокет на сервер. сокет уже создан до моего вызова, параметры его создания не известны.
      при попытке законнектить получаю FAILED и 10014ю ошибку.

      вот код:

      ExpandedWrap disabled

            util::CS_LOCK( cs );

            struct addrinfo *result = NULL, *ptr = NULL, hints;

            ZeroMemory( &hints, sizeof(hints) );

            hints.ai_family     = AF_UNSPEC;

            hints.ai_socktype   = SOCK_STREAM;

            hints.ai_protocol   = IPPROTO_TCP;

            int res = getaddrinfo( «192.168.0.77», «443», &hints, &result);

            if (res != 0)

                return S_FALSE;

            ptr = result;

            res = connect( mConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen );

            if ( res == SOCKET_ERROR)

            {

                closesocket(mConnectSocket);

                mConnectSocket = INVALID_SOCKET;

            }

            freeaddrinfo(result);

            if (mConnectSocket == INVALID_SOCKET)

                return S_FALSE;

            return S_OK;

      если же я создам сам сокет перед connect то все ок. проходит.
      есть подозрение что сокет был создан с левыми параметрами.
      к сожалению в dll он приходит не по ссылке и пересоздать я не могу.
      можно ли как то перед вызовом connect поменять параметры готового сокета: family, socktype, protocol ?


      nemez



      Сообщ.
      #2

      ,
      06.08.11, 07:37

        Senior Member

        ****

        Рейтинг (т): 17

        может быть что просто неправильно передалось значение. Проверить бы значение mConnectSocket до передачи в ДЛЛ и после! Параметры менять не желательно! Скажем если сокет клиент TCP, то прежде чем менять его на UDP, нужно отконнектиться от сервера. Если сокет серверный и мы меняем его на UDP — нам нада поотрубать клиентов.
        Существуют способы shutdown() close() и т.п. — сначала закрываем mConnectSocket, потом — по новой mConnectSocket = socket .. блаблабла!
        шашкой рубить по параметрам в процессе — будет скорей неправильно архитектурно.. Тем более, в такой неустойчивой штуке как винсок.

        Сообщение отредактировано: nemez — 06.08.11, 07:38


        progman



        Сообщ.
        #3

        ,
        06.08.11, 08:51

          nemez
          да все проще и сложнее

          созвонился с теми кто другой модуль писал — они под IPv6 семейство сокет создавали.
          поэтому у меня коннект и ругается когда я адрес сервера генерю.

          можно как то у уже созданного сокета но не законнекченного сменить семейство тип и протокол ?
          сокет дестроить нельзя


          Хрен



          Сообщ.
          #4

          ,
          06.08.11, 09:38

            Разве что поиграться с setsockopt и этими значениями (они не из сей вроде, но один хрен =) )


            progman



            Сообщ.
            #5

            ,
            06.08.11, 10:14

              Хрен
              честно говоря так и не вкурил как созданному сокету сменить семейство AF_INET6 на AF_INET


              nemez



              Сообщ.
              #6

              ,
              06.08.11, 10:37

                Senior Member

                ****

                Рейтинг (т): 17

                progman
                чесно говоря подобного плана задачи стоят и у меня самого, но все руки не доходят и откладываю на потом.
                Там весь прикол в том что структура sockaddr_in или там sockaddr для этих протоколов отличается!!!!
                для 6 нада использовать кажись это:
                http://msdn.microsoft.com/en-us/library/ms740504(v=vs.85).aspx
                в мсдн пишут по этому поводу, с примерами кода
                http://msdn.microsoft.com/en-us/library/ms738649(v=vs.85).aspx
                ну и я бы рекомендовал переходить на дот нет фреймворк, там возни меньше и толку больше, при реализации как блокирующих, так и неблокирующих сокетов, интерфейс интуитивно понятный и простой как трехлинейка.


                progman



                Сообщ.
                #7

                ,
                06.08.11, 10:55

                  nemez
                  ты не понял… система плагинов.
                  чуваки в ядре создают сокет сами ( зачем второй вопрос ) и влепили там семейство AF_INET6
                  грузится моя длл, которая обеспечивает работу с моим сервером.
                  ее задача законнектить их сокет с моим серваком.

                  он, сервак, пока только по IPv4 работает. с IPv6 никогда дел не имел и все попытки законнектить терпят фиаско.
                  код сервера переписывать анрил потому что он уже работает и трогать категорически нельзя.

                  пока тренируюсь на локальном. у локального адрес 192.168.0.7 — пытался скормить его в структуру адресинфо — фиг

                  вот и задумал — а не сменить ли мне у сокета который фактически моя собственность уже семейство протокола с AF_INET6 на AF_INET
                  если бы сокет по указателю передавали бы — я бы не парился прибил старый и создал бы новый а так… мучаюсь

                  ЗЫ за ссылки спасибо изучаю.


                  nemez



                  Сообщ.
                  #8

                  ,
                  06.08.11, 11:05

                    Senior Member

                    ****

                    Рейтинг (т): 17

                    Цитата

                    вот и задумал — а не сменить ли мне у сокета который фактически моя собственность уже семейство протокола с AF_INET6 на AF_INET

                    если некоторые события от этого сокета отрабатываются уровнем выше, то сменив семейство на верхней ступеньке может наступить беда.

                    Цитата

                    если бы сокет по указателю передавали бы

                    а в системе по барабану, как он передан — по ссылке, указателю или вообще через гланды — сокет имеет идентификатор — 1, 2, 3, 5, 10 …..
                    по этому идентификатору система и идентифицирует некоторую структуру где-то в системной памяти. Короче, можно смело убивать и делать реассигн. Можно делать, главное — не внести сумятицу в верхнеуровневые событийные механизмы!

                    Добавлено 06.08.11, 11:15
                    короче гляди

                    ExpandedWrap disabled

                      x=socket( ….///блаблабла

                      // …..

                      printf(«%dn»,x);

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

                    ExpandedWrap disabled

                      int i = 10;

                    скармливаем коннекту в качестве значения SOCKET для коннекта, и вуаля!
                    тоесть то что ты боишься делать — можно, безо всяких указателей и ссылок. Сокет он сам по себе некоторый виртуальный указатель


                    progman



                    Сообщ.
                    #9

                    ,
                    06.08.11, 11:23

                      nemez
                      беда в том что вне плагина который пишу я есть еще их работа с сокетом. они его создали. у них есть переменная m_socket которая имеет какое то значение, пусть будет 10
                      я такой вот умный взял и создал новый сокет и законнектил к своему серверу.
                      как я им туда наверх скажу что m_socket уже не 10 а 11

                      Цитата nemez @ 06.08.11, 11:05

                      если некоторые события от этого сокета отрабатываются уровнем выше, то сменив семейство на верхней ступеньке может наступить беда.

                      беда не беда. заодно бы и узнал. только вот как сменить не разрушая сокет??!!


                      nemez



                      Сообщ.
                      #10

                      ,
                      06.08.11, 11:34

                        Senior Member

                        ****

                        Рейтинг (т): 17

                        попробуй не close() a shutdown() c повторным открытием…


                        progman



                        Сообщ.
                        #11

                        ,
                        06.08.11, 11:38

                          Цитата nemez @ 06.08.11, 11:34

                          попробуй не close() a shutdown() c повторным открытием…

                          один фиг не гарантии что при вызове функции socket новый будет иметь такой же дескриптор что и убиенный.


                          nemez



                          Сообщ.
                          #12

                          ,
                          06.08.11, 16:03

                            Senior Member

                            ****

                            Рейтинг (т): 17

                            самая ближайшее — поднять локально В6 сервак, и коннектиться на него! Ибо затея обернется таким гемором, что мало не покажется.
                            Либо в полном объеме согласовать уровни приложения и плагина


                            Хрен



                            Сообщ.
                            #13

                            ,
                            06.08.11, 16:28

                              Кстати, если таки есть связь с разрабами, то мож они могут и персонально для тебя создавать ipv4 сокет? Поменять-то пару строк всего нужно…
                              Судя по документации linux сокетов (которые такие же как и в винде, фактически), даже тип сокета изменять нельзя — можно только читать =(


                              Oleg2004



                              Сообщ.
                              #14

                              ,
                              06.08.11, 18:02

                                Цитата progman @ 06.08.11, 07:12

                                ситуация такая мне в длл приходит вызов — законнектить сокет на сервер. сокет уже создан до моего вызова, параметры его создания не известны.

                                1. Мне в дллку — это ваша собственная дллка?
                                2. Вызов — это просто заказ на коннект?
                                3. Дллка выступает в роли клиента?
                                4. Причем тут сервер?
                                Сервер создает свой сокет только при поступлении заявки……
                                Что-то я тут логики не нахожу…..
                                Потому что даже IPv6 адреса должны быть приведены к структуре sockaddr.
                                Еще раз и поконкретнее — типа пошагового алгоритма……


                                progman



                                Сообщ.
                                #15

                                ,
                                07.08.11, 09:20

                                  Цитата Oleg2004 @ 06.08.11, 18:02

                                  1. Мне в дллку — это ваша собственная дллка?

                                  да. длл моя а ехе не мой. длл это плагинн. сокет создается в ехе и передается в длл.

                                  Цитата Oleg2004 @ 06.08.11, 18:02

                                  2. Вызов — это просто заказ на коннект?

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

                                  Цитата Oleg2004 @ 06.08.11, 18:02

                                  3. Дллка выступает в роли клиента?

                                  как часть клиента. длл просто должна определить к какому серверу коннектиться также она выполняет роль «перекодировщика» . т.е отсылаемые пакеты приводит к стандарту понятному серверу под который она писалась.

                                  Цитата Oleg2004 @ 06.08.11, 18:02

                                  4. Причем тут сервер?

                                  именно тут вообще не причем. он где то там далеко стоит и ждет когда к нему постучатся поговорить ;-)

                                  Цитата Oleg2004 @ 06.08.11, 18:02

                                  Еще раз и поконкретнее — типа пошагового алгоритма……

                                  есть ехе. он через систему плагинов ( длл ) может работать с различными серверами. каждый сервер имет свой собственный протокол, порт ип.
                                  1.внутри ехе создается сокет.
                                  2. после создания сокета он как параметр передается в длл ( происходит вызов функции doConnect )
                                  3. внутри длл вызывается connect
                                  4. возвращается OK или FAILED

                                  с AF_INET6 работать не умею а в ехе сокет создается именно как AF_INET6. Попробовал поработать с IPv6 — куча непонятных проблем. Скажу честно ковыряться и разрешать их особого желания нет. Хочется по простому.
                                  вызов getaddrinfo для IPv4 адреса и последующий вызов connect и ведет к ошибке 10014.

                                  чтобы облегчить себе жизнь вижу два варианта:
                                  1. удалить старый сокет, создать новый и надеяться что дескриптор нового сокета будет равен старому иначе беда.
                                  2. изменить параметры полученного сокета так если бьы он слздавался как AF_INET

                                  п.1 я сделал — вроде ниразу не нарвался чтобы дискриптор менялся. но гарантии нету.
                                  как сделать п.2 потому что в моем случае он более правильный из всех неправильны я не знаю. ничего по теме не нагуглил.

                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                  0 пользователей:

                                  • Предыдущая тема
                                  • C/C++: Сетевое программирование
                                  • Следующая тема

                                  Рейтинг@Mail.ru

                                  [ Script execution time: 0,0365 ]   [ 16 queries used ]   [ Generated: 10.02.23, 02:42 GMT ]  

                                  Why does recvfrom always fail and I get the error 10014 (Bad address)?

                                  #include <winsock2.h>
                                  #include <stdio.h>
                                  
                                  int main() {
                                  	short port		= 39890;
                                  	SOCKET sock		= INVALID_SOCKET;
                                  	int err			= 0;
                                  	struct sockaddr_in senderaddr, recvaddr;
                                  	int senderaddrsize;
                                  	WSADATA wsadata;
                                  	const int recvsize = 1024;
                                  	char recvbuf[recvsize];
                                  	
                                  	if ( WSAStartup(MAKEWORD(2,2), &wsadata) != 0 ) {
                                  		return 1;
                                  	}
                                  	
                                  	sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
                                  	
                                  	if ( sock == INVALID_SOCKET ) {
                                  		WSACleanup();
                                  		return 1;
                                  	}
                                  	
                                  	recvaddr.sin_family			= AF_INET;
                                  	recvaddr.sin_port			= htons(port);
                                  	recvaddr.sin_addr.s_addr	= htonl(INADDR_ANY);
                                  	printf("Sever IP: %sn", inet_ntoa(recvaddr.sin_addr));
                                  	
                                  	err = bind(sock, (struct sockaddr *) &recvaddr, sizeof(recvaddr));
                                  	
                                  	if ( err != 0 ) {
                                  		printf("bind failed: %dn", WSAGetLastError());
                                  		return 1;
                                  	}
                                  	
                                  	printf("waiting for datagramsn");
                                  	err = recvfrom(sock, recvbuf, recvsize, 0, (struct sockaddr *) &senderaddr, &senderaddrsize);
                                  	
                                  	if ( err == SOCKET_ERROR ) {
                                  		printf("recvfrom error: %dn", WSAGetLastError());
                                  	}
                                  	
                                  	WSACleanup();
                                  	while ( 1 ) {
                                  	
                                  	}
                                  }


                                  int senderaddrsize = sizeof(senderaddr)

                                  I encounter this error when I was binding port to 443 (https). after reading some pages without any sense searched in my computer I realized VMWare Start a Windows Service named «VMWare Authorization Service» that perevent me to bind a socket in 443. after stop this service problem SOLVED!!!

                                  This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

                                  CodeProject,
                                  20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8
                                  +1 (416) 849-8900

                                  Error# 10014

                                  Error description: The system detected an invalid pointer address in attempting to use a pointer argument in a call.

                                  Reason: This error occurs if an application passes an invalid pointer value, or if the length of the buffer is too small. For instance, if the length of an argument, which is a SOCKADDR structure, is smaller than the sizeof(SOCKADDR)

                                  (posted by VictorN in 2003; https://forums.codeguru.com/showthread.php?468828-Socket-error-10014-when-sending)

                                  Suggestion:

                                  int BytesToSend = 120;
                                  int sendBytes = send(Soc, (char*) &BytesToSend, sizeof((char*)BytesToSend), 0);

                                  Question: I have 2 applications one behave as server and other is client. server and client share some data. Everything was working until i increased the size of data that goes from server to client. as you can see the debug output.

                                  debug output image

                                  How to apply the change described in Suggestion section?

                                  External function:

                                  Function integer send (int socket, ref blob buf, int len, int flags) Library «wsock32.dll» 

                                  Call to the send() function goes as following

                                  public function integer uf_senddata (unsignedinteger asocket, blob ab_data);boolean lb_error
                                  lb_error = false
                                  if not ib_initialized then
                                  	if uf_initialize() = SOCK_ERROR then
                                  		lb_error = true
                                  	end if
                                  end if
                                  
                                  int retval
                                  if not lb_error then
                                  //	blob lb_data
                                  //	lb_data = blob(as_data)
                                  	retval = send(asocket, ab_data, Len(ab_data),0)
                                  	if retval = SOCK_ERROR then
                                  		RecentError = uf_geterror()
                                  		lb_error = true
                                  	else
                                  		RecentError = 0
                                  		return retval  /// its not the error
                                  	end if
                                  end if
                                  
                                  If lb_error then
                                  	return SOCK_ERROR
                                  end if
                                  
                                  end function

                                  The call to the uf_senddata() is giving error because whole syntax of the dw was sent to it. But when i use just

                                  dwDataSyntax = dw_1.Object.DataWindow.Syntax.Data

                                  then there is no error (there is just one row but data will increase in future and i expect the same error)

                                  Integer ret
                                  	String 	dwsyntax
                                  	dwsyntax = LibraryExport(GetCurrentDirectory() + "dweQuery.srw", "dwe_query_status", ExportDataWindow!)	
                                  	ret = u_test.uf_senddata(clientsock, Blob(dwsyntax))
                                  	
                                  	IF Ret < 0 THEN
                                  		MessageBox(String(ret) + " :: " + String(RecentError), of_getErrorText(RecentError))
                                  	ELSE
                                  		MessageBox(of_getErrorText(RecentError), ret)
                                  	END IF

                                  Понравилась статья? Поделить с друзьями:

                                  Читайте также:

                                • Socket error 0 ошибка не работает
                                • Socket connection error bitrix яндекс касса
                                • Socket error errno 22 invalid argument
                                • Socket connect error 7 starting server and app
                                • Socket error errno 10061

                                • 0 0 голоса
                                  Рейтинг статьи
                                  Подписаться
                                  Уведомить о
                                  guest

                                  0 комментариев
                                  Старые
                                  Новые Популярные
                                  Межтекстовые Отзывы
                                  Посмотреть все комментарии