2014-10-06 5 views
0

У меня есть следующий код и мои записи, которые записываются в сокет после отправки нескольких сотен байтов. Я читал байты с fread, используя флаг «rb».TCP-стоп перестает писать в середине цикла

char filebuff[size_aux]; 
i=0; 
int negative=0; 
int positive=0; 
int zero=0; 
while(i<size_aux) //size_aux is 79067 
{ 

    bytesSent = write(clnt_fd, &filebuff[i], 1); 
    if(bytesSent>0) positive++; 
    if(bytesSent<0) negative++; 
    if(bytesSent==0) zero++; 

    i++; 

} 

Что это напечатано было это:

Positive: 868 
Negative: 78199 
Zero: 0 

Я проверил, что он посылает 868 прямо в ряд, а затем прекращает передачу, что дает -1 в качестве значения поворота записи. Количество отправленных байт является случайным, иногда похожим на 868 в других случаях, например 600, но малыми значениями по сравнению с реальным размером файла. До этого, я должен был вставить следующий код:

signal (SIGPIPE, SIG_IGN); 

Потому что в середине цикла в то время, было бы выйти из моей программы на терминал.

+0

Является ли розетка неблокирующей? – usr

+0

Прочитайте документацию по записи. Посмотрите на коды ошибок. Теперь исправьте свой код, чтобы подробно просмотреть эти коды ошибок или, по крайней мере, распечатать, какие ошибки ваш код получает. –

+0

Ошибка, которую я даю мне 0, поэтому я не могу много сделать. Как узнать, не является ли сокет неблокирующим, у меня нет доступа к серверному коду. – Elsendion

ответ

0

Когда вы получаете сигнал SIGPIPE или ошибку EPIPE, возвращаемую функцией write(), это означает, что конец чтения сокета перестает вас слушать.

Ваш единственный ответ - закрыть розетку. Вы не можете заставить другую сторону получать больше байтов, и соединение мертво.

Смежные вопросы