Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.01.2023, 15:50   #1
maks1331
Форумчанин
 
Аватар для maks1331
 
Регистрация: 20.12.2016
Сообщений: 270
По умолчанию send() Error №14, Bad address

Добрый день. Мой сервер отправляет несколько сообщений в секунду по средством send на заранее открытое соединение с программой, работающей локально.

Код:
send(connection, &segment, bufferSize, MSG_OOB | MSG_CONFIRM)
Периодически, под нагрузкой, появляется ошибка №14, Bad address (в потоке отправки сразу после следуют успешные отправления на тот же connection). Эта ошибка говорит о том, что адрес для одного из аргументов является недоступным.

По факту только один аргумент мы передаем по указателю, это segment. В попытках самостоятельной диагностики проблемы я выводил все аргументы до/после попытки отправки сообщения и доступ к ним есть, что, в принципе, логично. Тем не менее, ошибка есть.

Бывалые сетевые разработчики, поделитесь мыслями, спасибо!
формошлеп.рф
witech.su
maks1331 вне форума Ответить с цитированием
Старый 01.01.2023, 16:05   #2
maks1331
Форумчанин
 
Аватар для maks1331
 
Регистрация: 20.12.2016
Сообщений: 270
По умолчанию

Повторное отправление в цикле:

Код:
while (send() == -1) {
 sleep(n);
}
результата не приносит, ошибка остается актуальной.
формошлеп.рф
witech.su
maks1331 вне форума Ответить с цитированием
Старый 02.01.2023, 09:44   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Неправильный адрес.
Ref:
https://stackoverflow.com/questions/...ror-code-10014
waleri вне форума Ответить с цитированием
Старый 02.01.2023, 21:28   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

А какого типа segment? С какими аргументами создан connection?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 03.01.2023, 01:33   #5
maks1331
Форумчанин
 
Аватар для maks1331
 
Регистрация: 20.12.2016
Сообщений: 270
По умолчанию

Segment это пользовательская структура с полями типа int.

Вызов для создания коннекта
Код:
socket(AF_INET, SOCK_STREAM, 0);
формошлеп.рф
witech.su
maks1331 вне форума Ответить с цитированием
Старый 03.01.2023, 20:55   #6
maks1331
Форумчанин
 
Аватар для maks1331
 
Регистрация: 20.12.2016
Сообщений: 270
По умолчанию

По ссылке, которую скинул waleri, есть информация, что send() может выдавать такую ошибку, если данные, которые лежат по указателю были выделены на стеке, а не в куче. Я пробовал выделять память под структуру через оператор new, но результата это не дало. Так же, как и использование явного указания типа транспортного протокола, что логично, ведь проблема не в передаче, а в подготовке к передаче. Если я правильно понял.
Код:
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
Вот структура Segment
Код:
struct Segment {
	int shifr;
	int eventId;
	size_t type;
	Definition::HTTP definition;
	size_t packetId;
	int data[SEGMENT_DATA_MAX_SIZE_INT];
	size_t size;

	Segment(int eventId, size_t type, Definition::HTTP definition, size_t packetId);
	friend std::ostream& operator<<(std::ostream& out, Segment& segment);
	operator std::string() const;
	bool IsValid() const noexcept;
	std::string ToString() const;
	void Clear();
};

Definition::HTTP - простой enum : int;
Структура sockaddr_in при попытке соединения:
Код:
sockaddr_in m_addr{ 0, 0, 0, 0 };
m_addr.sin_addr.s_addr = INADDR_ANY;
m_addr.sin_port = htons(port); //* port is any int number
m_addr.sin_family = AF_INET;
формошлеп.рф
witech.su

Последний раз редактировалось maks1331; 03.01.2023 в 21:05.
maks1331 вне форума Ответить с цитированием
Старый 06.01.2023, 17:51   #7
maks1331
Форумчанин
 
Аватар для maks1331
 
Регистрация: 20.12.2016
Сообщений: 270
По умолчанию

Может есть какие средства/способы диагностики? Более глубокие, нежели errno
формошлеп.рф
witech.su
maks1331 вне форума Ответить с цитированием
Старый 06.01.2023, 17:58   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от maks1331 Посмотреть сообщение
Может есть какие средства/способы диагностики
Конечно есть - называется "отладчик".
Ставьте точку остановки на ошибку и смотрите где и что.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
access violation at address 0F831EAB in module libcef.dll. Read of address 00000113 Женя32 Работа с сетью в Delphi 4 19.08.2018 15:15
Access violation at address XXXXXX in module 'YYYYYY'. Read of address ZZZZZZ' nik-kang Помощь студентам 0 18.06.2012 22:22
ERROR: "Access violation at address 0040412C in module 'Project1.exe'. Read of address FFFFFFFE." Katus Помощь студентам 2 30.11.2011 17:56
Access violation at address 004733C4 in module 'loginin.exe'. Read of address 00000048' pavellyba Общие вопросы Delphi 2 18.08.2011 10:32
Access violation at address 00447E73 in modul Project.exe. Read of address 00000057. ArtGrek Общие вопросы Delphi 40 12.03.2011 22:03