[윈도우] 자바 - C언어 간 파일전송이 제대로 되지 않습니다.

akcytm의 이미지

자바에서 파일 전송(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
}

Anti-Lock의 이미지

윈도우에서 파일을 열때
바이너리 모드로 해서 저장해 보세요..
fopen(filename, "wb")

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.