Ошибка сокета 10049

I had that same error code when calling bind() under windows.

The reason in my case was not the same as in the initial poster’s code, but i guess other will have made the very same mistake as me:

I generated the local address on which i want the server to be bound locally using the inet_addr()-function.
I assigned this result to the local address structure struct sockaddr_in localaddr this way:

localaddr.sin_addr.s_addr = htonl(inaddr);

But inet_addr() already returns the address in byte-network-order, so the call htonl(inaddr) was wrong in my code and caused error 10049:

SOCKET tcpsock_bindlisten(unsigned short port, const char* bindaddr)
{
    SOCKET srvsock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    unsigned long inaddr = bindaddr ? inet_addr(bindaddr) : INADDR_ANY;

    struct sockaddr_in localaddr;
    memset(&localaddr, 0, sizeof(struct sockaddr_in));
    localaddr.sin_family        = AF_INET;
    localaddr.sin_port          = htons(port);  

    // ERROR HERE! address returned from inet_addr is already in network-byte-order!
    localaddr.sin_addr.s_addr   = htonl(inaddr); 

    // CORRECT THIS WAY:
    localaddr.sin_addr.s_addr   = inaddr;   

    if (bind(srvsock, (struct sockaddr *) &localaddr, sizeof(localaddr)) != 0)
    {
        print_socketerror("tcpsock bind()");
        return INVALID_SOCKET;
    }

    if (listen(srvsock, SVRSOCK_BACKLOG) != 0)
    {
        print_socketerror("tcpsock listen()");
        return INVALID_SOCKET;
    }

    return srvsock;
}

When calling bind() using «all local interfaces» (INADDR_ANY) it worked, because of this coincidence INADDR_ANY == htonl(INADDR_ANY):

int main()
{
    ...
    // this works for this special case:
    SOCKET svrsock1 = tcpsock_bindlisten(4444, NULL); 

    // did not work!
    SOCKET svrsock2 = tcpsock_bindlisten(5555, "192.168.0.123"); 
}

Socket Error 10049 — The specified address is not available from the local computer

This error normally means that you have entered an invalid address on the IP Address to Bind To entries on the Services page in the VPOP3 settings.

The addresses entered here should be either <Any> or the IP address of a LAN adapter in the PC running VPOP3.

Alternatively, this can be caused by timing issues related to a DNS lookup. On the Diagnostics tab in VPOP3, press the TCP/IP Tuning Options button and tick Use Synchronous DNS

Если при запуске DeltaRiver у Вас появилась ошибка Socket Error 10049:

То проблема в 99% случаев связана с тем что, в файле hosts, который расположен в windows/system32/drivers/etc/ присутствует строка 0.0.0.0 time.windows.com или 127.0.0.1 time.windows.com (либо любая другая строка с time.windows.com). Эту строку нужно удалить и сохранить файл hosts.

И ошибка пропадает.

————————

Что бы открыть блокнот, можно нажать сочетание клавиш win + R и в открывшемся окне написать notepad. Или любым другим способом, но главное открыть блокнот с правами администратора (что бы не было проблем с сохранением файла).

Далее нажимаем файл->открыть в появившемся окне выбираем путь — *диск на котором установлен windows*/windows/system32/drivers/etc/. Изначально блокнот не увидит файл hosts, и что бы это изменить, нужно в правом нижнем углу окона, в котором выбирали расположения файлов поменять формат открываемых файлов с «текстовый документ .txt» на «все файлы«.

После этого в списке файлов в данной папке появится нужный нам файл.

Открываем его. Ищем нужную строку, удаляем ее, и сохраняем файл путем нажатия Ctrl+S.

when ever i run my program(outside the debugger/ide) i get error asynchronous socket error 10049, am i not supposed to recieve a message dialoge : »error»? see my code below

begin
    try
       ClientSocket1.open;
    except
       showmessage('error');
    end;
end;

what am i doing wrong?

asked Aug 1, 2010 at 16:09

Omair Iqbal's user avatar

What you should do is handle the Error event of the TClientSocket, because that is where you will be able to capture your socket errors.

The ErrorCode parameter is the one that will have the WinSock Error code
If you want to silence the Error, you can set ErrorCode to 0, which will prevent the exception from being thrown, and after that you can identify what the error is and handle it the way you want it

procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
var error : Integer; 
begin

   error := ErrorCode; {prevent exception from being thrown}

   ErrorCode := 0;

   if error = 10049 then
     showmessage('asynchronous socket error');
.
.
.


end;

I hope this helps

Gaetan Siry

answered Aug 1, 2010 at 19:59

G-Man's user avatar

G-ManG-Man

7,23018 gold badges72 silver badges100 bronze badges

0

The TClientsocket component (which is deprecated for a while already) uses the asynchronous communication model, so it is possible that the exception is not thrown in the Open method but in the message / event handling method which receives the incoming data.

update: I can reproduce this with Delphi 6 and the given code, if I enter an invalid IP address like 1.2.3.4

To fix it I would move to a TCP/IP library like Indy or Ararat Synapse (both have a generic TCP client component).

answered Aug 1, 2010 at 17:00

mjn's user avatar

mjnmjn

36.4k28 gold badges176 silver badges378 bronze badges

6

Обновлено: 11.04.2023

Правила форума
Прежде чем задать вопрос про СГДС, внимательней прочитайте темы и обсуждения в этом разделе. 95% проблем с СГДС уже имеют решения на этом форуме. Вы быстрее найдете решение, если прочтете темы.

Ошибка Требуемый адрес для своего контекста не верен (10049)

Эльмира 2008 » 04 июн 2008, 16:54

ПРИ ПОДКЛЮЧЕНИИ МОНИТОРА ПИШЕТ :ТРЕБУЕМЫЙ АДРЕС ДЛЯ СВОЕГО КОНТЕКСТА НЕВЕРЕН (10049) ВСЕ ОТЧЕТЫ НЕ ОТПРАВЛЯЮТСЯ ,А СТОЯТ НА ОТПРАВКЕ НК МФ

Эта тема в сообществах:

sokref » 04 июн 2008, 17:07

Эльмаира, не пишите заглавными буквами.
Для решения проблемы необходимо прикрепить файлы c:Program FilesNATGDMS3Logscomm20080604.log (для этого надо сначало зарегистрироваться на сайте) или хотя бы последние строки из него процитируйте, если нет возможности зарегистрироваться.
Кроме того, зайдите в Мониторинг СГДС и перепишите все настройки, которые там выставлены. Также укажите каким образом Вы подключаетесь к Интернету.

КалибриО2 » 01 окт 2009, 19:23

При входе в локальную сеть сообщают, что требуемый адрес для своего контексного меню неверен.Что делать?

sokref » 01 окт 2009, 19:39

mlarv » 23 окт 2009, 12:37

Добрый день! Заменили компьютер, установила на него Gdms_3_0_1_202. При запуске монитора выдает ошибку «ТРЕБУЕМЫЙ АДРЕС ДЛЯ СВОЕГО КОНТЕКСТА НЕВЕРЕН (10049)». Не подскажете что делать или где почитать ответы по этой теме

sokref » 23 окт 2009, 12:38

Это значит, что подключиться к серверу СГДС не может. У Вас Интернет напрямую подключен?
Не спрашивайте, что на форуме могут сделать для Вас. Спросите, что Вы можете сделать для других и помощь Вам вернется
Можете послать СМС, дать ответ на чей-то вопрос, поднять интересную тему или написать наш адрес на своем бедре

mlarv » 23 окт 2009, 12:40

sokref » 23 окт 2009, 19:06

Продолжаем разговор дальше: прокси, маршрутизация, NAT? Напоминает пытки? Я Вас не сильно вопросами мучаю? Может сами всё расскажите?

Aizhan_Sh » 17 фев 2010, 12:07

Кайрат-F2 » 17 фев 2010, 12:14

У Вас точно компьютер подключен не напрямую к Интернету? СОНО и Кабинет работают? Сайты открываются?

Aizhan_Sh » 17 фев 2010, 14:19

Кайрат-F2 писал(а): У Вас точно компьютер подключен не напрямую к Интернету? СОНО и Кабинет работают? Сайты открываются?

Aizhan_Sh » 17 фев 2010, 15:07

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

sun-moon » 09 мар 2010, 16:40

sokref » 09 мар 2010, 16:42

sokref » 09 мар 2010, 16:43

просит IP адрес сгдс

sun-moon » 09 мар 2010, 16:46

sun-moon » 09 мар 2010, 16:49

16:19:04:009 | INF | 3264 | StartUp DSMonitor
16:19:04:056 | INF | 3264 | Start Language Support (Русский)
16:19:04:118 | INF | 3264 | Подлючение к службе СГДС (192.168.0.135)
16:20:19:337 | ERR | 3264 | Не удалось подключится к службе СГДС (192.168.0.135)
16:20:24:243 | INF | 3264 | Подлючение к службе СГДС (192.168.0.135)
16:22:24:243 | ERR | 3264 | Не удалось подключится к службе СГДС (192.168.0.135)
16:25:07:102 | INF | 3264 | Служба СГДС не определена (192.168.0.135)
16:25:07:321 | INF | 3264 | Выполнение команды local_bar
16:25:07:540 | INF | 3264 | Выполнение команды connect
16:25:07:556 | INF | 3264 | Завершение работы мониторинга

sokref » 09 мар 2010, 16:52

Кайрат-F2 писал(а): У Вас точно компьютер подключен не напрямую к Интернету? СОНО и Кабинет работают? Сайты открываются?

sun-moon » 09 мар 2010, 16:56

help me плиззз не могу работать поставила все программы и ни чего немогу запустить№? локальная сеть

sun-moon » 09 мар 2010, 16:57

ни кабинет ни чего неработает
инис включаю ошибка системы

  • Тебе интересен форум? Ты хочешь участвовать и развивать его?
  • Тебе интересно в твоей профессии?
  • Тебе есть чем поделиться из твоего опыта с коллегами на форуме? Есть чем поделиться из собственного опыта, научить или рассказать?
  • Получить приглашение на форум
  • Радость общения
  • Совместное развитие

Кто сейчас на конференции

Репутация: нет
Всего: нет

Есть Сервер и по его адресу(192,168,0,85) на порт 4000 коннектим клиента, сразу вылетает ошибка 10049.
Что это за ошибка такая и как это лечится?
Заранее спасибо.

Репутация: 5
Всего: 98

Репутация: нет
Всего: нет

Репутация: 53
Всего: 484

Цитата
10049 Невозможно использовать запрошенный адрес для привязки в порту

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

спроси у яндеска «Socket error 10049».

Репутация: нет
Всего: нет

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

Репутация: 10
Всего: 115

Это ты сам устанавливаешь true в ClientSocket.active ?

Репутация: 53
Всего: 484

Значит показывай кусок кода, который коннектится и параметры сокетклиента.
Ошибка скорее всего именно в коде.

Репутация: нет
Всего: нет

Вопрос решился сам собой. В одном месте программы — блок настроек( где я сохранял их в файл, в том числе и адрес) практически случайно сбивал адрес назначения на ложный, соответственно клиент не мог найти сервера по неверному адресу.
Всем огромное спасибо за участие и помощь.

Репутация: 5
Всего: 158

остается только позавидовать такой оперативности в решении проблем.

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

[ Время генерации скрипта: 0.1122 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Потом сделал клиента на него кинул кнопку, на онклик кнопки клиента :
procedure TForm1.Button1Click(Sender: TObject);
begin
clientsocket1.active:=true;
clientsocket1.socket.sendtext(«r»);
clientsocket1.active:=false;
end;
в host написал: 127.0.0.1 и порт выставил:3333
ну и запускаю ето все дело а оно мне: Windows socket error: (10049), on API «connect»

property Host: string;

Host is a string containing the domain name and service of a particular system, such as

For client sockets, set Host to the system with which the client socket should form a connection. When the socket opens a connection, it looks up the IP address for the server socket using the value of Host.

Some servers change the system or IP address that is associated with a particular host name. Using a host name allows the client socket to find the abstract site represented by the host name, even when it has moved to a new IP address.

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
ClientSocket1: TClientSocket;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
private
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;

procedure TForm1.Button1Click(Sender: TObject);
begin
clientsocket1.open;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
clientsocket1.active:=false;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
clientsocket1.socket.SendText(«r»);
clientsocket1.close;
end;

ему про фому, он — все про ерему свое гнет)

type TClientType = (ctNonBlocking, ctBlocking);
property ClientType: TClientType;

Set ClientType to ctNonBlocking to enable the client socket to respond to asynchronous reading and writing events. When ClientType is ctNonBlocking, execution is not blocked by reading and writing over the socket connection. OnRead or OnWrite events occur when the socket needs to read or write over the connection.

Set ClientType to ctBlocking to force all reading and writing to occur synchronously. It is a good idea to include the client socket object in a thread if the ClientType is ctBlocking, so that I/O does not block all execution within the client application.

When ClientType is ctBlocking, use a TWinSocketStream object for reading and writing. TWinSocketStream prevents the application from hanging indefinitely if a problem occurs while reading or writing. It also can wait for the socket connection to indicate its readiness for reading.

Помогите разобраться.
Функция bind возвращает ошибку 10049 — WSAEADDRNOTAVAIL, если задаешь любой другой IP-адрес, кроме inet_addr(«127.0.0.1») или адрес машины, на которой запускается приложение inet_addr(«10.7.36.223»);

заранее благодарен за помощь

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

А>Функция bind возвращает ошибку 10049 — WSAEADDRNOTAVAIL, если задаешь любой другой IP-адрес, кроме inet_addr(«127.0.0.1») или адрес машины, на которой запускается приложение inet_addr(«10.7.36.223»);

А ты какой функционал ожидал

Re[2]: bind возвращает ошибку 10049 — WSAEADDRNOTAVAIL

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

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

А>>Функция bind возвращает ошибку 10049 — WSAEADDRNOTAVAIL, если задаешь любой другой IP-адрес, кроме inet_addr(«127.0.0.1») или адрес машины, на которой запускается приложение inet_addr(«10.7.36.223»);

DOO>А ты какой функционал ожидал

В функции bind надо указывать IP-адрес именно host’а, на котором запускается приложение или INADDR_ANY?
А я хотел в bind’е указать IP-адрес с которым надо устанавливать соединение. Это возможно?

Re[3]: bind возвращает ошибку 10049 — WSAEADDRNOTAVAIL

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

А>А я хотел в bind’е указать IP-адрес с которым надо устанавливать соединение. Это возможно?

Нет, для установки соединения существует функция connect.
Функция bind используется для привязки серверного сокета к локальному адресу:порту.

Т.е., сервер делает
socket
bind
listen
accept
read/write
.

Клиент делает
socket
connect
read/write
.

Re[4]: bind возвращает ошибку 10049 — WSAEADDRNOTAVAIL

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

MC>Нет, для установки соединения существует функция connect.

connect делает клиент. А мне надо на стороне сервера принять connect от определенного клиента, т.е.определить что его IP-адрес — именно тот, который нужен. А на попытки connect’ов от других клиентов давать отлуп

Re[5]: bind возвращает ошибку 10049 — WSAEADDRNOTAVAIL

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

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

MC>>Нет, для установки соединения существует функция connect.

А>connect делает клиент. А мне надо на стороне сервера принять connect от определенного клиента, т.е.определить что его IP-адрес — именно тот, который нужен. А на попытки connect’ов от других клиентов давать отлуп

Понял. В accept’е есть IP-адрес клиента

Re[6]: bind возвращает ошибку 10049 — WSAEADDRNOTAVAIL

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

А>Понял. В accept’е есть IP-адрес клиента

Угу. Если вообще не хочется сокет открывать для «левых» клиентов (ведь по возвращению из accept сокет уже открыт), то есть следующие способы:
1. Настроить фильтр на уровне ядра.
2. Использовать WSAAccept (только в Windows).

Re[7]: bind возвращает ошибку 10049 — WSAEADDRNOTAVAIL

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

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

А>>Понял. В accept’е есть IP-адрес клиента

MC>Угу. Если вообще не хочется сокет открывать для «левых» клиентов (ведь по возвращению из accept сокет уже открыт), то есть следующие способы:
MC>1. Настроить фильтр на уровне ядра.
MC>2. Использовать WSAAccept (только в Windows).

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

Re[8]: bind возвращает ошибку 10049 — WSAEADDRNOTAVAIL

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

ANN>А ты ничего не сможешь поделать,

Извиняюсь, не я, а автор вопроса

ANN>у тебя есть открытые порты на компе, ты слушаешь их, если приходит запрос извне на твой порт, волей не волей сокет будет создан,

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

  • War thunder на ps4 сколько весит
  • Организм человека как компьютерная система
  • Куда сдать старые телефоны и ноутбуки за деньги
  • Как соединить коаксиальный кабель с hdmi
  • Как восстановить файл сбербанк

Понравилась статья? Поделить с друзьями:
  • Ошибка соединения 0x19 kyocera при сканировании на почту
  • Ошибка соединения 0x2202 kyocera при сканировании на почту
  • Ошибка создателя книга
  • Ошибка соединения 0x2201
  • Ошибка соединения 0x2102 kyocera при сканировании на почту