реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Прием через TCP сокет
inventor
сообщение Oct 5 2016, 08:52
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Прошу прощения за тупой вопрос.
У меня есть устройство которое должно обеспечивать
передачу данных по 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 соединение?
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 5 2016, 11:01
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



В 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
И последний параметр может понулить.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Oct 5 2016, 12:08
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(inventor @ Oct 5 2016, 11:52) *
. . . .
короч я висю в ожидании входящего соединения и соответсвенно пока соединения нет я не перейду к select
как бы это сделать более красиво, а вобще, можно без accept обойтись
один хрен у меня только одно TCP соединение?


Для проверки, что за пакет пришел UDP / TCP / etc- нужно проверить пакет IP по его полям.
Это, насколько мне память не изменяет (?) "raw socket", datagramm. Надо курить это.
Если нет требования обязательно использовать TCP - работайте с UDP.
Нет этапов установления-разрыва соединения итд. Протокол реализовываете полностью сами.
И быстрее работает.
Go to the top of the page
 
+Quote Post
inventor
сообщение Oct 5 2016, 13:46
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(XVR @ Oct 5 2016, 14:01) *
Первым параметром должен быть максимальный fd +1, а не 0
И последний параметр может понулить.



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

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

правильно?
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 5 2016, 19:26
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Да
Go to the top of the page
 
+Quote Post
inventor
сообщение Oct 6 2016, 05:40
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



спасиб!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 21:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016