У меня есть устройство которое должно обеспечивать
передачу данных по 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;
}
}
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 соединение?