2012-05-15 3 views
0

소켓을 통해 네트워크에서 데이터를 수신하여 파일에 기록하는 프로그램을 작성했습니다. 나는 목적을 위해 다음 코드를 사용했습니다 : 파일이 존재 doesnot 경우fwrite 및 fprintf가 C에서 작동하지 않습니다.

FILE *log; 
log = fopen("time.log", "a"); 
fprintf(log,"HI all"); 
while(1) 
{ 
    sin_size = sizeof(struct sockaddr_in); 
    connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size); 
    printf("\n I got a connection from (%s , %d)", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); 
    fflush(stdout);   
    while(1) 
    {  
     fflush(stdout); 
     fgets(send_data,1000,stdin); 
     send(connected, send_data,strlen(send_data), 0); 
     bytes_recieved = recv(connected,recv_data,1024,0); 
     recv_data[bytes_recieved] = '\0'; 
     char newln[2]="\n"; 
     int len=strlen(recv_data), len1=strlen(newln); 
     fwrite(recv_data, len, 1, log); 
     fwrite(newln, len1, 1, log); 
     fflush(stdout); 
    } 
} 
fclose(log); 

는 fopen을 성공적으로 파일을 생성하지만 아무 일도 발생하지 않습니다 후. 파일에 데이터가 기록되지 않습니다. neigther "HI all"도 수신 된 데이터도 아닙니다. 예, 데이터가 수신되고 있습니다. 수신 한 데이터를 인쇄하여 확인했습니다. 제발 도와주세요. 미리 감사드립니다. 운영 플랫폼은 리눅스입니다.

+1

시도해 보셨습니까? fflush (log); – Wernsey

+0

아니요, fflush (stdout)를 사용했습니다. 나는 그것을 제거해야합니까? –

+2

예,'fflush (stdout)'을'fflush (log)'로 바꾸십시오 - 샘플은'stdout'에 아무것도 쓰지 않으므로'fflush (stdout)'은 필요하지 않습니다. 'fflush (log)'는 버퍼에 남아있는 어떤 것도'log'에 쓰게합니다. – Wernsey

답변

2

먼저 fopen()의 반환 값을 확인하여 logNULL이 아닌지 확인해야합니다. 그런 다음 fflush(stdout) 직전에 fflush(log)을 사용해야합니다.

언급 한 또 다른 사항은 두 번째 while(1) 루프를 벗어나지 않으므로이 문제도 해결해야한다는 것입니다.

if (bytes_received == 0) { 
    /* client closed the connection */ 
    close(connected); 
    break; 
} 
recv_data[bytes_recieved] = '\0'; 
char newln[2]="\n"; 
+0

프로그램을 계속 실행해야하므로 두 번째 while 루프에서 벗어나고 싶지는 않습니다. 코드가 작동했습니다. 감사. –

+0

btw. 'stdout'에 아무 것도 쓰지 않기 때문에'fflush (stdout)'부분을 안전하게 제거 할 수 있습니다. – dwalter

+0

예, fflush (로그)로 바 꾸었습니다. –

관련 문제