// accept()

addrlen = sizeof(clientaddr);

client_sock = accept(listen_sock, (SOCKADDR *)&clientaddr, &addrlen);

if(client_sock == INVALID_SOCKET){

err_display("accept()");

continue;

}

printf("\nFileSender 접속: IP 주소=%s, 포트 번호=%d\n", 

inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));


// 파일 이름 받기

char filename[256];

ZeroMemory(filename, 256);

retval = recvn(client_sock, filename, 256, 0);

if(retval == SOCKET_ERROR){

err_display("recv()");

closesocket(client_sock);

continue;

}

printf("-> 받을 파일 이름: %s\n", filename);

// 파일 크기 받기

int totalbytes;

retval = recvn(client_sock, (char *)&totalbytes, sizeof(totalbytes), 0);

if(retval == SOCKET_ERROR){

err_display("recv()");

closesocket(client_sock);

continue;

}

printf("-> 받을 파일 크기: %d\n", totalbytes);


// 파일 열기

FILE *fp = fopen(filename, "wb");

if(fp == NULL){

perror("파일 입출력 오류");

closesocket(client_sock);

continue;

}


// 파일 데이터 받기

int numtotal = 0;

while(1){

retval = recvn(client_sock, buf, BUFSIZE, 0);

if(retval == SOCKET_ERROR){

err_display("recv()");

break;

}

else if(retval == 0) 

break;

else{

fwrite(buf, 1, retval, fp);

if(ferror(fp)){

perror("파일 입출력 오류");

break;

}

numtotal += retval;

}

}

fclose(fp);


// 전송 결과 출력

if(numtotal == totalbytes)

printf("-> 파일 전송 완료!\n");

else

printf("-> 파일 전송 실패!\n");


// closesocket()

closesocket(client_sock);

printf("FileSender 종료: IP 주소=%s, 포트 번호=%d\n",inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));