Я хотел получать данные от разных клиентов (количество клиентов фиксировано, скажем, 10), и каждый из клиентов отправляет данные по 5 различным предопределенным портам, которые не меняются (например, порты клиента 1 5000,5001,5002 и т. Д.). Все клиенты могут отправлять данные одновременно. (Все вышеперечисленное исправлено)
Скажем, в TCP я могу создать несколько потоков, по одному для каждого из принимаемых нами соединений, как показано ниже. UDP не требует установления соединения. Итак, как мы можем создать один поток для каждого UDP-клиента (UDP-порт) для обработки параллельных данных? Как каждый поток, имеющий функцию receivefrom () для получения данных.
// UDP-сервер
#define BUFLEN 512
#define CLIENT1_PORT1 5000
#define CLIENT1_PORT2 5001
#define CLIENT1_PORT3 5002
#define CLIENT2_PORT1 5050
#define CLIENT2_PORT2 5051
#define CLIENT2_PORT3 5052
#define CLIENT3_PORT1 6000
#define CLIENT3_PORT2 6001
#define CLIENT3_PORT3 6002
void diep(char *s) {
perror(s);
exit(1);
}
int main(void) {
struct sockaddr_in client1_sockaddr_1, client1_sockaddr_2,client2_sockaddr_1,client2_sockaddr_2, si_other;
int c1_sockfd_1,c1_sockfd_2, c2_sockfd_1,c2_sockfd_2, i, slen = sizeof(si_other);
char buf[BUFLEN];
/******for client 1 port1 **********/
if((c1_sockfd_1 = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
diep("socket");
memset((char *) &client1_sockaddr_1, 0, sizeof(client1_sockaddr_1));
client1_sockaddr_1.sin_family = AF_INET;
client1_sockaddr_1.sin_port = htons(CLIENT1_PORT1);
client1_sockaddr_1.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(c1_sockfd_1, (struct sockaddr *) &client1_sockaddr_1, sizeof(client1_sockaddr_1)) == -1)
diep("bind");
if((c2_sockfd_1 = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
diep("socket");
/*******for client 2 port1 *******/
memset((char *) &client2_sockaddr_1, 0, sizeof(client2_sockaddr_1));
client2_sockaddr_1.sin_family = AF_INET;
client2_sockaddr_1.sin_port = htons(CLIENT2_PORT1);
client2_sockaddr_1.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(c1_sockfd_2, (struct sockaddr *) &client2_sockaddr_1, sizeof(client2_sockaddr_1)) == -1)
diep("bind");
//Receive from clients
while(1) {
/*How to create threads at this point and have a separate recvfrom for each client port ??*/
if(recvfrom(c1_sockfd_1, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen) == -1)
diep("recvfrom()");
printf("Recieved packet from %s: %d\nData: %s\n\n", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port), buf);
}
close(c1_sockfd_1);
return 0;
}
Обновление. У меня примерно 5 портов на клиента, всего 5 * 10 сокетов, и данные будут отправляться с интервалами в несколько миллисекунд одновременно. Здесь пакеты, полученные на каждом порту, имеют разный размер. Пакеты отправляются с заголовком и CRC. Является ли хорошей идеей иметь номера пакетов для отслеживания и повторного запроса потерянных пакетов?
(или) Какими способами можно отслеживать потерянные пакеты и запрашивать их с помощью UDP?