Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прием через TCP сокет
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
inventor
Прошу прощения за тупой вопрос.
У меня есть устройство которое должно обеспечивать
передачу данных по COM UDP и TCP - отвечает тому
от чего придет запрос.
устройство на СС3200 пишу во freertos
мне не хочется плодить несколько задач для каждого сокета
хотел сделать вот таким образом через селект
CODE

/* Занесем 2 сокета сюда */
FD_ZERO(&read_s); /* Обнуляем множество */
FD_SET(iSockUDP, &read_s); /* Заносим в него наш сокет UDP */
FD_SET(iSockTCP, &read_s); /* Заносим в него наш сокет TCP */
time_out.tv_sec = 0;
time_out.tv_usec = 500000; /* Таймаут 0.5 секунды - ожидаем входящих запросов */


while (IS_CONNECTED(get_wlan_status())) {

ret = select(0, &read_s, NULL, NULL, &time_out);

/* Появились данные UDP */
if ((ret != 0) && (FD_ISSET(iSockUDP, &read_s))) {
****
/* Появились данные TCP */
} else if ((ret != 0) && (FD_ISSET(iSockTCP, &read_s))) {
}


ну и тд.
проблема в том чтобы породить TCP сокет нужно использовать accept
а он дает сокет только когда есть подключение:

CODE
// waiting for an incoming TCP connection
while (iSockTCP < 0) {
// accepts a connection form a TCP client, if there is any
// otherwise returns SL_EAGAIN
iSockTCP = sl_Accept(iTempSock, (struct SlSockAddr_t *) &sAddr, (SlSocklen_t *) & iAddrSize);
if (iSockTCP == SL_EAGAIN) {
MAP_UtilsDelay(10000);
} else if (iSockTCP < 0) {
// error
sl_Close(iSockTCP);
sl_Close(iTempSock);
PRINTF("ACCEPT_ERROR\n");
continue;
}
}


короч я висю в ожидании входящего соединения и соответсвенно пока соединения нет я не перейду к select
как бы это сделать более красиво, а вобще, можно без accept обойтись
один хрен у меня только одно TCP соединение?
XVR
В select можно засунуть и fd для accept:
man accept:
Цитата
In order to be notified of incoming connections on a socket, you can use select(2) or poll(2). A readable event will be delivered when a new connection is attempted and you may then call accept() to get a socket for that connection.

Если вернет для него read ready - звать accept и то, что вернет передавать в select
Код
    ret = select(0, &read_s, NULL, NULL, &time_out);
Первым параметром должен быть максимальный fd +1, а не 0
И последний параметр может понулить.
k155la3
Цитата(inventor @ Oct 5 2016, 11:52) *
. . . .
короч я висю в ожидании входящего соединения и соответсвенно пока соединения нет я не перейду к select
как бы это сделать более красиво, а вобще, можно без accept обойтись
один хрен у меня только одно TCP соединение?


Для проверки, что за пакет пришел UDP / TCP / etc- нужно проверить пакет IP по его полям.
Это, насколько мне память не изменяет (?) "raw socket", datagramm. Надо курить это.
Если нет требования обязательно использовать TCP - работайте с UDP.
Нет этапов установления-разрыва соединения итд. Протокол реализовываете полностью сами.
И быстрее работает.
inventor
Цитата(XVR @ Oct 5 2016, 14:01) *
Первым параметром должен быть максимальный fd +1, а не 0
И последний параметр может понулить.



не совсем понял насчел select
какой дескриптор мне написать в первом параметре?

то есть нужно так:
CODE
n = max(iSockTCP, iSockUDP);
select(n + 1, *****

правильно?
XVR
Да
inventor
спасиб!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.