2012-02-18 2 views
1

클라이언트와 서버 프로그램이 있습니다. 클라이언트는 먼저 파일을 바이트로 변환 한 다음 서버로 전송하여 파일을 서버로 보냅니다. 그러면 서버는받은 바이트를 사용하여 파일을 재구성합니다. 서버 프로그램에 문제가 있습니다. 때때로 수신하는 바이트가 불완전합니다.소켓을 사용하여 바이트/파일을 올바르게 보내고받는 방법은 무엇입니까?

이제 인터넷을 통해 검색 한 결과 나 자신과 같은 초보 프로그래머에게 공통적 인 문제임을 알았습니다. 내가 찾은 솔루션을 시도했지만 아무 것도 효과가 없었습니다. (나는 이미 이틀 동안이 작업을 해왔다.)

랜에서 두 프로그램간에 파일/바이트를 보내고받는 올바른 방법이 궁금했다. (하나는 서버이고 다른 하나는 클라이언트이지만 당연히 서버 프로그램에 연결할 클라이언트 프로그램이 두 개 이상있을 수 있습니다.)

누군가가이 문제를 해결하는 데 도움이되기를 바랍니다. 제발 ... 나는 소켓 프로그래밍에 능숙하고 바이트에 관한 유용한 정보를 제공 할 수 있기를 바랍니다.

몇 가지 추가 정보 : 실제로이 포럼 주제의 코드는 DANIWEB입니다. 스레드를 통해 읽는이 프로그램은 완벽하게 작동했으며 400MB 이상의 비디오 파일도 보낼 수있었습니다. 제 경우에는 크기가 10MB 미만의 작은 이미지와 문서 파일 만 보내고 내 서버 프로그램은 더 자주 실패하고 성공합니다.

이미이 문제와 관련된 question을 요청했지만 주어진 답을 시도했지만 프로그램이 여전히 실패합니다. 나는 또한 내 질문에 나에게 주어진 대답과 조금 비슷한 MSDN에서 뭔가를 발견했다. 그것도 시도했지만 내 서버 프로그램은 여전히 ​​실패합니다.

답변

1

대답하기가 어렵습니다. 닷넷 플랫폼에서 소켓 프레임 워크를 사용하는 것이 좋습니다. 혼자서 개발할 시간을 많이 절약 할 것입니다. SuperSocket

+0

감사합니다. 이걸 사용하는 법을 쉽게 배울 수 있기를 바랍니다. – Xel

+0

이 프로젝트에 대한 아주 나쁜 문서 작업입니다. 나쁜 예. – alerya

2

당신은 "불완전한"말 -이 보통 점 두 가지 중 하나에 :

  • 보낸 사람이 사용 가능 "월리"지난 몇 바이트가 여전히 자신의 말에 개최 될 수있을 수 있습니다 (OS/NIC)를 사용하십시오. 의미 : Send/Write/etc를 호출 했음에도 불구하고 여전히 클라이언트 컴퓨터를 떠나지 않았습니다. 이것은 예기치 않은 것이 아닙니다. 그들은 소켓을 닫거나 적어도 send-shutdown을 보내거나 nagle을 설정 (NoDelay = true로 설정)하고 조각을 너무 많이하지 않아도되도록 강제 할 수 있습니다 (BufferedStream이 유용 할 수 있습니다).
  • 수신기가 항상 전체 프레임을 얻는 것은 아닙니다. 모든 읽기/BeginRead/ReceiveAsync/etc에서 모든 것은 "일부 바이트"또는 "EOF"입니다. 따라서 경쟁 프레임이 생길 때까지 계속 읽어야합니다. 그렇다면 질문은 프로토콜에 의해 정의 된 프레임은 무엇입니까? 일반적인 접근법은 길이 접두사 (또는 헤더의 길이) 또는 특수 프레임 종료 시퀀스입니다.

코드없이 더 많은 것을 해석하는 것은 불가능합니다. 그러나 다른 답변에서 언급했듯이 소켓 세부 정보를 라이브러리에 오프로드하는 데 도움이 될 수 있습니다. 필자는 현재 OSS에 곧 출시 할 계획입니다.

+0

보낸 사람에게 여전히 몇 바이트가 남아 있으면 강제로 플러시()하여 서버로 이동하지 않겠습니까? btw, 내가이 질문에서 말하는 응용 프로그램의 코드는 다음에서 찾을 수 있습니다. http://stackoverflow.com/questions/9317452/the-bytes-my-server-program-receives-is-incomplete- why-im-using-c-sharp-net # comment11754870_9317452 무엇이 잘못되었는지 살펴보십시오. – Xel

+0

@Xel Flush가 TCP 스트림에서 작동하지 않습니다. 그러나 nagle은 배달 지연을 몇 초 이상 지연시켜야한다고 생각하지 않으며 심지어 패킷이 손실되는 경우에만 배달을 지연시켜야한다고 생각하지 않습니다. 일반적으로 게임/대기 시간이 중요한 응용 프로그램은 독수리를 사용하지 않도록 설정해야합니다. – CodesInChaos

+0

@Xel CodeInChaos는 Flush()가 여기에 아무 것도하지 않는다는 것을 절대적으로 옳지 만, 나는 그것을 추가해야합니다 ... –

관련 문제