Winsock error 10038

Attempt to send a message through a socket failed with WinSock error 10038. After around 40 seconds, messages are received successfully from the same socket and subsequently the send() is also succ...

Attempt to send a message through a socket failed with WinSock error 10038. After around 40 seconds, messages are received successfully from the same socket and subsequently the send() is also succeeding in the same socket. This behaviour has been witnessed in Windows Server 2003. Is this any known behaviour with WinSock and Windows Server 2003?

asked Sep 19, 2008 at 6:37

2

Winsock error 10038 means «An operation was attempted on something that is not a socket».

Little trick to find info about error codes (usefull for all sorts of windows error codes):

  • Open a command prompt
  • Type «net helpmsg 10038»

What language is your application written in? If it’s C/C++, could it be that you are using an invalid socket handle?

answered Sep 19, 2008 at 12:46

Otherside's user avatar

OthersideOtherside

2,79521 silver badges21 bronze badges

Thanks so much to a_mole for the idea of checking for layered winsock providers. We are having problems with some of our PC’s and TimesTen DB. When we try to setup and ODBC Client DSN, we get a 10038 error. On examining the netsh output from the affected PC’s, we found that they have Embassy Trust Suite by Wave Systems installed. Evidently Dell pre-installed this on some of their PC’s. Anyway, on uninstalling this software, the problem has been solved.

Thanks again

Lou

answered Feb 3, 2010 at 17:38

Lou's user avatar

Not a platform issue, I can guarantee that. Most likely, whatever variable you are using to access the socket handle is not thread-safe and is being used in the send() call before the actual socket is created.

Another possible cause is the presence of layered winsock providers. «netsh winsock show» at a cmd prompt will show you the installed providers and you can try removing any non-microsoft ones.

answered Feb 20, 2009 at 23:46

This server works great. Although it is olny for four people.
I think I fixed all the problems, although it’s actually a completly different program now.

#include <sys/time.h>#include <stdio.h>#include <stdlib.h>#include <AzjSock.h>char packe[512];SOCKET ov;bool fours[3];SOCKET fc[3];int error;bool rk(SOCKET sk){int ooo = 0;ooo = recv(sk,packe,sizeof(packe),0);cout<<"Number recived was... "<<ooo<<"n";if(ooo > 0){packe[ooo] = '';cout<<"Recived: n";cout<<packe;cout<<"n";send(sk,"Recived.",8,0);}if(ooo < 1){return true;}return false;}int main(int argc, char *argv[]){fc[0] = NULL;fc[1] = NULL;fc[2] = NULL;fc[3] = NULL;                                         DWORD Flags;                                       DWORD Rec;                                                  WSABUF DataBuf;char buff[1000];    WSA2S();SOCKET server;server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); SOCKADDR_IN sinServer;memset(&sinServer, 0, sizeof(sinServer));sinServer.sin_family = AF_INET;sinServer.sin_addr.s_addr = INADDR_ANY; // Where to start server?sinServer.sin_port = htons(PORT); // Port        if(bind(server, (LPSOCKADDR)&sinServer, sizeof(sinServer)) == SOCKET_ERROR){ easymsg("Couldn't bind."); }if(listen(server,9)){ easymsg("Listen failed."); }ioctlsocket(server, FIONBIO, &iMode);FD_SET Reader;                 while (true){        FD_ZERO(&Reader);            FD_SET(server, &Reader);if(fours[0]){ FD_SET(fc[0], &Reader); }if(fours[1]){ FD_SET(fc[1], &Reader); }if(fours[2]){ FD_SET(fc[2], &Reader); }if(fours[3]){ FD_SET(fc[3], &Reader); }                     if(error = select(0,&Reader,NULL,NULL,NULL))                     {                     //if(error == -1){ cout<<"Select error: "<<WSAGetLastError()<<"n"; }                               if(FD_ISSET(server,&Reader))                               {                              // cout<<"Server socket 'isset'n";                                        if(fours[0] == false || fours[1] == false || fours[2] == false || fours[3] == false){                                                                                                  SOCKET ATemp;                                              bool accepted = false;                                              if((ATemp = accept(server,NULL,NULL)) != INVALID_SOCKET){                                                                                                    ioctlsocket(ATemp,FIONBIO,&iMode);                                                                                                      if((!fours[0]) && !(accepted)){                                                   fours[0] = true;                                                   fc[0] = ATemp;                                                   accepted = true;                                                   }                                                                                                      if(fours[0] && !(fours[1]) && !(accepted)){                                                   fours[1] = true;                                                   fc[1] = ATemp;                                                   accepted = true;                                                   }                                                                                                      if(fours[0] && fours[1] && !(fours[2]) && !(accepted)){                                                   fours[2] = true;                                                   fc[2] = ATemp;                                                   accepted = true;                                                   }                                                                                                      if(fours[0] && fours[1] && fours[2] && !(fours[3]) && !(accepted)){                                                   fours[3] = true;                                                   fc[3] = ATemp;                                                   accepted = true;                                                   }                                                                                                      if(fours[0] && fours[1] && fours[2] && fours[3] && !(accepted)){                                                   ov = ATemp;                                                   closesocket(ATemp);                                                   closesocket(ov);                                                   }                                                                                                                                                                                                            cout<<"Accepted a client.n";                                                                                                 }                                    }                                                                   }                                                                                                   if(fours[0]){                                    if(FD_ISSET(fc[0],&Reader)){                                    //cout<<"Client socket is ready to send/recv.n";                                      if(rk(fc[0])){                                     cout<<"Closing socket 'array 0'. n";                                     fours[0] = false;                                     closesocket(fc[0]);                                     }                                    }                                    }                                                                        if(fours[1]){                                    if(FD_ISSET(fc[1],&Reader)){                                    //cout<<"Client socket is ready to send/recv.n";                                       if(rk(fc[1])){                                     fours[1] = false;                                     closesocket(fc[1]);                                     }                                                                                                  }                                    }                                                                        if(fours[2]){                                    if(FD_ISSET(fc[2],&Reader)){                                    //cout<<"Client socket is ready to send/recv.n";                                                                             if(rk(fc[2])){                                     fours[2] = false;                                     closesocket(fc[2]);                                     }                                                                                               }                                    }                                                                        if(fours[3]){                                    if(FD_ISSET(fc[3],&Reader)){                                    //cout<<"Client socket is ready to send/recv.n";                                                                         if(rk(fc[3])){                                     fours[3] = false;                                     closesocket(fc[3]);                                     }                                                                                                 }                                    }                                                           }              Sleep(5);}     closesocket(server);WSACleanup();}

  1. 27.06.2012, 14:50


    #1

    Crazy вне форума


    Новичок


    Помогите!!!

    Вылитает такая ошибка: Невозможна операция записи (5064). Код ошибки WinSock: 10038
    Подскажите что делать? Как её исправить? Если можно то поподробнее. Заранее благодарю!


  2. 27.06.2012, 15:09


    #2

    SH вне форума


    ТВОРЕЦ СЧАСТЬЯ

    Аватар для SH


    Crazy, какая версия, при каких операциях, какая система, когда началось, после чего. Хотите подробнее — вначале расскажите толком, что у Вас вообще происходит.

    Алексей Аркадьев

    Когда заказчик ищет волшебника, то чаще всего он находит сказочника.
    Если у Вас есть вопрос по поддержке — напишите его на форуме, я обязательно отвечу, если знаю ответ.
    Если Вам нужны какие-то файлы, пишите на почту: support@carbis.ru, но вначале посмотрите в разделе для скачивания.
    Для коммерческих вопросов:
    +7 (495) 740-49-91, или на почту: sales@carbis.ru


  3. 27.06.2012, 15:39


    #3

    Crazy вне форума


    Новичок


    Буквально сегодня начались проблемы в store house. Метрдотель проводить выручку за март месяц и сразу появляется такая ошибка. До этого все было хорошо.


  4. 27.06.2012, 18:21


    #4

    SH вне форума


    ТВОРЕЦ СЧАСТЬЯ

    Аватар для SH


    Crazy, из Вас никто ничего вытягивать не будет, это у Вас проблемы, а не у нас. Внимательно прочтите, что я у Вас спрашивал, и ответьте подробно на все вопросы.

    Алексей Аркадьев

    Когда заказчик ищет волшебника, то чаще всего он находит сказочника.
    Если у Вас есть вопрос по поддержке — напишите его на форуме, я обязательно отвечу, если знаю ответ.
    Если Вам нужны какие-то файлы, пишите на почту: support@carbis.ru, но вначале посмотрите в разделе для скачивания.
    Для коммерческих вопросов:
    +7 (495) 740-49-91, или на почту: sales@carbis.ru


  5. 22.05.2013, 07:25


    #5

    Raziel38 вне форума


    Разбирающийся


    проблема почти аналогична, но с другими цифрами. «невозможна операция чтения 5065, код ошибки winsock 10053». вылетает при попытке вывести ведомость остатков, более простые операции проходят на ура. здесь же на форуме читал, что нужно увеличить таймаут, с 500 увеличил до 3000. не помогло. сервак на другом компе запускается как служба под управлением хп. ведомость остатков пытаюсь просмотреть на вин7. версия сх 4.64
    запускал сервер вручную. тоже не помогло.


  6. 22.05.2013, 14:48


    #6

    SH вне форума


    ТВОРЕЦ СЧАСТЬЯ

    Аватар для SH


    Raziel38, таймаут надо увеличивать, ну, допустим, до 20000. Или 360000.
    Надо попробовать запустить там же, где сервер стоит, локально — это раз.
    Надо сделать проверку базы, через shcheck и через sdb manager — это два.

    Алексей Аркадьев

    Когда заказчик ищет волшебника, то чаще всего он находит сказочника.
    Если у Вас есть вопрос по поддержке — напишите его на форуме, я обязательно отвечу, если знаю ответ.
    Если Вам нужны какие-то файлы, пишите на почту: support@carbis.ru, но вначале посмотрите в разделе для скачивания.
    Для коммерческих вопросов:
    +7 (495) 740-49-91, или на почту: sales@carbis.ru


  7. 23.05.2013, 06:02


    #7

    Raziel38 вне форума


    Разбирающийся


    SH, спасибо, сегодня попробую. отпишусь.
    попробовал. постепенно увеличивал таймаут до 36 с 6 нулями не помогло. локально запускается. утилитой проверил, пишет нет ошибок. ещё попробовал другие операции с отчётами, только ведомость остатков не работает и если пытаешься сохранить документ. происходит как бы дисконнект с сервером при этих операциях. далее приходится снова соединяться, иначе ничего не работает. попробовал перекинуть сервер на проблемный комп с вин7, так на нём всё заработало, но перестал формироваться список накладных на компе с хп, на котором раньше стоял сервер. пришлось вернуть всё на свои места.

    Последний раз редактировалось Raziel38; 04.06.2013 в 05:05.


  8. 01.06.2015, 18:50


    #8

    Арт вне форума


    Сведущий


    Здравствуйте! при проведении расхода, выдает следующую ошибку «Слишком большая высота дерева индекса «iExpSpecGoods0», Ошибка сервера Sdbserv 153.Объект = «iExpSpecGoods0». Параметр = 0. Ошибка Win32 = 0. Что это значит???


  9. 01.06.2015, 19:23


    #9

    SH вне форума


    ТВОРЕЦ СЧАСТЬЯ

    Аватар для SH


    А почему в этой теме-то вопрос…———- Добавлено в 18:23 ———- Предыдущее сообщение было размещено в 18:21 ———-Обычный поиск по форуму выдает на первом же месте аналогичную тему с этой же проблемой.
    Прогнозы неутешительные.

    Алексей Аркадьев

    Когда заказчик ищет волшебника, то чаще всего он находит сказочника.
    Если у Вас есть вопрос по поддержке — напишите его на форуме, я обязательно отвечу, если знаю ответ.
    Если Вам нужны какие-то файлы, пишите на почту: support@carbis.ru, но вначале посмотрите в разделе для скачивания.
    Для коммерческих вопросов:
    +7 (495) 740-49-91, или на почту: sales@carbis.ru


  10. 15.07.2015, 10:22


    #10

    vvv вне форума


    Интересующийся


    Невозможна операция записи (5064). Код ошибки WinSock: 10038

    вопрос то как решился?

    Последний раз редактировалось vvv; 16.07.2015 в 08:09.


From Microsoft’s Knowledge base:

WSAEACCES (10013)

Permission
denied.

An attempt was made to access a socket in a way forbidden by its
access permissions. An example is using a broadcast address for «sendto»
without broadcast permission being set using
setsockopt(SO_BROADCAST).

WSAEADDRINUSE (10048)

Address already
in use.

Only one usage of each socket address (protocol/IP address/port)
is normally permitted. This error occurs if an program attempts to bind a
socket to an IP address/port that has already been used for an existing socket,
or a socket that wasn’t closed properly, or one that is still in the process of
closing. For server programs that need to bind multiple sockets to the same
port number, consider using setsockopt(SO_REUSEADDR). Client programs usually
need not call bind at all — connect will choose an unused port
automatically.

WSAEADDRNOTAVAIL (10049)

Cannot assign requested
address.

The requested address is not valid in its context. Normally
results from an attempt to bind to an address that is not valid for the local
machine, or connect/sendto an address or port that is not valid for a remote
machine (e.g. port 0).

WSAEAFNOSUPPORT (10047)

Address family not
supported by protocol family.

An address incompatible with the requested
protocol was used. All sockets are created with an associated «address family»
(i.e. AF_INET for Internet Protocols) and a generic protocol type (i.e.
SOCK_STREAM). This error will be returned if an incorrect protocol is
explicitly requested in the socket call, or if an address of the wrong family
is used for a socket, e.g. in sendto.

WSAEALREADY
(10037)

Operation already in progress.

An operation was attempted
on a non-blocking socket that already had an operation in progress — i.e.
calling connect a second time on a non-blocking socket that is already
connecting, or canceling an asynchronous request (WSAAsyncGetXbyY) that has
already been canceled or completed.

WSAECONNABORTED
(10053)

Software caused connection abort.

An established
connection was aborted by the software in your host machine, possibly due to a
data transmission timeout or protocol error.

WSAECONNREFUSED
(10061)

Connection refused.

No connection could be made because
the target machine actively refused it. This usually results from trying to
connect to a service that is inactive on the foreign host — i.e. one with no
server program running.

WSAECONNRESET (10054)

Connection reset by
peer.

A existing connection was forcibly closed by the remote host. This
normally results if the peer program on the remote host is suddenly stopped,
the host is rebooted, or the remote host used a «hard close» (see setsockopt
for more information on the SO_LINGER option on the remote
socket.)

WSAEDESTADDRREQ (10039)

Destination address
required.

A required address was omitted from an operation on a socket.
For example, this error will be returned if sendto is called with the remote
address of ADDR_ANY.

WSAEFAULT (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 program 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 struct sockaddr is smaller than sizeof(struct
sockaddr).

WSAEHOSTDOWN (10064)

Host is down.

A socket
operation failed because the destination host was down. A socket operation
encountered a dead host. Networking activity on the local host has not been
initiated. These conditions are more likely to be indicated by the error
WSAETIMEDOUT.

WSAEHOSTUNREACH (10065)

No route to host.

A
socket operation was attempted to an unreachable host. See
WSAENETUNREACH

WSAEINPROGRESS (10036)

Operation now in
progress.

A blocking operation is currently executing. Windows Sockets
only allows a single blocking operation to be outstanding per task (or thread),
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.

WSAEINTR (10004)

Interrupted function call.

A
blocking operation was interrupted by a call to
WSACancelBlockingCall.

WSAEINVAL (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.

WSAEISCONN (10056)

Socket is already
connected.

A connect request was made on an already connected socket.
Some implementations also return this error if sendto is called on a connected
SOCK_DGRAM socket (For SOCK_STREAM sockets, the to parameter in sendto is
ignored), although other implementations treat this as a legal
occurrence.

WSAEMFILE (10024)

Too many open files.

Too
many open sockets. Each implementation may have a maximum number of socket
handles available, either globally, per process or per
thread.

WSAEMSGSIZE (10040)

Message too long.

A message
sent on a datagram socket was larger than the internal message buffer or some
other network limit, or the buffer used to receive a datagram into was smaller
than the datagram itself.

WSAENETDOWN (10050)

Network is
down.

A socket operation encountered a dead network. This could indicate
a serious failure of the network system (the protocol stack that the WinSock
DLL runs over), the network interface, or the local network
itself.

WSAENETRESET (10052)

Network dropped connection on
reset.

The host you were connected to crashed and rebooted. May also be
returned by setsockopt if an attempt is made to set SO_KEEPALIVE on a
connection that has already failed.

WSAENETUNREACH
(10051)

Network is unreachable.

A socket operation was attempted
to an unreachable network. This usually means the local software knows no route
to reach the remote host.

WSAENOBUFS (10055)

No buffer space
available.

An operation on a socket could not be performed because the
system lacked sufficient buffer space or because a queue was
full.

WSAENOPROTOOPT (10042)

Bad protocol option.

An
unknown, invalid or unsupported option or level was specified in a getsockopt
or setsockopt call.

WSAENOTCONN (10057)

Socket is not
connected.

A request to send or receive data was disallowed because the
socket is not connected and (when sending on a datagram socket using sendto) no
address was supplied. Any other type of operation might also return this error
— for example, setsockopt setting SO_KEEPALIVE if the connection has been
reset.

WSAENOTSOCK (10038)

Socket operation on
non-socket.

An operation was attempted on something that is not a
socket. Either the socket handle parameter did not reference a valid socket, or
for select, a member of an fd_set was not valid.

WSAEOPNOTSUPP
(10045)

Operation not supported.

The attempted operation is not
supported for the type of object referenced. Usually this occurs when a socket
descriptor to a socket that cannot support this operation, for example, trying
to accept a connection on a datagram socket.

WSAEPFNOSUPPORT
(10046)

Protocol family not supported.

The protocol family has
not been configured into the system or no implementation for it exists. Has a
slightly different meaning to WSAEAFNOSUPPORT, but is interchangeable in most
cases, and all Windows Sockets functions that return one of these specify
WSAEAFNOSUPPORT.

WSAEPROCLIM (10067)

Too many processes.

A
Windows Sockets implementation may have a limit on the number of programs that
may use it simultaneously. WSAStartup may fail with this error if the limit has
been reached.

WSAEPROTONOSUPPORT (10043)

Protocol not
supported.

The requested protocol has not been configured into the
system, or no implementation for it exists. For example, a socket call requests
a SOCK_DGRAM socket, but specifies a stream protocol.

WSAEPROTOTYPE
(10041)

Protocol wrong type for socket.

A protocol was specified
in the socket function call that does not support the semantics of the socket
type requested. For example, the ARPA Internet UDP protocol cannot be specified
with a socket type of SOCK_STREAM.

WSAESHUTDOWN (10058)

Cannot
send after socket shutdown.

A request to send or receive data was
disallowed because the socket had already been shut down in that direction with
a previous shutdown call. By calling shutdown a partial close of a socket is
requested, which is a signal that sending or receiving or both has been
discontinued.

WSAESOCKTNOSUPPORT (10044)

Socket type not
supported.

The support for the specified socket type does not exist in
this address family. For example, the optional type SOCK_RAW might be selected
in a socket call, and the implementation does not support SOCK_RAW sockets at
all.

WSAETIMEDOUT (10060)

Connection timed out.

A
connection attempt failed because the connected party did not properly respond
after a period of time, or established connection failed because connected host
has failed to respond.

WSAEWOULDBLOCK (10035)

Resource
temporarily unavailable.

This error is returned from operations on
non-blocking sockets that cannot be completed immediately, for example recv
when no data is queued to be read from the socket. It is a non-fatal error, and
the operation should be retried later. It is normal for WSAEWOULDBLOCK to be
reported as the result from calling connect on a non-blocking SOCK_STREAM
socket, since some time must elapse for the connection to be
established.

WSAHOST_NOT_FOUND (11001)

Host not found.

No
such host is known. The name is not an official hostname or alias, or it cannot
be found in the database(s) being queried. This error may also be returned for
protocol and service queries, and means the specified name could not be found
in the relevant database.

WSA_INVALID_HANDLE (OS
dependent)

Specified event object handle is invalid.

An program
attempts to use an event object, but the specified handle is not
valid.

WSA_INVALID_PARAMETER (OS dependent)

One or more
parameters are invalid.

An program used a Windows Sockets function which
directly maps to a Win32 function. The Win32 function is indicating a problem
with one or more parameters.

WSAINVALIDPROCTABLE (OS
dependent)

Invalid procedure table from service provider.

A
service provider returned a bogus proc table to WS2_32.DLL. (Usually caused by
one or more of the function pointers being NULL.)

WSAINVALIDPROVIDER (OS
dependent)

Invalid service provider version number.

A service
provider returned a version number other than 2.0.

WSA_IO_PENDING (OS
dependent)

Overlapped operations will complete later.

The program
has initiated an overlapped operation which cannot be completed immediately. A
completion indication will be given at a later time when the operation has been
completed.

WSA_IO_INCOMPLETE (OS dependent)

Overlapped I/O event
object not in signaled state.

The program has tried to determine the
status of an overlapped operation which is not yet completed. Programs that use
WSAWaitForMultipleEvents in a polling mode to determine when an overlapped
operation has completed will get this error code until the operation is
complete.

WSA_NOT_ENOUGH_MEMORY (OS dependent)

Insufficient
memory available.

An program used a Windows Sockets function which
directly maps to a Win32 function. The Win32 function is indicating a lack of
required memory resources.

WSANOTINITIALISED (10093)

Successful
WSAStartup not yet performed.

Either the program has not called
WSAStartup or WSAStartup failed. The program may be accessing a socket which
the current active task does not own (i.e. trying to share a socket between
tasks), or WSACleanup has been called too many times.

WSANO_DATA
(11004)

Valid name, no data record of requested type.

The
requested name is valid and was found in the database, but it does not have the
correct associated data being resolved for. The usual example for this is a
hostname -> address translation attempt (using gethostbyname or
WSAAsyncGetHostByName) which uses the DNS (Domain Name Server), and an MX
record is returned but no A record — indicating the host itself exists, but is
not directly reachable.

WSANO_RECOVERY (11003)

This is a
non-recoverable error.

This indicates some sort of non-recoverable error
occurred during a database lookup. This may be because the database files (e.g.
BSD-compatible HOSTS, SERVICES or PROTOCOLS files) could not be found, or a DNS
request was returned by the server with a severe
error.

WSAPROVIDERFAILEDINIT (OS dependent)

Unable to initialize
a service provider.

Either a service provider’s DLL could not be loaded
(LoadLibrary failed) or the provider’s WSPStartup/NSPStartup function
failed.

WSASYSCALLFAILURE (OS dependent)

System call
failure.

Returned when a system call that should never fail does. For
example, if a call to WaitForMultipleObjects fails or one of the registry
functions fails trying to manipulate theprotocol/namespace
catalogs.

WSASYSNOTREADY (10091)

Network subsystem is
unavailable.

This error is returned by WSAStartup if the Windows Sockets
implementation cannot function at this time because the underlying system it
uses to provide network services is currently unavailable. Users should check:

That the appropriate Windows Sockets DLL file is in the current
path.

That they are not trying to use more than one Windows Sockets
implementation simultaneously. If there is more than one WINSOCK DLL on your
system, be sure the first one in the path is appropriate for the network
subsystem currently loaded.

That the Windows Sockets implementation
documentation to be sure all necessary components are currently installed and
configured correctly.

WSATRY_AGAIN (11002)

Non-authoritative
host not found.

This is usually a temporary error during hostname
resolution and means that the local server did not receive a response from an
authoritative server. A retry at some time later may be
successful.

WSAVERNOTSUPPORTED (10092)

WINSOCK.DLL version out of
range.

The current Windows Sockets implementation does not support the
Windows Sockets specification version requested by the program. Check that no
old Windows Sockets DLL files are being accessed.

WSAEDISCON
(10094)

Graceful shutdown in progress.

Returned by recv, WSARecv
to indicate the remote party has initiated a graceful shutdown
sequence.

WSA_OPERATION_ABORTED (OS dependent)

Overlapped
operation aborted.

An overlapped operation was canceled due to the
closure of the socket, or the execution of the SIO_FLUSH command in WSAIoctl.

#c #networking #winsock #winsock2

Вопрос:

Я довольно новичок в сети на c , поэтому я смотрел несколько учебных пособий, но, похоже, не могу понять, почему я не могу связать свой сокет. Может ли кто-нибудь объяснить мне, что я делаю не так? Вот мой код для привязки сокета.

 #include <stdlib.h>
#include <winsock2.h>

#pragma comment (lib,"ws2_32.lib")
#pragma warning( disable : 4996)
#define PORT 17027
int main()
{
    //creating socket
    SOCKET listenSocket = INVALID_SOCKET;
    listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    //bind socket
    struct sockaddr_in address;
    memset(amp;address, 0, sizeof(address));
    address.sin_family = AF_INET;
    address.sin_port = htons(PORT);

    int bindValue = bind(listenSocket, (struct sockaddr *)amp;address, sizeof(address));
    if (bindValue == SOCKET_ERROR) {
        std::cout << WSAGetLastError() << std::endl; 
        return 1;
    }
 

Вывод: Не удалось привязать: 10038

Ответ №1:

Ошибка 10038 WSAENOTSOCK («Операция сокета на неустановленном компьютере»), что означает, что вы вызываете bind() недопустимого SOCKET . И действительно, вы не проверяете socket() , успешно ли это. Чего нет, поскольку вы не вызываете WSAStartup() первым, поэтому socket() происходит сбой с WSANOTINITIALISED ошибкой («Успешный WSAStartup еще не выполнен»).

Функция WSAStartup должна быть первой функцией сокетов Windows, вызываемой приложением или библиотекой DLL. Это позволяет приложению или библиотеке DLL указать требуемую версию сокетов Windows и получить подробную информацию о конкретной реализации сокетов Windows. Приложение или библиотека DLL могут выдавать дополнительные функции сокетов Windows только после успешного вызова WSAStartup.

Комментарии:

1. Одна из вещей, которую вы должны убрать из этого ответа, — это всегда проверять код возврата и убедиться, что вы понимаете, что подразумевает возвращаемое значение. В сетевом программировании вы должны быть религиозны с кодами возврата, потому что они редко просто работают/не работают. recv например , сообщает вам, сколько данных было прочитано (что не всегда соответствует запрошенному объему данных), или что сокет вежливо отключился, или что произошла ошибка, и вам придется позвонить еще WSAGetLAstError раз, чтобы узнать, в чем заключалась эта ошибка.

Ответ №2:

Вы должны указать, к какому интерфейсу вы хотите привязать сокет. Это делается путем установки sin_addr элемента sockaddr_in структуры.

Например, чтобы привязаться к интерфейсу с подстановочными INADDR_ANY знаками (чтобы иметь возможность получать соединения от всех интерфейсов), вы должны сделать что-то вроде этого:

 address.sin_addr.s_addr = htonl(INADDR_ANY);
 

В то время как для привязки к определенному интерфейсу вы должны сделать что-то вроде этого:

 address.sin_addr.s_addr = inet_addr("interface IP here");
 

Что касается отчетов об ошибках, API Winsock не настроен errno на ошибку (и errno используется perror() ). Вместо этого вам нужно использовать WSAGetLastError() , чтобы получить код ошибки и FormatMessage() получить описание ошибки.

Комментарии:

1. Я просто попытался добавить часть «address.sin_addr.s_addr = htonl(INADDR_ANY);» и изменил часть perror на WSAGetLastError, но она все еще не работает, и я не получаю ошибок.

2. @ReaperB_G Вы печатаете результат WSAGetLAstError() ? Нравится if (bindValue == SOCKET_ERROR) { std::cout << WSAGetLastError() << 'n'; return 1; }

3. Да, я неправильно сопоставлял функцию ошибок. Но теперь я получаю ошибку 10038.

4. @ReaperB_G Если вы будете следовать документации, на которую я ссылался, и перейдете по ней к кодам ошибок , вы увидите, что 10038 это означает WSAENOTSOCK , что «Работа сокета на не-сокете». socket Удалось ли позвонить? Вы это проверяли? Держу пари, что это не удалось, потому что вы забыли вызвать WSAStartup функцию. Не забывайте всегда проверять наличие ошибок для всех функций.

5. Хорошо, я добавил функцию WSAStartup и вызвал настройку сокета после этого, и это исправило это, спасибо за вашу помощь.

    msm.ru

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

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

    [!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь

    >
    Сокет и ошибка 10038

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



    Сообщ.
    #1

    ,
    04.09.08, 11:29

      Full Member

      ***

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

      День добрый.
      Вообщем история такая. Есть два приложения — клиент и сервер. Вообщем всё классически. Трабл такого толка — когда клиент закрывает соединение на сервере сразу же после обработчика события OnClientDisconnect вываливается ошибка:
      Windows socket error: Сделана попытка выполнить операцию на объекте, не являющемся сокетом (10038), on API ‘closesocket’
      При чём вываливается сразу в двух экземплярах. Код огромный — выкладывать его тут смысла нет. Вероятно на момент закрытия сокета он уже не существует исходя из толкования ошибки. С другой стороны он передаётся в обработчик, так что существовать должен, в дебаге видно даже его настройки. Проверено, что никакой другой кусок кода в этот момент не пытается работать с этим сокетом. Мысли есть?

      Добавлено 04.09.08, 12:14
      Прошерстил гугль. Указанная ошибка встречается всего два раза. Оба пальцем в небо.


      trainer



      Сообщ.
      #2

      ,
      04.09.08, 13:09

        Цитата DrMort @ 04.09.08, 11:29

        С другой стороны он передаётся в обработчик, так что существовать должен, в дебаге видно даже его настройки.

        Какое отношение обработчик события в компоненте VCL имеет к системному объекту? Системный объект видимо удален, экземпляр компонента остался. Любые попытки использовать системный объект через компонент будут давать ошибки(если компонент не будет самостоятельно пересоздавать системный объект, а он в данном случае не будет пересоздавать).
        Ну и исходник покажи.
        Хотя вообще-то странно. Не должен на сервере закрываться сокет, находящийся в режиме прослушивания.

        Эээ… Ты закрываешь сокет в OnClientDisconnect?

        Сообщение отредактировано: trainer — 04.09.08, 13:17


        Akme



        Сообщ.
        #3

        ,
        04.09.08, 13:17

          Указатели какие-нить не перезаписываешь? Что в дисконекте делается? Один поток в программе или нет?


          DrMort



          Сообщ.
          #4

          ,
          05.09.08, 01:20

            Full Member

            ***

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

            Никаких указателей не перезаписываю. В дисконнекте меняются просто флажки соединений — то есть в массив проставляется что васе пупкину больше ничего отсылать не стоит — мы его потеряли. Программа однопоточная — никаких специальных замутов наподобии CreateThread не делал. Сейчас попробую привести некий кусок кода

            ExpandedWrap disabled

              void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,

                    TCustomWinSocket *Socket)

              {

                      int CurrentLocation=0,counter=0;

                      int NumSym=0,i,o;

                      AnsiString CurrName=»»;

                      for(i=0;i<MaxConnections;i++) //MaxConnections — константа содержащая максимальное число соединений с клиентами

                              {

                              if((Connections[i].Socket==Socket) && (Connections[i].Connected==true))

                                      {

                                      if(Connections[i].Login!=»»)

                                              {

                                              Memo1->Lines->Add(Connections[i].Login+» disconnected»);

                                              CurrName=Connections[i].Login;

                                              CurrName=CurrName.Trim();

                                              }

                                      else

                                              Memo1->Lines->Add(«Non logined client disconnected»);

                                      Connections[i].Connected=false;

                                      Connections[i].Autorize=false;

                                      for(o=0;o<BufferLength;o++)

                                              Connections[i].SendBuffer[o]=»»;

                                      Connections[i].BufferCounter=0;

                                      Connections[i].Idle=0;

                                      Form1->StatisticMonitor->Values[«CurrentConnection»]=IntToStr(StrToInt(Form1->StatisticMonitor->Values[«CurrentConnection»])-1);

                                      break;

                                      };

                              };

              }

            Connections[] — массив структур содержащий сведения о соединениях, В нём есть поле Socket значение которого заполняется при установке связи.

            Но все это описание зряшное, потомучто содержимое обработчика можно полностью убрать и ничего не изменится — проверено. Так же пробовал в начале каждой процедуры имеющейся в проекте ставить стоп поинт и отслеживать что ещё происходит в момент когда клиент обрывает связь. Так вот ничего не происходит — сразу срабатывает OnClientDisconnect. Сразу после его срабатывания вылетает подряд две ошибки. Так что вероятнее всего дело не в исходном коде, а в настройках/багах проекта/операционной системы/среды программирования. Чуть позже попробую на чистом компе возвести SQL сервер и запустить серверное приложение. Если ошибка исчезнет — всему виной срада/операционка.


            leo



            Сообщ.
            #5

            ,
            05.09.08, 07:28

              Цитата DrMort @ 05.09.08, 01:20

              В дисконнекте меняются просто флажки соединений — то есть в массив проставляется что васе пупкину больше ничего отсылать не стоит — мы его потеряли

              И что разорванное соединение так и остается навсегда в массиве Connections или удаляется ?
              Следует иметь в виду, что клиентский сокет закрывается и удаляется автоматически после вызова OnClientDisconnect. Поэтому ни закрывать, ни освобождать самому Connections[i].Socket в OnClientDisconnect (и тем более до или после) нельзя, ну и ес-но нельзя обращаться к инвалидному указателю Connections[i].Socket после OnClientDisconnect

              Цитата DrMort @ 05.09.08, 01:20

              Программа однопоточная — никаких специальных замутов наподобии CreateThread не делал

              Чтобы прога стало многопоточной достаточно установить «замут» ServerType:=stThreadBlocking ;)


              DrMort



              Сообщ.
              #6

              ,
              05.09.08, 10:26

                Full Member

                ***

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

                Разорваное соединение остаётся, но никогда не используется. По прошествии некоторого времени по таймеру выбираются все разорваные соединения и удаляются из массива.
                Ещё раз — в OnClientDisconnect сокет вообще не трогается — процедура обработчика вообще может быть пустой. И тем более к указателю Connections[i].Socket никто не обращается. Дело все таки несколько в другом.
                Про ServerType:=stThreadBlocking мне тоже известно.
                Попробовал запустить сервер на другом компе где поднят SQL. Запустилась и нормально работает. Переставил винду. У меня по прежнему глючит. Возможно проблема с каким то драйвером. Мучаю дальше.


                Oleg2004



                Сообщ.
                #7

                ,
                05.09.08, 11:54

                  Есть такая ситуация — что в режиме дебага многие среды при тестирование клиент-серверных приложений глючат.
                  Поэтому я всегда рекомендую делать отладочные релизы и запускать как самостоятельные программы вне среды программирования……


                  DrMort



                  Сообщ.
                  #8

                  ,
                  05.09.08, 11:59

                    Full Member

                    ***

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

                    Вне среды все равно глючит. Переставил винду — все та же ошибка. Завтра попробую переставить винду и не ставить ни одного драйвера.


                    DrMort



                    Сообщ.
                    #9

                    ,
                    06.09.08, 08:31

                      Full Member

                      ***

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

                      Переставил винду поверх старой. Глючит. Форматнул винт — нормально. С дровами тоже нормально. Похоже что-то было с операционкой, может какие нить последствия лечения вирусни. Всем спасибо за мысли.

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

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

                      • Предыдущая тема
                      • Borland C++ Builder/Turbo C++ Explorer
                      • Следующая тема

                      Рейтинг@Mail.ru

                      [ Script execution time: 0,0344 ]   [ 16 queries used ]   [ Generated: 10.02.23, 05:55 GMT ]  

                      If the following error is displayed:

                      FLEXlm error: -15,570. System Error: 10038 «Winsock: Specified socket is invalid»

                      or

                      FLEXlm error: -15,570. System Error: 10038 «Winsock: Connection refused»

                      To resolve this issue, please try the following workarounds:

                      — Ensure that the same port numbers are listing in the SERVER line of the license.dat file on both the license server and client.

                      — Disable security software (e.g. antivirus)

                      — Uninstall wireless networking software

                      — Uninstall software/drivers for on-board infrared devices

                      — Reinstall the TCP/IP network stack

                      — If the network license manager is on Windows Vista, move the license manager files from the «C:Program Files» folder to another folder (e.g. C:flexlm).

                      If the error includes this line: ERROR: FLEXlm error: -15,570. System Error: 10061 «Winsock: Specified socket is invalid»

                      There is a port number conflict.

                      The network license manager operates using two TCP ports.

                      In order to use a firewall with FLEXnet, you will need to configure your license to use static ports and then open these in any network security that you have.

                      To do so, follow the steps below:

                      The first port the license manager uses is specified as the last argument of the SERVER line in the license file. This port is used for the initial connection to the license server. For example, this line below:

                      SERVER license-server-1 0011aabbcc22 27000

                      shows that the license manager is using port 27000. If you do not have a port number on the end of this line, you will need to specify a port. By default MathWorks uses port 27000 upon installation, however you can specify any open port on the machine.

                      To verify which ports are in use on your system, you can use the «netstat» utility. This utility is called from the DOS prompt for Windows, or through a terminal window on Linux/Unix/Mac. To use the utility, execute the following command:

                      The other license manager port is specified in DAEMON line of the license file. By default, the vendor DAEMON (MLM) uses a random open port. In order for the license manager to work with network security software and firewalls, you must specify an open port on your system for MLM. This specification is done in the license file by adding the flag ‘port=’ to the end of the DAEMON line. For example:

                      DAEMON MLM «C:flexlmmlm.exe» port=1711

                      In this example, MLM is tied to port 1711. Again, this must be a free port on the machine. If a port number which is already in use is chosen, a «port in use» error message will be generated when the license manager is restarted.

                      If you changed the ports, you will need to restart the license manager for the changes to take effect. Once the license manager is started successfully with the changes, you will need to open the ports any firewalls. Once open, you should be able to check out a license through a firewall.

                      NOTE: If client machines have a firewall, you will need to open the two ports on the client firewall as well.

                      Понравилась статья? Поделить с друзьями:
                    • Winsock connect error system error 11004
                    • Winrm negotiate authentication error
                    • Winsock connect error system error 11001 system message этот хост неизвестен
                    • Winrm default authentication error
                    • Winsock connect error system error 10061 system message