Я пытаюсь передать эту простую программу эхо-трафика TCP (https://github.com/mafintosh/echo-servers.c/blob/master/tcp-echo-server.c) под Windows для учебных целей. Моя адаптация компилируется и запускается, но она не работает:Порт сервера эхо-сигналов Winsock
**** EDIT: прослушивание было как-то вырезано. Спасибо Remy ****
Клиент подключается, но не получает никакого эха.
адаптированного код выглядит следующим образом (сообщения об ошибках на итальянском языке, но они должны быть ясно, тем не менее):
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#define BUFFER_SIZE 1024
void on_error(char *s) { fprintf(stderr,"%s\n",s); fflush(stderr); exit(1); }
int main(int argc, char *argv[]) {
WSADATA wsadata;
int server_fd, client_fd, err;
struct sockaddr_in server, client;
char buf[BUFFER_SIZE];
int port = 6666;
int risultato = WSAStartup(MAKEWORD(2,2),&wsadata);
if (risultato != NO_ERROR)
{fprintf(stderr,"Errore in WSAStartup");fflush(stderr); exit(1);}
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd < 0) on_error("Non ho potuto creare il socket\n");
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = htonl(INADDR_ANY);
const char opt_val = 1;
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt_val, sizeof opt_val);
/** bind & listen **/
err = bind(server_fd, (struct sockaddr *) &server, sizeof(server));
if (err < 0) on_error("Non ho potuto fare il bind del socket\n");
err = listen(server_fd, 128);
if (err < 0) on_error("Non ho potuto mettermi in ascolto sul socket\n");
printf("SERVER LISTENING ON PORT %d\n", port);
while (1) {
int client_len = sizeof(client);
do {
client_fd = accept(server_fd, (struct sockaddr *) &client, &client_len);
} while (client_fd = SOCKET_ERROR);
if (client_fd < 0) on_error("Non riesco a stabilire una nuova connessione\n");
while (1) {
int read = recv(client_fd, buf, BUFFER_SIZE, 0);
if (!read) break;
if (read < 0) on_error("Errore nella lettura dal client\n");
err = send(client_fd, buf, read, 0);
if (err < 0) on_error("Errore nella scrittura verso il client\n");
}
}
WSACleanup();
return 0;
}
Запустить Wireshark, чтобы узнать, в чем проблема. Или попробуйте запустить другой сервер (например, netcat -L') на том же порту. –
Ну, какие сообщения выводятся? Когда вы останавливаетесь с вашим отладчиком, достигает ли он вызова accept()? Есть ли блок accept(), как и ожидалось? –
Прошу прощения, но «но это не работает: netcat/telnet просто не подключается» просто недостаточно. Сделайте некоторые отладки и сообщите нам, что происходит. Вы даже не сказали нам, какие сообщения выводились на stdout и 'on_error' (что бы это ни было). –