Socket error 10022 invalid argument

Hi,

Hi,

We’ve run into a strange problem where our network application runs fine from most network shares, but fails on a particular one. 

The socket() function returns an 10022 (WSAEINVAL) error when this occurs.  It runs fine locally and on most network shares.

Here’s a sample program that causes the error:

#include «stdafx.h»
#include <windows.h>
#include <winsock.h>
#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{

    WSADATA wsadata;
    //request socket version 2.2
    WORD vers = MAKEWORD (2, 2);
    int ret, sock;

    //initialize windows sockets
    ret = WSAStartup (vers, &wsadata);
    if (ret)
    {
        fprintf (stderr, «WSAStartup failed: rc: %dn», ret);   

        fprintf (stderr, «err: %lun», WSAGetLastError());
        return 1;
    }
    else
    {
        printf(«WSAStartup succeeded…n»);
    }

    printf(«WSA Information:n»);
    printf(«high ver: %d.%d ver: %d.%dn»,
        HIBYTE(wsadata.wHighVersion),
        LOBYTE(wsadata.wHighVersion),
        HIBYTE(wsadata.wVersion),
        LOBYTE(wsadata.wVersion));
    printf(«desc: %sn», wsadata.szDescription);
    printf(«stat: %sn», wsadata.szSystemStatus);
    printf(«max sock: %d max udp size: %dn», wsadata.iMaxSockets, wsadata.iMaxUdpDg);

    //create a simple socket
    sock = socket (AF_INET, SOCK_STREAM, 0);
    if (sock == INVALID_SOCKET)
    {
        int iErr = WSAGetLastError();
        LPVOID lpMsgBuf;
         FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER |

            FORMAT_MESSAGE_FROM_SYSTEM |
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            iErr,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR) &lpMsgBuf,
            0, NULL );

        
        fprintf (stderr, «socket failed: err: %lun %sn», iErr, lpMsgBuf);

        LocalFree(lpMsgBuf);
    }
    else
    {
        fprintf (stderr, «socket succeeded: %dn», sock);
        closesocket (sock);
    }
    WSACleanup ();
    return 0;
}

When run locally or on most shares you get success:

C:UserstestDesktop>SocketTest.exe

WSAStartup succeeded…

WSA Information:

high ver: 2.2 ver: 2.2

desc: WinSock 2.0

stat: Running

max sock: 0 max udp size: 0

socket
succeeded
: 68

When run from a certain network share:  (Q: is a mapped share, SocketTest.exe is located on the share)

Q:VISTA_trials>SocketTest.exe

WSAStartup succeeded…

WSA Information:

high ver: 2.2 ver: 2.2

desc: WinSock 2.0

stat: Running

max sock: 0 max udp size: 0

socket
failed
: err: 10022

 An invalid argument was supplied.

Since it works on most shares and locally, it makes me think it is some kind of security problem.  It fails the same way when run with Administrator permissions.  It reminds me of the .NET application running from a share permissions.  I didn’t
see anything suspicious with process monitor.  Unfortunately, I couldn’t step into the socket() function to see exactly where it fails.  I’m going to install a checked build of Vista to see if that helps.  Any idea on how to proceed / fix this
problem?  This looks like the same problem posted here: http://www.ureader.com/msg/14772558.aspx

Thanks,

Ben

Содержание

  1. Что делать если listen возвращает 10022?
  2. Socket error 10022 invalid argument
  3. Socket error 10022 invalid argument
  4. Socket error 10022 invalid argument

Что делать если listen возвращает 10022?

Пишу TCP сервер на MFC.
Инициализирую так:

Это всё запускается и работает в отдельном потоке.
Как итог — в лог бокс выводится «listen error».
Изначально всё работало нормально, но потом что-то изменил, не помню что, и всё работать перестало. Магия программирования.

  • Вопрос задан более двух лет назад
  • 149 просмотров

Простой 11 комментариев

Евгений Шатунов, Здравствуйте.
Получаю код ошибки:

В лог боксе выводит: listen error. Code error: 10022

WSAGetLastError — выдаёт 10022
Это: Недопустимый аргумент.
Был предоставлен какой-то недопустимый аргумент (например, указание недопустимого уровня для функции setsockopt). В некоторых случаях это также относится к текущему состоянию сокета—например, вызов accept на сокете, который не слушает.

Но что именно не так? Вроде всё верно ввёл, сокет слушает.

Изначально всё работало нормально, но потом что-то изменил, не помню что, и всё работать перестало.

Никогда не видел смысла использования гита в своих проектах

Этот смысл у тебя сейчас прямо перед глазами, но ты его все равно не видишь. Я правильно понимаю?
Ты просто физически не поднимешь даже небольшой проект с небольшим кодом в течении длительного времени без истории, веток, таймлапса и без возможности всегда вспомнить подробности написанного.

По поводу ошибки. Да, ты верно все написал про WSAEINVAL . Это буквально означает что ты передаешь именно в listen неправильные аргументы. Второй аргумент у тебя не может быть неправильным. Остается вопрос к первому — к сокету.

У bind [?] ты ошибку тоже не проверяешь. Стоит это сделать.

Евгений Шатунов, На bind ошибку тоже проверял, всё чисто.

Всегда выдаёт на listen. Менял порт, всё равно именно в listen выдаёт ошибку.

Error listen: 10022

WSAEINVAL The socket has not been bound with bind.

armadillo-cld, я несколько раз привел ссылку на документацию к bind . Ты ведь изучил документацию?
WSAGetLastError , согласно документации, вызывать нужно только когда bind возвращает SOCKET_ERROR . Только так ты можешь понять, что WSAGetLastError вернул код ошибки именно от bind .
И у listen точно так же. Тебе надо просто лучше обрабатывать ошибки. У тебя реальная ошибка может быть где угодно выше по тексту и ты ее просто проглядел.

Я рекомендую тебе к каждой функции прочитать документацию и писать свой код только в соответствии с документацией.

Источник

Socket error 10022 invalid argument

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

это в делфи
Project Project1.exe raised exception class EIdSocketError with message’ Socket Error # 10022 Invalid argument.’. Process stopped.Use Step or Run to continue.

а вот есть запустить скомпилированую программу
вот такая ошибка появляеться
Soket Error # 10022 Invalid argument.

вот код
unit Unit1;

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdHTTP, StdCtrls, ExtCtrls, ScktComp;

type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
IdHTTP1: TIdHTTP;
ClientSocket1: TClientSocket;
procedure Button1Click(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;

procedure TForm1.Button1Click(Sender: TObject);
var
buffer:TMemoryStream;
begin
buffer:=TMemoryStream.Create;

try
idHTTP1.Connect;
idHTTP1.Get(‘http://game.arbital.ru/board/userbars/ub3.php?port=27018’,buffer);
buffer.SaveToFile(‘C:WINDOWSTemp temp.png’);
Image1.Picture.LoadFromFile(‘C:WIN DOWSTemptemp.png’);
DeleteFile(‘C:WINDOWSTemptemp.pn g’);
IdHTTP1.Disconnect;
except
on E:Exception do ShowMessage(e.Message);
end;

В чём дело то? не понимаю, помогите .

Источник

Socket error 10022 invalid argument

I am in desperate need for some help with the new C++0x release, VS11 Beta and Winsock2. I can’t get the thread system to successfully merge with winsock.
When the #include is included in the Socket_Class.h (Custom class for socket ‘stuff’) it gives no compile error, however, when I try to ‘listen(SOCKET s, int backlog)’, the socket returns socket error 10022. The reason is the #include inside the Socket_Class header, I did track it down.
When I try to connect the socket and thread outside the class, in main.cpp for example, thread t(listenFunction); gives no compile error, but when I try to listen I recieve the 10038 socket error.

//Example of thread t(listenFunction)
void listenFunction()
<
Socket_Class sControl;
sControl.listen();
sControl.accept();
>

I have no idea why the socket error only occurs when I thread the listen(), or include # inside the class header, peculiar indeed!
Anyone experienced similar problems?

It might be a really basic error, but I can’t wrap my head around this, so thanks.

10036 WSAEINPROGRESS
Operation now in progress. A blocking operation is currently executing. Windows Sockets only allows a single blocking operation — per task or thread — to be outstanding, and if any other function call is made (whether or not it references that or any other socket) the function fails with the WSAEINPROGRESS error.

10022 WSAEINVAL
Invalid argument. Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt (Windows Sockets) function). In some instances, it also refers to the current state of the socket — for instance, calling accept (Windows Sockets) on a socket that is not listening.

You have a problem with the socket initialisation somewhere. Have you called WSAStartup? Have you checked all your error codes?

Источник

Socket error 10022 invalid argument

Один из клиентов связывается со мной и сообщает о постоянно возникающей ошибке. Случай именно единичный за два года использования данной реализации транспорта, но никак не могу понять в чем дело.
Ошибка именно 10022

Invalid argument.
Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket—for instance, calling accept on a socket that is not listening.

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

По логам происходит как минимум около 12 удачных вопрос-ответ сесий.

procedure TGSClientSocketItem.DoWrite;
var
ID: DWORD;

procedure SocketWrite(const ASocket: TGSClientSocketItem); stdcall;

procedure Complete(const dwError, cbTransferred: DWORD;
const lpOverlapped: LPWSAOVERLAPPED;
const dwFlags: DWORD); stdcall;
begin
if dwError <> 0 then
PostMessage(lpOverlapped.hEvent, SOCKET_NOTIFY_MSG, WSAGetLastError, FD_ERROR);
end;

var
Err: Integer;
Overlapped: _OVERLAPPED;
Buffer: WSABUF;
SndCount: DWORD;
begin
try
FillChar(Overlapped, SizeOf(_OVERLAPPED), #0);
Overlapped.hEvent := ASocket.FServer.FHandle; // Для нотификации об ошибке
Buffer.buf := Pointer(ASocket.FSendStream);
Buffer.len := Length(ASocket.FSendStream);
if WSASend(ASocket.FSocket, @Buffer, 1,
SndCount, 0, @Overlapped, @Complete) = SOCKET_ERROR then
begin
Err := WSAGetLastError;
if Err <> ERROR_IO_PENDING then
begin
ASocket.FServer.Error(Err);
ASocket.DelState(gsWriting);
Exit;
end;
end;
// Ждем пока не отправятся все данные
ASocket.FEvent := WSACreateEvent;
try
Err := WSAWaitForMultipleEvents(1, @ASocket.FEvent,
False, WSA_INFINITE, True);
if Err = WAIT_IO_COMPLETION then
begin
SetLength(ASocket.FSendStream, 0);
if Assigned(ASocket.FServer.FWrite) then
ASocket.FServer.FWrite(ASocket.FServer, ASocket);
end
else
ASocket.FServer.Error(WSAGetLastError);
finally
WSACloseEvent(ASocket.FEvent);
ASocket.DelState(gsWriting);
end;
finally
// Отправка уведомления о завершении потока
PostMessage(ASocket.FServer.FHandle, SOCKET_NOTIFY_MSG,
GetCurrentThread, FD_CLOSETHREAD);
end;
end;

begin
if Length(FSendStream) = 0 then
begin
AddState(gsReadyWrite);
Exit;
end;
AddState(gsWriting);
WriteThread := CreateThread(nil, 0, @SocketWrite, Self, 0, ID);
if WriteThread = 0 then
FServer.Error(GetLastError);
Sleep(10);
end;

Ошибка на выделенном WSASend.

Что подскажут мастера?


Digitman © ( 2005-12-23 08:25 ) [1]

А где ты такое описание ошибки выискал ?

Вот цитата из описания отказа WSAEINVAL (10022) для WSASend из MSDN:

The socket has not been bound with bind or the socket is not created with the overlapped flag.


Rouse_ © ( 2005-12-23 10:31 ) [2]

Оппа.
Протупил.
Не туда глядел. Чичас буду разбираться 🙂 Сенькс.

Источник

Thanks for reporting this @Suning79. I’m able to repro this and it appears to be a bug.

     System.Net.Sockets.Tests.UdpClientTest.UdpClient_ConnectAsync_Success [FAIL]
        System.Net.Sockets.SocketException : An invalid argument was supplied
        Stack Trace:
           S:c1srcSystem.Net.SocketssrcSystemNetSocketsSocket.cs(6029,0): at System.Net.Sockets.Socket.DoMultipleAddressConnectCallback(Object result, MultipleAddressConnectAsyncResult context)
           S:c1srcSystem.Net.SocketssrcSystemNetSocketsSocket.cs(5848,0): at System.Net.Sockets.Socket.DoDnsCallback(IAsyncResult result, MultipleAddressConnectAsyncResult context)
           S:c1srcSystem.Net.SocketssrcSystemNetSocketsSocket.cs(2419,0): at System.Net.Sockets.Socket.BeginConnect(String host, Int32 port, AsyncCallback requestCallback, Object state)
           S:c1srcSystem.Net.SocketssrcSystemNetSocketsSocketTaskExtensions.cs(62,0): at System.Net.Sockets.SocketTaskExtensions.<>c.<ConnectAsync>b__5_0(String targetHost, Int32 targetPort, AsyncCallback callback, Object state)
              at System.Threading.Tasks.TaskFactory`1.FromAsyncImpl[TArg1,TArg2](Func`5 beginMethod, Func`2 endFunction, Action`1 endAction, TArg1 arg1, TArg2 arg2, Object state, TaskCreationOptions creationOptions)
              at System.Threading.Tasks.TaskFactory.FromAsync[TArg1,TArg2](Func`5 beginMethod, Action`1 endMethod, TArg1 arg1, TArg2 arg2, Object state)
           S:c1srcSystem.Net.SocketssrcSystemNetSocketsSocketTaskExtensions.cs(61,0): at System.Net.Sockets.SocketTaskExtensions.ConnectAsync(Socket socket, String host, Int32 port)
           S:c1srcSystem.Net.Sockets.LegacytestsFunctionalTestsUdpClientTest.cs(62,0): at System.Net.Sockets.Tests.UdpClientTest.UdpClient_ConnectAsync_Success()

I’ve verified that the following code doesn’t throw on .Net Desktop:

            var c = new UdpClient();
            IAsyncResult ret = c.Client.BeginConnect("114.114.114.114", 53, null, null);
            ret.AsyncWaitHandle.WaitOne();
            c.Client.EndConnect(ret);

Содержание

  1. Windows socket error получен недопустимый аргумент 10022 on api wsacancelasyncrequest
  2. Windows socket error получен недопустимый аргумент 10022 on api wsacancelasyncrequest
  3. Windows socket error получен недопустимый аргумент 10022 on api wsacancelasyncrequest
  4. Answered by:
  5. Question
  6. Answers
  7. All replies

Windows socket error получен недопустимый аргумент 10022 on api wsacancelasyncrequest

Windows socket error: Получен недопустимый аргумент (10022), on API «WSACancelASyncRequest»
Написал клиента, без прокси работает все отлично, а вот когда через прокси вылазиет вот такая ошибка, хотя при этом все работает, В ClientOnError прописал ErrorCode:=0; не помогает. Подскажите как избавиться от это сообщения!

topdown
alekseyi © ( 2010-03-30 09:40 ) [1]

есть подозрение что все из за процедуры

я уже переделал так

mclient.close;
sleep(300);
mclient.open;
end;

topdown
Сергей М. © ( 2010-03-30 09:42 ) [2]

У тебя ошибка в программе

topdown
Сергей М. © ( 2010-03-30 09:54 ) [3]

Прокси здесь вообще ни причем.

Метод Сlose следует вызывать только для сокета, для которого ранее перед этим был вызван метод Open.

К тому же есть св-во Active, которым и следует пользоваться в таких случаях:

topdown
alekseyi © ( 2010-03-30 10:04 ) [4]

все оказалось просто!
клиент не успев отключиться опять подключается, поставил таймер примерно на 0,5 сек. и все!
так сказать
client.close
ждем

0,5 сек
client.open
все без запарок
Спасибо за помощь

Это не решение, а новые грабли.
Рано или поздно ты на них наступишь и будет больно.

topdown
alekseyi © ( 2010-03-30 10:27 ) [6]

topdown
Сергей М. © ( 2010-03-30 10:32 ) [7]

Предлагаю открыть справку и ВНИМАТЕЛЬНО изучить события этого компонента, в частности события OnConnect, OnDisconnect.
Они же не для Пушкина придуманы)

topdown
brother © ( 2010-03-30 10:34 ) [8]

> Они же не для Пушкина придуманы)

Да уж. бедный Пушкин.

Источник

Windows socket error получен недопустимый аргумент 10022 on api wsacancelasyncrequest

Windows socket error: Получен недопустимый аргумент (10022), on API «WSACancelASyncRequest»
Написал клиента, без прокси работает все отлично, а вот когда через прокси вылазиет вот такая ошибка, хотя при этом все работает, В ClientOnError прописал ErrorCode:=0; не помогает. Подскажите как избавиться от это сообщения!

topdown
alekseyi © ( 2010-03-30 09:40 ) [1]

есть подозрение что все из за процедуры

я уже переделал так

mclient.close;
sleep(300);
mclient.open;
end;

topdown
Сергей М. © ( 2010-03-30 09:42 ) [2]

У тебя ошибка в программе

topdown
Сергей М. © ( 2010-03-30 09:54 ) [3]

Прокси здесь вообще ни причем.

Метод Сlose следует вызывать только для сокета, для которого ранее перед этим был вызван метод Open.

К тому же есть св-во Active, которым и следует пользоваться в таких случаях:

topdown
alekseyi © ( 2010-03-30 10:04 ) [4]

все оказалось просто!
клиент не успев отключиться опять подключается, поставил таймер примерно на 0,5 сек. и все!
так сказать
client.close
ждем

0,5 сек
client.open
все без запарок
Спасибо за помощь

Это не решение, а новые грабли.
Рано или поздно ты на них наступишь и будет больно.

topdown
alekseyi © ( 2010-03-30 10:27 ) [6]

topdown
Сергей М. © ( 2010-03-30 10:32 ) [7]

Предлагаю открыть справку и ВНИМАТЕЛЬНО изучить события этого компонента, в частности события OnConnect, OnDisconnect.
Они же не для Пушкина придуманы)

topdown
brother © ( 2010-03-30 10:34 ) [8]

> Они же не для Пушкина придуманы)

Да уж. бедный Пушкин.

Источник

Windows socket error получен недопустимый аргумент 10022 on api wsacancelasyncrequest

This forum is closed. Thank you for your contributions.

trans

Answered by:

trans

Question

trans

trans

We’ve run into a strange problem where our network application runs fine from most network shares, but fails on a particular one.

The socket() function returns an 10022 (WSAEINVAL) error when this occurs. It runs fine locally and on most network shares.

Here’s a sample program that causes the error:

#include «stdafx.h»
#include
#include
#include

int _tmain(int argc, _TCHAR* argv[])
<

WSADATA wsadata;
//request socket version 2.2
WORD vers = MAKEWORD (2, 2);
int ret, sock;

//initialize windows sockets
ret = WSAStartup (vers, &wsadata);
if (ret)
<
fprintf (stderr, «WSAStartup failed: rc: %dn», ret);
fprintf (stderr, «err: %lun», WSAGetLastError());
return 1;
>
else
<
printf(«WSAStartup succeeded. n»);
>

printf(«WSA Information:n»);
printf(«high ver: %d.%d ver: %d.%dn»,
HIBYTE(wsadata.wHighVersion),
LOBYTE(wsadata.wHighVersion),
HIBYTE(wsadata.wVersion),
LOBYTE(wsadata.wVersion));
printf(«desc: %sn», wsadata.szDescription);
printf(«stat: %sn», wsadata.szSystemStatus);
printf(«max sock: %d max udp size: %dn», wsadata.iMaxSockets, wsadata.iMaxUdpDg);

//create a simple socket
sock = socket (AF_INET, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET)
<
int iErr = WSAGetLastError();
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
iErr,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );

fprintf (stderr, «socket failed: err: %lun %sn», iErr, lpMsgBuf);

LocalFree(lpMsgBuf);
>
else
<
fprintf (stderr, «socket succeeded: %dn», sock);
closesocket (sock);
>
WSACleanup ();
return 0;
>

When run locally or on most shares you get success:

high ver: 2.2 ver: 2.2

max sock: 0 max udp size: 0

socket succeeded : 68

When run from a certain network share: (Q: is a mapped share, SocketTest.exe is located on the share)

high ver: 2.2 ver: 2.2

max sock: 0 max udp size: 0

socket failed : err: 10022

An invalid argument was supplied.

Answers

trans

trans

Success! We managed to figure out the problem. It has to do with users not having read access at higher level directories.

User is running Vista / Windows 7

The shares are set up like this:

User has no permissions on \servershare

User has read permissions on \serversharesubfolder

User can map \serversharesubfolder

User tries to run executable that uses sockets \serversharesubfoldersample.exe

socket() fails with error 10022

Granting the user read access on \servershare resolves the problem. However, it is still a Windows bug. It shouldn’t matter where else the user has permissions, as long as they have correct permissions on the executable location.

trans

trans

I’ll clarify the problem a little bit more and provide some more information that I’ve obtained.

Another microsoft moderator pointed out that the call to socket should be:

sock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);

After changing the call to this, the problem still occurs. This is expected because the application runs fine on the local machine or on other shares.

Anyways, I installed a checked build of Vista and started tracing the calls, and found out where it fails and where the invalid argument error occurs.

Here’s the «call stack»

The function call that fails is NtCreateFile. The file it is trying to open is «DeviceAfdEndpoint» It returns an error code of 0xC000225 (Status Not Found). The IoStatusBlock.Information value is 0x1 (FILE_OPENED) after the call.

0x508-MSWSOCK> NtStatusToSocketError: unable to map 0xC0000225, returning

So, it seems to me that our process when run from this share doesn’t have the correct permissions to open/create DeviceAfdEndpoint» when running from the problem network share. I’m running as Administrator with UAC disabled, so there shouldn’t be any issues there.

The share is using DFS, if that makes any difference. What can I do to figure out this problem? Thanks,

Источник

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

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

  • Socket error 10022 delphi
  • So open error sxxapi01
  • So error 31233
  • Sntp server communication error oki
  • Snowrunner тормозит как исправить

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

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