Проблема с неблокирующими сокетами в Linux

valkiria77

Есть код, его задача тупо пробросить с одного порта на другой:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

int sendall(int s, char *buf, int len, int flags)
{
int total = 0;
int n;

while(total < len)
{
n = send(s, buf+total, len-total, flags);
if(n == -1) { break; }
total += n;
}

return (n==-1 ? -1 : total);
}

int main
{
int sock_stavka, sock , listener, sender;
struct sockaddr_in stavka,shtirliz;

char buf[1024];
int bytes_read,bytes_send;
// заполнили структуры
shtirliz.sin_family = AF_INET;
shtirliz.sin_port = htons(8000);
shtirliz.sin_addr.s_addr = htonl(INADDR_LOOPBACK);

stavka.sin_family = AF_INET;
stavka.sin_port = htons(9000);
stavka.sin_addr.s_addr = htonl(INADDR_LOOPBACK);

listener = socket(AF_INET, SOCK_STREAM, 0);
if(listener < 0)
{
perror("Ошибка создания сокета!");
exit(1);
}

if(bind(listener, (struct sockaddr *)&shtirliz, sizeof(shtirliz < 0)
{
perror("Ошибка привязки к порту");
exit(3);
}

listen(listener, 1);

while(1){
sock = accept(listener, 0, 0);
fcntl(sock, F_SETFL, O_NONBLOCK);

sender = socket(AF_INET, SOCK_STREAM, 0);
sock_stavka = connect(senderstruct sockaddr *)&stavka, sizeof(stavka;

fcntl(sock_stavka, F_SETFL, O_NONBLOCK);

if(sock_stavka < 0){
perror("Ошибка коннекта к серверу");
// exit(2);
}

if(sock < 0)
{
perror("accept shtirliz failt");
// exit(3);
}
while(1)
{
// основной цикл
read_first:
bytes_read = recv(sock, buf, 1024, 0);
if(bytes_read == 0){
printf("Breacking first\n");
break;
}
if(bytes_read != -1) {
[b]bytes_send=sendall(sock_stavka, buf, bytes_read, 0);[/b]
printf("Getted %i bytes in first Sended %i bytes in first ErrNo is %i\n", bytes_read,bytes_send,errno);
goto read_first;
}
read_second:
bytes_read = recv(sock_stavka, buf, 1024, 0);
if(bytes_read == 0){
printf("Breacking second\n");
break;
}
if(bytes_read != -1) {
printf("Getted %i byte in second\n", bytes_read);
sendall(sock, buf, bytes_read, 0);
goto read_second;
}
}
printf("We'ra here\n");
close(sock_stavka);
close(sock);
}

return 0;
}


Затем начинаем слушать 9000 порт
netcat -p 9000 -l  

Запускаем программу.
и шлем данные netcatom
Результат - данные на 9000 порт не приходят, в выводе
Errorno is 88
Getted 5 bytes in first Sended -1 bytes in first ErrNo is 88

Вопрос, почему данные не пересылаются?

procenkotanya

Вопрос, почему данные не пересылаются?
Посмотри strace'ом, что происходит.
Код не читал

okis

Ошибка 88 — операция производится не над сокетом. Вызов connect(…) возвращает 0 или -1, а не сокет.
Ещё, кстати, вывод не соответствует твоей программе.

Anturag

Код прочитал. Неинформативный заголовок, проблема не с сокетами...

tokuchu

Мне кажется, что тебе поможет "man select". Но для твоей конкретной задачи можно использовать socat. nc не используй, т.к. там тоже могут возникнуть блокировки. Кстати, при записи сокет может тоже блокироваться или не все данные записать (на этом как раз nc обламывается).

valkiria77

что тебе поможет "man select"
уже помогло :) тему можно закрывать
Оставить комментарий
Имя или ник:
Комментарий: