У меня есть простой пример клиент-сервер TCP.Сервер только для получения данных.Логика на стороне сервера:
#define LISTEN_PORT 31337
#define BUFFER_SIZE 4096
//#define QUICKACK
void main () {
int buflen = 6000, opt_val = 1;
int server_fd, client_fd, err;
struct sockaddr_in server, client;
char buf[BUFFER_SIZE] = {0};
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd < 0) {
perror("SOCKET");
return;
}
server.sin_family = AF_INET;
server.sin_port = htons(LISTEN_PORT);
server.sin_addr.s_addr = htonl(INADDR_ANY);
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt_val, sizeof opt_val) < 0) {
perror ("SETSOCKOPT");
return;
}
if (bind(server_fd, (struct sockaddr *) &server, sizeof(server)) < 0) {
perror("BIND");
return;
}
if (listen(server_fd, 128)) {
perror("LISTEN");
return;
}
printf("Server is listening on %d\n", LISTEN_PORT);
for(;;) {
socklen_t client_len = sizeof(client);
client_fd = accept(server_fd, (struct sockaddr *) &client, &client_len);
if (client_fd < 0) {
perror("ACCEPT");
return;
}
if (setsockopt(client_fd, SOL_SOCKET, SO_RCVBUF, &buflen, sizeof(int)) < 0) {
perror ("SETSOCKOPT");
return;
}
#ifdef QUICKACK
if (setsockopt(client_fd, IPPROTO_TCP, TCP_QUICKACK, (int[]){1}, sizeof(int)) < 0) {
perror ("SETSOCKOPT");
return;
}
#endif
for (;;) {
int read = recv(client_fd, buf, BUFFER_SIZE, 0);
#ifdef QUICKACK
if (setsockopt(client_fd, IPPROTO_TCP, TCP_QUICKACK, (int[]){1}, sizeof(int)) < 0) {
perror ("SETSOCKOPT");
return;
}
#endif
if (!read) break;
if (read < 0)
perror("READ");
printf("%s\n", buf);
}
}
return;
}
Затем я соединяюсь с клиентом или nc
и вижу странное поведение в tcpdump
, например:
<- [SYN] победа 43690 </strong>
-> [SYN, ACK] победа 43690
<- [ACK] победа 43690 </strong>
<- [PSH, ACK] победа 43690, длина 79 </strong>
<- [PSH, ACK] победа 43690, длина79 </strong>
-> [ACK] ack 159, выигрыш 43532
Так что я могу заключить, что ни один из setsockopt()
не работал для меня.Я пытался отключить масштабирование окна (sysctl -w net.ipv4.tcp_window_scaling=0
), но это не помогло.
Похожие: 1 , 2