2015-09-22 1 views
-1

Я новичок в C и особенно с разъемами. Вот мой код:C: программа останавливается без ошибок

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <pthread.h> 
#include <netinet/in.h> 
#include <errno.h> 
#include <string.h> 



int main(int argc, char *argv[]) 
{ 


int time_me = 0; 
int yes = 1; 
char buffer[1024]; 
int newsockfd, recv_length, sockfd; 
struct sockaddr_in serv_addr, cli_addr; 
ssize_t number; 
if (sockfd < 0) 
    error("ERROR opening socket"); 
bzero((char *) &serv_addr, sizeof(serv_addr)); 



serv_addr.sin_family = AF_INET; 
serv_addr.sin_addr.s_addr = 0; 
serv_addr.sin_port = htons(80); 



//write(sockfd,"From Server",11); 


sockfd = socket(AF_INET, SOCK_STREAM, 0); 

connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)); 
send(sockfd, "GET /1/ HTTP/1.0\r\n\r\n", strlen("GET /1/ HTTP/1.0\r\n\r\n"), 0); 




while(yes) 
{ 

    sleep(1); 
    if(send(sockfd, "as\r\n\r\n", strlen("as\r\n\r\n"), 0) > 0) 
    { 
     printf("Alive on %d Second\n", time_me); 

    } 
    else 
    { 

     printf("Dead on %d Second\n", time_me); 
    } 
    time_me++; 

printf("I'm Done\n"); 
} 









} 

В основном то, что я пытаюсь сделать, это сделать правильный запрос HTTP GET и после этого сделать плохой запрос и увидеть, как долго сокет пребывание alive.I знает, что я могу проверьте тайм-аут сокета в файле apache.conf и произнесите 300 секунд. Но моя проблема заключается в том, что после 31 секунды программа просто перестает работать. Он даже не идет в другом заявлении и не говорит I'm Done Я не могу понять, почему. Надеюсь, ты поможешь. Благодарю.

+0

Если «* перестает работать *» не ссылается на «оно заканчивается», то, скорее всего, это вызов для 'send()' блоков. – alk

ответ

0

Сервер не считывает все данные, которые вы отправляете, и что буфер буфера сокета заполняется, что вызывает блокировку вызова send(2).

После того, как 31 send(2) вызывает, что ваш буфер заполняется данными, а сокет, открытый в режиме блокировки, не может обрабатывать больше байтов. Вы должны установить сокет в режим без блокировки или использовать select(2), poll(2) или что-то в этом духе, чтобы делать то, что вы хотите. Пожалуйста, ознакомьтесь с руководством по эксплуатации setsockopt(2) (O_NONBLOCK).

Если вы используете select(2) или используете не сокет блокировки вы должны ждать, когда send(2) возвращается -1 и errno является EAGAIN (или EWOULDBLOCK), потому что это, где ваша программа замораживания. Вы должны хорошо изучить руководства для сокетов (socket(2) и setsockopt(2)), чтобы понять, как достичь желаемых целей.

И, как отметил Блейк ниже, вы также должны проверить каждое возвращаемое значение вызова функции, чтобы проверить наличие ошибок. После получения ошибки на send(2) или любых вызовов, связанных с libc, вы должны проверить ошибку, используя переменную errno, perror(3) или strerror(3).

В любом случае, если вы хотите узнать, когда соединение/розетка была удалена, используйте select(2), чтобы проверить состояние чтения сокета. Это будет делать то, что вы хотите.

+0

Для неблокирующего сокета буфер не будет заполняться медленнее. – alk

+0

Да, но он не хочет заполняться медленнее, он просто хочет знать, почему он замерзает без ошибок, и для него будет нужен неблокирующий сокет. –

+0

Тогда почему бы не указать, что 'send()' blocks? – alk

0

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

Поместите что-то подобное под каждую системную функцию. Большинство из них возвращают -1 при ошибке и 0 или более от успеха.

if (returned < 0) { 
    printf("called_function(): %s\n", strerror(errno)); 
    return 1; 
} 

Для простоты использования, просто измените имя called_function() в Printf к любой функции вы ловя ошибки из, и вернулся к тому, что ваша переменная называется.

+0

Зачем тестировать значение сокета (кроме того, при вызове 'socket()')? Вы хотите проверить результат системных вызовов! – alk

+0

sockfd = socket (AF_INET, SOCK_STREAM, 0); Так не будет sockfd быть результатом системного вызова? – Blake

+0

Я добавил "* Кроме того, при вызове socket() *" в мой комментарий, через 1 минуту. – alk

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

  • Нет связанных вопросов^_^