#c #sockets
Вопрос:
Я реализую stopamp;wait с помощью программирования сокетов c и udp. с одним клиентом это работает, но с несколькими клиентами это не работает.
сервер.c
struct sockaddr_in newAddr;
socklen_t addr_size = sizeof(newAddr);
fd_set rset;
int frame_id = 0;
Frame frame_recv;
Frame frame_send;
int socket_desc = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (socket_desc < 0) {
perror("Socket Creation Failed ");
exit(EXIT_FAILURE);
}
else {
perror("Socket Created ");
}
if (bind(socket_desc, (struct sockaddr *) amp;server_addr,
sizeof(server_addr)) < 0 ) {
perror("Bind Failed ");
exit(EXIT_FAILURE);
}
else {
perror("Bind Done ");
}
printf("Listening for Messages...n");
FD_ZERO(amp;rset);
while (1) {
FD_SET(socket_desc, amp;rset);
select(socket_desc 1, amp;rset, NULL, NULL, NULL);
if (FD_ISSET(socket_desc, amp;rset)) {
int recv_size = recvfrom(socket_desc, amp;frame_recv, sizeof(Frame), 0,
(struct sockaddr *) amp;newAddr, amp;addr_size);
if (recv_size > 0 amp;amp; frame_recv.frame_kind == 1 amp;amp;
frame_recv.sq_no == frame_id) {
printf("[ ]Frame Received: %sn", frame_recv.packet.data);
frame_send.sq_no = 0;
frame_send.frame_kind = 0;
frame_send.ack = frame_recv.sq_no 1;
sendto(socket_desc, amp;frame_send, sizeof(frame_send), 0,
(struct sockaddr*)amp;newAddr, addr_size);
printf("[ ]Ack Sendn");
}
else {
printf("[ ]Frame Not Receivedn");
break;
}
frame_id ;
}
}
close(socket_desc);
клиент.c
char buffer[1024];
socklen_t addr_size;
int frame_id = 0;
Frame frame_send;
Frame frame_recv;
int ack_recv = 1;
int socket_desc = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (socket_desc < 0) {
perror("Socket Creation Failed ");
exit(EXIT_FAILURE);
}
else {
perror("Socket Created ");
}
while (1) {
if (ack_recv == 1) {
frame_send.sq_no = frame_id;
frame_send.frame_kind = 1;
frame_send.ack = 0;
printf("Enter Data: ");
scanf("%s", buffer);
strcpy(frame_send.packet.data, buffer);
sendto(socket_desc, amp;frame_send, sizeof(Frame), 0,
(struct sockaddr*)amp;server_addr, sizeof(server_addr));
printf("[ ]Frame Sendn");
}
int addr_size = sizeof(server_addr);
int recv_size = recvfrom(socket_desc, amp;frame_recv, sizeof(frame_recv), 0 ,(struct sockaddr*)amp;server_addr, amp;addr_size);
if (recv_size > 0 amp;amp; frame_recv.sq_no == 0 amp;amp; frame_recv.ack == frame_id 1) {
printf("[ ]Ack Receivedn");
ack_recv = 1;
}
else {
printf("[-]Ack Not Receivedn");
ack_recv = 0;
break;
}
frame_id ;
}
close(socket_desc);
заголовок.h
typedef struct packet {
char data[1024];
} Packet;
typedef struct frame {
int frame_kind; //ACK:0, SEQ:1 FIN:2
int sq_no;
int ack;
Packet packet;
} Frame;
Я обнаружил, что frame_recv.sq_no
это и frame_id
имеет другое значение при запуске второго клиента.
Я прочитал вопросы на ту же тему, но не смог найти ошибку в своем коде.
Комментарии:
1.
perror("Socket Created ");
На самом деле это не имеет никакого смысла. Еслиsocket
вызов выполнен успешно, он не обязательно оставляетerrno
какое-либо конкретное значение, и это может привести к появлению таких сбивающих с толку сообщений об ошибках, какSocket Created: not a typewriter
. Вы действительно не хотите писать сообщение об ошибке, если только не произошла ошибка.2. Спасибо. Я все исправлю. Не могли бы вы, пожалуйста, проверить код на наличие проблемы?