Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/32: Рейтинг темы: голосов - 32, средняя оценка - 4.56
Эксперт С++
2333 / 1706 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
1

Асинхронные сокеты Windows

05.12.2009, 18:06. Просмотров 5672. Ответов 7
Метки нет (Все метки)


Здравствуйте, форумчане!
Интересует вопрос как можно синхронно отправить сообщение через асинхронный сокет?
Нужно отправить сообщение серверу и дождаться ответа.
Заранее благодарю за ответы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2009, 18:06
Ответы с готовыми решениями:

Асинхронные сокеты , ф-я WSAAsyncSelect и ее применение
Доброго времени суток , возникла проблема с асинхронностью сокетов , а именно функцией...

C++ Асинхронные сокеты
Дайте ссылку на хороший гайд по асинхронным сокетам. Везде используются синхронные.

Асинхронные сокеты
Создаю асинхронный сокет. Выполняю вызов WSASend, указываю WSAOVERLAPPED структуру с событием. Но...

Асинхронные сокеты или потоки ?
Ребят qq, что лучше подойдёт: асинхронные сокеты или потоки ? Если, 1) игровой сервер ( менее 10...

7
Эксперт С++
7175 / 3234 / 77
Регистрация: 17.06.2009
Сообщений: 14,165
05.12.2009, 21:11 2
Ну блин и вопрос.
Как обычно - отправил и дальше либо проверять в цикле что ответ пришел
или лучше сделать sleep( 1000000 ), выход же будет асинхронный.
1
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
05.12.2009, 21:18 3
Отправляй его и дожидайся ответа в отдельной нитке (потоке), который будет только отвечать за сетевой обмен.
1
Эксперт С++
2333 / 1706 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
06.12.2009, 00:30  [ТС] 4
CheshireCat, вариант с отдельным потоком, к сожалению, не применим - необходимо обойтись одним потоком.
odip, будет ли в таком случае окну (указанному при вызове WSAAsyncSelect), при выходе из функции в которой мы будем ожидать ответ от сервера, послано сообщение о приеме данных (которые мы уже получили после ожидания в цикле или sleep'а) на сокет?
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
06.12.2009, 15:47 5
Видишь ли, если тебе жестко _необходимо_ обойтись одним потоком, то у тебя есть подводный камень: можешь отправить запрос серверу, а вот ответа - никогда не дождаться.... Например, если сервер успешно принял запрос и подтвердил, а вот ответ - не успел отправить, упал (со стола ). Можно, конечно, ждать в единственном потоке ответа сколько-то времени, а потом прекращать ожидание (таймаут); но тут есть тоже неприятность - время "путешествия" сообщения в сети может быть значительным.... т.е. ты рискуешь выйти по таймауту раньше, чем ответ все-таки придет. И что будет делать программа, ожидая ответа? Просто простаивать?
Короче, единственный поток мне представляется серьезной архитектурной проблемой. Имхо усилия, затрачиваемые на борьбу с последствиями и проблемами, превосходят усилия, необходимые для изменения архитектуры и "правильной" организации работы приложения. Но это сугубо имхо.
1
Эксперт С++
2333 / 1706 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
12.12.2009, 16:27  [ТС] 6
Возник новый вопрос.
Есть последовательный UDP сервер использующих асинхронные сокеты Windows.
Сервер отправляет сообщения клиентам, клиенты в ответ высылают подтверждение о получении сообщения.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Сервер
// Обработка ошибок упущена
std::string mes = "Some message";
 
sockaddr_in client; // Адрес клиента
 
// Заполняем структуру client
 
// Отсылаем сообщение
sendto(socket, mes.c_str(), mes.lenght() + 1, 0, (sockaddr_in*)&client, sizeof(client));
 
sockaddr_in from;
int from_len = sizeof(from);
 
const int buf_len = 1024;
char buf[buf_len];
 
// Получаем ответ
recvfrom(socket, buf, buf_len, 0, (sockaddr*)&from, &from_len);
Загвоздка в следующем: отослали мы сообщение клиенту client, а в это время другой клиент (another_client) послал серверу некое сообщение, и при вызове recvfrom мы вместо подтверждения от client прочитаем сообщение от another_client.

Вопрос в следующем: как серверу игнорировать любые входящие данные (не теряя их) от всех клиентов кроме client?

Добавлено через 1 час 18 минут
Есть идеи?

Добавлено через 7 минут
А что если при запросе о соединении, сервер создавал для каждого клиента отдельный сокет?
Тогда таких проблем не будет. Что если так?
0
Эксперт С++
2333 / 1706 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
14.12.2009, 00:59  [ТС] 7
Кто-нибудь может помочь советом?
0
6 / 1 / 0
Регистрация: 05.08.2015
Сообщений: 2
05.08.2015, 10:47 8
Извиняюсь за некропост, но, возможно, кому-нибудь пригодится. Тебе, похоже надо различать клиентов. Поэтому, когда получаешь ответ от клиента - просто считай его полностью и сохрани. А потом смотри какой клиент тебе прислал ответ. Если тот, от которого ты его ждал - то начинай обработку. Если нет - то просто ничего не делай, жди ответа от другого клиента.

Добавлено через 10 минут
получается, тебе надо организовать цикл и в нём вызывать функцию recvfrom
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.08.2015, 10:47

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

(Winsock) Асинхронные сокеты или что-то подобное
Хочу создать сервер (Win32), который мог бы одновременно обрабатывать несколько клиентов. Что...

Сокеты в Windows
Начал изучать сокеты по книге Й. Снейдера "Эфективное программирование TCP/IP". В конце 1 главы...

Windows сокеты, ошибки в recvfrom
Проблема с сокетами: Посылаю строку с одного компьютера на другой, вот код: #include "stdafx.h"...

Асинхронные сокеты
Здравствуйте. Очень нужна ваша помощь. Вот callback функция которая передается в метод асинхронного...

Асинхронные запросы или сокеты?
Добрый день. Нужен ваш совет. Начну с того что данные я вывожу из БД асинхронно. Но тут дело...

Клиент + Сервер, асинхронные сокеты
Привет! Пишу клиент серверное приложение на основе асинхронных сокетов. Цель передача картинки....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.