|
От: |
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>Что это может быть и как с этим бороться?
Ошибка в программе, передавать правильные параметры.
Нет ничего невозможного..
|
От: | Аноним | |
Дата: | 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?
Нет ничего невозможного..
|
От: |
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
);
Нет ничего невозможного..
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, и читайте, если будет мало, дочитаете в следующем вызове.
Нет ничего невозможного..
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.»)…
Нет ничего невозможного..
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>
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>
Нет ничего невозможного..
- Переместить
- Удалить
- Выделить ветку
Пока на собственное сообщение не было ответов, его можно удалить.
- 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
|
|
|
вызываю connect — ловлю ошибку 10014.
, как лечить?
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
ситуация ткая мне в длл приходит вызов — законнектить сокет на сервер. сокет уже создан до моего вызова, параметры его создания не известны. вот код: 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 то все ок. проходит. |
nemez |
|
Senior Member Рейтинг (т): 17 |
может быть что просто неправильно передалось значение. Проверить бы значение mConnectSocket до передачи в ДЛЛ и после! Параметры менять не желательно! Скажем если сокет клиент TCP, то прежде чем менять его на UDP, нужно отконнектиться от сервера. Если сокет серверный и мы меняем его на UDP — нам нада поотрубать клиентов. Сообщение отредактировано: nemez — 06.08.11, 07:38 |
progman |
|
nemez созвонился с теми кто другой модуль писал — они под IPv6 семейство сокет создавали. можно как то у уже созданного сокета но не законнекченного сменить семейство тип и протокол ? |
Хрен |
|
Разве что поиграться с setsockopt и этими значениями (они не из сей вроде, но один хрен =) ) |
progman |
|
Хрен |
nemez |
|
Senior Member Рейтинг (т): 17 |
progman |
progman |
|
nemez он, сервак, пока только по IPv4 работает. с IPv6 никогда дел не имел и все попытки законнектить терпят фиаско. пока тренируюсь на локальном. у локального адрес 192.168.0.7 — пытался скормить его в структуру адресинфо — фиг вот и задумал — а не сменить ли мне у сокета который фактически моя собственность уже семейство протокола с AF_INET6 на AF_INET ЗЫ за ссылки спасибо изучаю. |
nemez |
|
Senior Member Рейтинг (т): 17 |
Цитата вот и задумал — а не сменить ли мне у сокета который фактически моя собственность уже семейство протокола с AF_INET6 на AF_INET если некоторые события от этого сокета отрабатываются уровнем выше, то сменив семейство на верхней ступеньке может наступить беда. Цитата если бы сокет по указателю передавали бы
а в системе по барабану, как он передан — по ссылке, указателю или вообще через гланды — сокет имеет идентификатор — 1, 2, 3, 5, 10 ….. Добавлено 06.08.11, 11:15 x=socket( ….///блаблабла // ….. printf(«%dn»,x);
ну и пусть после создания сокета оно вывело число 10, к примеру! int i = 10;
скармливаем коннекту в качестве значения SOCKET для коннекта, и вуаля! |
progman |
|
nemez Цитата nemez @ 06.08.11, 11:05 если некоторые события от этого сокета отрабатываются уровнем выше, то сменив семейство на верхней ступеньке может наступить беда. беда не беда. заодно бы и узнал. только вот как сменить не разрушая сокет??!! |
nemez |
|
Senior Member Рейтинг (т): 17 |
попробуй не close() a shutdown() c повторным открытием… |
progman |
|
Цитата nemez @ 06.08.11, 11:34 попробуй не close() a shutdown() c повторным открытием… один фиг не гарантии что при вызове функции socket новый будет иметь такой же дескриптор что и убиенный. |
nemez |
|
Senior Member Рейтинг (т): 17 |
самая ближайшее — поднять локально В6 сервак, и коннектиться на него! Ибо затея обернется таким гемором, что мало не покажется. |
Хрен |
|
Кстати, если таки есть связь с разрабами, то мож они могут и персонально для тебя создавать ipv4 сокет? Поменять-то пару строк всего нужно… |
Oleg2004 |
|
Цитата progman @ 06.08.11, 07:12 ситуация такая мне в длл приходит вызов — законнектить сокет на сервер. сокет уже создан до моего вызова, параметры его создания не известны.
1. Мне в дллку — это ваша собственная дллка? |
progman |
|
Цитата 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 Еще раз и поконкретнее — типа пошагового алгоритма……
есть ехе. он через систему плагинов ( длл ) может работать с различными серверами. каждый сервер имет свой собственный протокол, порт ип. с AF_INET6 работать не умею а в ехе сокет создается именно как AF_INET6. Попробовал поработать с IPv6 — куча непонятных проблем. Скажу честно ковыряться и разрешать их особого желания нет. Хочется по простому. чтобы облегчить себе жизнь вижу два варианта: п.1 я сделал — вроде ниразу не нарвался чтобы дискриптор менялся. но гарантии нету. |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- C/C++: Сетевое программирование
- Следующая тема
[ 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