[초보질문] 소켓통신에서 서로 다른파일의 연속전송 문제....
다사다난 했던 2006년도가 몇시간 남지 않았군요.
이곳에 들르시는 모든분들 새해에는 건강하시고 복 많이 받으시기 바랍니다.
책을 보고 검색을 해가며 C를 공부하고 있는 초년생입니다.
소켓 통신에서 서버측과 클라이언트측의 간단한 프로그램을 만들어 시험중입니다.
서버측에서나 클라이언트측에서 파일 하나씩을 전송하고 수신 할 경우에는 문제 없이 잘 됩니다.
그런데 서버측이나 클라이언트측에서 예를들어 파일을 한번 전송하고 수신한후 다시 파일 두개를 연속 전송한후 상대측에서 받으려면 잘 않되고 있습니다.
예)
화일1번
aaaaa
bbbbbbb
cccccccc
2번화일
ddddddd
eeeeeeeeee
fffffffffff
소스가 배우는중이라 너무 허접하고 길어서 전체를 올려드리지는 못하고 대략 아래와 같은 형식으로 만들어저 있는데 어떻게 수정해야 연속 전송시 상대측에서 수신이 가능한지 알려 주시면 감사 하겠습니다.
보내는 측이나 받는측이나 파일 싸이즈를 아래와 같이 대략 지정해서 보내고 받고 있습니다.
프로세스와 쓰레드 개념이 잘 잡히지 않아 고생 하고 있는게 아닌가 생각이 드는군요.
서버측;
헤더파일 선언; int main(int argc, char *argv[]) { 변수선언; 소켓생성; //소켓 LISTEN if (listen(sockfd, BACKLOG) == -1) { perror("listen"); exit(1); } //while문 시작 while(1) { /* main accept() loop */ sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \ &sin_size)) == -1) { perror("accept"); continue; } //child process 생성 시작 if (!fork()) { /* child process 생성 */ //서버 접속확인 메세지 전송 if (send(new_fd, "서버에 연결되었습니다.\n\n", 50, 0) == -1){ perror("send"); exit(1); } //1번 화일을 수신한다 if ((numbytes=recv(new_fd, buf, 50, 0)) == -1) { perror("recv"); exit(1); } buf[numbytes] = '\0'; printf("파일이름 수신 시험; %s\n", buf); //2번 화일을 수신한다 =========>이부분 부터 에러가 생깁니다. 1번 화일 수신방식과 같은 형식으로 코딩 해줍니다. .......... ............ ....... } // fork() 함수끝 close(new_fd); //소켓을 닫는다. while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */ } //while문 끝 }main 끝
클라이언트측 소스도 서버측 소스와 같은 방식입니다만 fork()함수만 사용 하지 않고 있습니다.
파일을 서버나 클라이언트 모두 한번씩만 전송하고 수신 하는건 문제가 없는데 한번이상 전송하고 수신 하거나 또는 연속 두번 이상 서로 다른 파일을 전송 하거나 수신 할 경우에는
send: Bad file descriptor
recv: Connection reset by peer 이라는 에러 메세지가 생겨 잘 되지 않는군요.
책을 찾아봐도 제대로 이해 하기가 힘드네요.
도움좀 주시면 공부 열심히 해서 보답 하겠습니다.
2007년 새해에 모든분들 새해 복 많이 받으시기 바랍니다.
그냥 파일 데이터를
그냥 파일 데이터를 읽어서 send(), recv() 하는 형태군요.
2개 이상의 파일을 전송하기 위해서는 님께서 님만의 독특한 규칙(protocol)을 정의하고,
클라이언트와 서버 간에 데이터를 전송할 때 이 규칙에 맞춰서 해 줘야 합니다.
파일전송이 주목적이라면 최소 파일명, 파일크기 정도는 던져줘야겠죠.
그리고 파일 데이터와 파일에 관한 정보를 구분하는 추가 정보도 들어가야겠고요.
Written By the Black Knight of Destruction
답변 감사합니다. 그런데...
답변 감사합니다.
새해에 복 많이 받으시기 바랍니다.
그런데 아래와 같이 연속해서 2개의 파일을 보내고 받아도 되는건지 궁금 하군요.
내공이 약해서 이유는 잘 모르겠지만 꼭 않될것 같아서요.
다른 소스들 삽질해 보면 저처럼 무식하게 코딩 한것들을 볼수가 없기도 하고요.
전송측;
수신측;
위와 같이 하면 두번짼 파일 보내고 받기부터 에러가 발생합니다.
그리고 알려주신내용중 파일명, 파일크기 등을 어디에 맞추어줘야 하는지요?
파일명은 별도로 추출해서 위와 갈은 방법으로 전송하고 잇습니다.
간단한 예라도 알려주시면 감사하겟습니다.
살며 그리고 사랑하며...
정보는 공유할때 그 가치가 있는것.....
나의 조그만 지식공유는 남에게 엄청난 기쁨을 안겨 준다.
살며 그리고 사랑하며...
정보는 공유할때 그 가치가 있는것.....
나의 조그만 지식공유는 남에게 엄청난 기쁨을 안겨 준다.
댓글 달기