2014-09-07 5 views
0

안녕하세요, 클라이언트 컴퓨터에 여러 패킷 하나의 큰 버퍼를 보내려고하지만 4-5 쓰기 호출 후에 "피어 소켓 쓰기 오류로 연결 재설정"오류가 발생합니다. 다음은피어 소켓 쓰기 오류에 의한 연결 재설정

server.c 내 코드 샘플입니다

int main() 
{ 
    int fd,i; 
    image_info info; 
    bool quit = false; 
    struct sockaddr_in serv_addr,clint_addr; 
    int sock_fd,clint_fd,n;//clen; 
    socklen_t clen = 512; 
    char buff[100]; 
    sock_fd=socket(AF_INET,SOCK_STREAM,0); 
    if(sock_fd<0) 
    { 
     perror("server socket"); 
     exit(1); 
    } 
    puts("server socket is created successfully\n"); 
    serv_addr.sin_family=AF_INET; 
    serv_addr.sin_port=65000; 
    serv_addr.sin_addr.s_addr= INADDR_ANY; 
    if(bind(sock_fd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0) 
    { 
     perror("bind"); 
     exit(1); 
    } 
    puts("bind successful\n"); 
    puts("listening\n"); 
    if(listen(sock_fd,0)<0) 
    { 
     perror("listen"); 
     exit(1); 
    } 

    if((fd = open("/dev/video0",O_RDWR | O_NONBLOCK)) == -1) 
    { 
     perror("cam_info: Can't open device"); 
     return 1; 
    } 

    //printf("FD=%d\n",fd); 
    init_device(fd); 
    map_device(fd); 
    start_capturing(fd); 
    update_cam(fd); 
    update_cam(fd); 

    puts("waiting to accept a connection from cient\n"); 
    clint_fd=accept(sock_fd,(struct sockaddr *)&clint_addr,&clen); 
    if(clint_fd<0) 
    { 
     int errsv = errno; 
     printf("Errorno:%d",errsv); 
     perror("client server"); 
     exit(1); 
    } 

    info.width = 640; 
    info.hight = 480; 
    info.buff_size = 2*640*480; 
    //uint8_t image_buff[buff_length]; 

    bzero(buff,100); 
    n=read(clint_fd,buff,100); 
    if(n<0) 
    { 
     perror("read"); 
     exit(1); 
    } 
    puts(buff); 
    n= write(clint_fd,&info,sizeof(info)); 
    if(n<0) 
    { 
     perror("write"); 
     exit(1); 
    } 

    /*for(i=0;FRAME_BUFFERS[buff_index].start[i];i++) 
    { 
     image_buff[i] = FRAME_BUFFERS[buff_index].start[i]; 
    }*/ 

    //printf("length = %d\n",i); 
    update_cam(fd); 
    for(int i=0; i<51200*12; i=i+51200) 
    { 
     printf("in loop=%d\n",i); 
     n= write(clint_fd,FRAME_BUFFERS[buff_index].start+i,51200); 
     if(n<0) 
     { 
      perror("write"); 
      exit(1); 
     } 

    } 

    n=read(clint_fd,buff,100); 
    if(n<0) 
    { 
     perror("read"); 
     exit(1); 
    } 
    puts(buff); 


    stop_capturing(fd); 

    close(fd); 
    return 0; 
} 

client.c

int main() 
{ 
    struct sockaddr_in serv_addr; 
    FILE *fp; 
    int sock_fd,n; 
    unsigned char* rgb; 
    image_info info; 
    char buff[100]; 
    fp = fopen("sample.jpg","w+"); 
    sock_fd=socket(AF_INET,SOCK_STREAM,0); 
    if(sock_fd<0) 
    { 
     perror("server socket"); 
     exit(1); 
    } 
    puts("client socket is created successfully\n"); 
    serv_addr.sin_family=AF_INET; 
    serv_addr.sin_port=65000; 
    serv_addr.sin_addr.s_addr=inet_addr("172.20.115.126"); 
    if(connect(sock_fd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0) 
    { 
     perror("connect"); 
     exit(1); 
    } 
    puts("connect successful\n"); 
    bzero(buff,100); 
    n= write(sock_fd,"connected",11); 
    if(n<0) 
    { 
     perror("write"); 
     exit(1); 
    } 
    n=read(sock_fd,&info,sizeof(info)); 
    if(n<0) 
    { 
     perror("read"); 
     exit(1); 
    } 
    printf("size=%d\n",info.buff_size); 
    n= write(sock_fd,"data received",14); 
    if(n<0) 
    { 
     perror("write"); 
     exit(1); 
    } 
    uint8_t image_buff[info.buff_size]; 
    int i=0; 
    for(i=0; i<51200*12; i=i+51200) 
    { 
     printf("in loop=%d\n",i); 
     n=read(sock_fd,image_buff+i,51200); 
     if(n<0) 
     { 
      perror("read"); 
      exit(1); 
     } 

    } 

    /* else 
    { 
     printf("read successfull\n"); 
    }*/ 
    printf("successfull\n"); 
    rgb = (uint8_t*)yuyv2rgb(image_buff, 640, 480); 
    jpeg(fp,rgb, 640, 480, 100); 
    printf("successfull\n"); 
    fclose(fp); 
    return 0; 
    //printf("size=%d\n",info.buff_size); 
    //printf("end"); 
} 

이것은 일반적으로 서면에 의해 발생이 문제 ..

답변

0

를 해결하기 위해 저를 도와주세요 연결은 피어에 의해 이미 닫혔다.

이 경우 사용자가 닫기 전에 모든 입력을 읽지 않는 것이 원인 일 수 있습니다. read()에 의해 반환 된 결과를 -1로 검사하는 것 외에는 무시하므로 버퍼를 채우고 있다고 가정합니다. 이를 수행하거나 한 번에 2 바이트 이상을 전송할 의무는 없습니다. 기대하는 모든 데이터를 수신 할 때까지 반복해야합니다. 이는 차례로 데이터 앞에 쓰여지는 데이터의 길이를 전송해야 함을 의미 할 수 있습니다.

+0

내가 허점 IP – nareshlove

+0

을 사용하면 동일한 프로그램이 작동한다는 것은 그 것이 불안정하다는 것을 증명합니다. 그것이 작동 할 때마다 특별한 경우에 의존합니다. – EJP

0

write()의 반환 값을 확인하지 않았습니다. 모든 데이터가 기록되었다고 가정합니까? 예 : n = 51200? 그건 그렇지 않을 수도 있습니다. read()에도 동일하게 적용됩니다.

관련 문제