[윈도우] 자바 - C언어 간 파일전송이 제대로 되지 않습니다.
자바에서 파일 전송(Client), C언어에서 파일 수신(Server)을 하는데
파일 전송이 제대로 되지 않습니다.
문자열 "abcd"만으로 이루어진 파일처럼, 개행문자를 만나지 않은 파일은 올바르게 전송됩니다.
하지만 자바,C 소스와 같이, 개행문자가 있는 파일은 올바르게 전송되지 않습니다(파일 크기가 서로 다름).
이유가 무엇일까요? 자바(윈도우) - C언어(리눅스)간 파일 전송 소스를 조금 수정한 코드인데, 원래는
잘 되던 코드였습니다.
===================================== 자바(파일송신) ======================================================
public class tcp_client {
public static void main(String[] args){
final int ECHO_SVC_PORT=Integer.parseInt(args[1]);
String filename=args[2];
InetAddress inetaddr=null;
try {
inetaddr=InetAddress.getByName(args[0]);
} catch (UnknownHostException e) {
System.exit(1);
}
Socket sock=null;
try {
sock=new Socket(inetaddr,ECHO_SVC_PORT);
System.out.println("====TCP File transfer client [JAVA]====");
DataOutputStream DOS = new DataOutputStream(sock.getOutputStream());
File fp=new File(filename);
FileInputStream fs=new FileInputStream(fp);
if(fs==null)
return;
BufferedInputStream br_file=new BufferedInputStream(fs);
int temp=0;
byte[] data = new byte[512];
while((temp=br_file.read(data))!=-1){
DOS.write(data,0,temp);
}
DOS.flush();
DOS.close();
br_file.close();
fs.close();
} catch (Exception ex) {
System.out.println(ex);
} finally {
try {
if(sock!=null) sock.close();
} catch (Exception ex) {}
}
}
}
===================================== c 언어(파일수신) =================================================
#define BUF_SIZE 512
char filename[20];
long portnumber;
int main(int argc, char** argv)
{
WSADATA wsa;
struct sockaddr_in local_addr;
int s,file_size=0;
FILE* fp;
u64 start_time,exit_time;
if(argc!=3)
{
printf("incorrect argument!!\n");
printf("FTSS [portnumber] [filename]\n");
return 1;
}
//argument
portnumber=strtol(argv[1],argv,10);
strcpy(filename,argv[2]);
//Winsock initialization
if(WSAStartup(MAKEWORD(2,2),&wsa)==SOCKET_ERROR)
sockError(1);
//Open Socket
if((s=socket(AF_INET,SOCK_STREAM,0))<0)
sockError(1); //Open Socket error
//bind
sockSetAddress(&local_addr,INADDR_ANY,portnumber);
if(bind(s,(const struct sockaddr *)&local_addr,sizeof(local_addr))==-1)
sockError(1);
if(listen(s,5)==-1)
sockError(1); //listen error
puts("====TCP File Transfer Server====");
{
struct sockaddr_in client_addr;
int i=0,ifp=0;
int s_accept;
int len_addr=sizeof(client_addr);
int retval=1;
char buf[BUF_SIZE];
s_accept=accept(s,(struct sockaddr *)&client_addr, &len_addr);
if(s)
{
fp=fopen(filename,"w");
//ifp=open(filename,O_RDWR|O_CREAT|O_TRUNC);
}
while((retval=recv(s_accept,buf,BUF_SIZE,0))!=0)
{
fwrite(buf,retval,1,fp);
}
}
return 0; //Normal Execute
}
윈도우에서 파일을 열때 바이너리 모드로 해서 저장해
윈도우에서 파일을 열때
바이너리 모드로 해서 저장해 보세요..
fopen(filename, "wb")
댓글 달기