п.с.
ну ясен пень, контролировать "потоки" и "зачищать/удалять/сбрасывать зависшие сессии"! памяти то ограничено, а то так и пукан порвать можно!
не пойдет такой ответ?!
Ответ: закрывать соединение, когда Вы не планируете его в ближайшее время использовать, является правилом хорошего тона и здравого смысла. Таймауты, keep-alive и т.д. - это всё же способы решения нештатных ситуаций.roman.com писал(а):вообще вопрос был такой: должна или не должна W5500 сама закрывать соединение...
что логично.roman.com писал(а):тесты показывают что W5500 сама (без команды) не закрывает соединение...
да то ж самое будет, keep alive и висящая "до упора" сессия.roman.com писал(а):через роутер не проверял... не помню...
из соображений самосохраненияroman.com писал(а):а нафига вообще роутеру закрывать соединение ?
пока без ответа, хотелось бы услышать мнениякогда зацикливаешь отправку "данного" сообщения - "шарк" выдает "предупреждение", что порт используется повторно
это криминал или чего?
из соображений самосохраненияroman.com писал(а):а нафига вообще роутеру закрывать соединение ?
подозреваю, что и максимальная дальность, так-же, пропорционально?!ток потребления W5500 = 80 mA
ток потребления Ардуино = 1 мкА
- будет работать без прерываний, на чистом pool()-механизме? будет. у меня именно так и работает.sunjob писал(а): - будет работать без прерываний, на чистом pool()-механизме?
- какие будут подводные камни?
- на что обратить внимание?!
Код: Выделить всё
src 192.168.1.1 - main comp
dst 192.168.1.55 - avr
порты видны по скринуКод: Выделить всё
Destination unreachable (Port unreachable)Код: Выделить всё
echo $STR > /dev/udp/$HOST/$PORT_UDPКод: Выделить всё
./udp_cli [host] [port] [message]Код: Выделить всё
////////////////////////////////////////////////////////////////////////////////
//
// udp-client for debug atmega328/w5500
//
////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define BUFF_SIZE 64
////////////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[])
////////////////////////////////////////////////////////////////////////////////
{
if(argc != 4)
{
fprintf(stderr, "usage: %s <dst-host> <dst-port> <msg-str[%i]>\n", argv[0], BUFF_SIZE);
exit(EXIT_FAILURE);
}
const char *srv_host = argv[1];
const int srv_port = atoi(argv[2]);
const char *srv_msg = argv[3];
int sockfd;
char buffer[BUFF_SIZE];
ssize_t sent_size;
struct sockaddr_in server_addr;
//
// UDP-sock
//
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&server_addr, 0, sizeof(server_addr)); // clear
//
// server info
//
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(srv_port);
if(inet_pton(AF_INET, srv_host, &server_addr.sin_addr) <= 0)
{
perror("Invalid address/ Address not supported");
close(sockfd);
exit(EXIT_FAILURE);
}
//
// send udp to server
//
sent_size = sendto
(
sockfd,
srv_msg,
strlen(srv_msg),
MSG_CONFIRM,
(const struct sockaddr *) &server_addr,
sizeof(server_addr));
if(sent_size < 0)
{
perror("send to server failed");
close(sockfd);
exit(EXIT_FAILURE);
}
printf("put msg: %s\n", srv_msg);
//
// waiting for server response
//
socklen_t len = sizeof(server_addr);
ssize_t n = recvfrom
(
sockfd,
(char *)buffer,
BUFF_SIZE,
MSG_WAITALL,
(struct sockaddr *) &server_addr,
&len);
buffer[n] = '\0';
printf("get msg: %s\n", buffer);
close(sockfd);
return 0;
}
////////////////////////////////////////////////////////////////////////////////