2014-09-28 3 views
0

왜 함수 읽기가 항상 -1을 반환하는지 이해할 수 없습니다. '\ n'이 나타날 때까지 소켓에서 읽고 싶습니다!TCP 소켓 C에서 읽기

char* msg = (char*)malloc(sizeof(char)*120); 
    nleft = sizeof(msg); 
    while(nleft>0){ 
     n = read(fdTcp, msg, nleft); 
     if(n == -1){ 
      printf("error reading UPC\n"); 
      exit(1); //error 
     } 
     else if (n == 0){ 
      printf("end of reading EOF\n"); 
      break; //closed by peer 
     } 
     nleft-=n; 
     msg += n; 
    } 
    nread = n-nleft; 
    msg[nread] = '\0'; 
    printf("mensagem do CS: %s\n", msg); 

미리 감사드립니다. msg 이후

+0

자세한 정보를 얻으려면'if (n == - 1) {'브랜치에서'printf ("% s \ n", strerror (errno))'를 사용할 수 있습니다. – user3125367

+0

sizeof (msg)가 message의 문자 수와 같지 않습니다. – Deepak

+0

하지만 지금은 얼마나 많은 바이트를 읽지 않겠습니까? '\ n'에 도달 할 때까지 준비하고 싶습니다. 어떻게 할 수 있습니까? – user3100832

답변

2
char* msg = (char*)malloc(sizeof(char)*120); 
nleft = sizeof(msg); 

char*, nleftchar* 바이트 수있을 것이다. 나는 그것이 당신이 원하는 것이라고 생각하지 않습니다.

당신의 진짜 질문에 대답에 관해서는

:

을하지만 지금은에 도달 할 때까지, 나는 준비하려는 내가 읽은 얼마나 많은 바이트하지 않는 '\ n'을 내가 어떻게 할 수 있습니까?

두 가지 선택 사항이 있습니다. 끔찍한 옵션은 개행을 읽을 때까지 한 번에 한 바이트 씩 읽는 것입니다. 더 좋은 옵션은 가능한 한 많이 읽고 개행을 확인하는 것입니다. 개행을 지나서 읽으면, 다음 번에해야 할 일이 줄어 듭니다. 의사 코드에서 : 상기 버퍼 내의 적어도 하나의 개행이 없으면

  1. 는 상기 버퍼로부터 상기 제 바꿈에 바이트를 추출하고 처리 5.

  2. 단계로 이동.

  3. 줄 바꿈 뒤의 모든 바이트를 버퍼 시작 부분으로 이동하고 버퍼 크기를 조정하여 해당 바이트 만 포함되도록하십시오.

  4. 이동 1.

  5. 읽기 블로킹를 수행 단계 및 버퍼에 데이터를 추가합니다.

  6. 이동 내가 successfuly 당신의 소켓 개방 소켓 연결을 가정 1.

0

단계. 그런 다음 파일 디스크립터는 1이면 준비된 데이터를 읽습니다. 소켓을 읽으려고했으나 -1과 함께 오류가 발생했습니다. 일반적으로 소켓을 닫으면이 오류가 나타납니다. -1을했다면 소켓이 닫혔습니다. if가 0이면 소켓 데이터 읽기에 시간 초과를 의미합니다. 반면에 0보다 큰 값을 취한다면 얼마나 많은 바이트를 읽어야합니다.