// 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));
고정길이로 받거나
고정길이로 받고 가변만큼 돌면서 받거나 모든 어프로치는 이렇게 해야해여
구조체 길이나 고정길이 데이터가 때로는 아작나는일도 있는데여.. 많은 예외가 필요합니다.
아 글을 쓰셨네
읽어봐야지