2009-04-02 2 views
0

나를 도울 수 있기를 바랍니다.readv(), writev(), WSARecv(), WSASend()

나는 TCP/IP를 통해 네트워크를 통해 1000 비트의 패킷을 보내려고하고 있으며 Cygwin과 Windows에서 겹친 I/O 기술을 사용할 수 있기를 기대했다.

Cygwin에서 Windows에서 1000 비트를 보내기 위해 "readv() 및 writev()"함수 호출을 사용하려고하는데 winsock2에서 WSASend() 및 WSARecv() API를 사용하려고합니다. .h 헤더 파일.

Cygwin (client.cpp)에서 Windows (server.cpp)로 1000 비트 만 전송할 수있는 것으로 보입니다. 1000 비트 이상, 예기치 않은 결과가 발생합니다. 비트가 감싸 지거나 덮어 쓰여진 것처럼 보입니다.

나는 인터넷을 통해 모든 것을 검색했지만 아무도 내가 한 것처럼이 접근법을 사용해 본 적이 없으므로 여기에 귀하의 도움을 요청하고 있습니다.

답변

0

귀하의 질문은 매우 명확하지 않다, 당신이 그것을 명확히 할 필요가 당신과 안부, 고넬료 감사드립니다. 다음은 몇 가지 아이디어입니다.

  • TCP를 사용하여 "패킷"을 보내는 것은 좋은 생각이 아닙니다. TCP의 데이터 모델은 바이트 스트림입니다.
  • 1000 바이트가 아닌 1000 비트를 사용 하시겠습니까?
  • "예상치 못한 결과"가 의미하는 바를 분명히해야합니다. 매우 모호합니다.
  • Overlapped I/O은 비동기 I/O를위한 Windows 특정 기술 인 것 같습니다. Cygwin에서 작동하지 않을 것입니다.
1

Windows에서 겹친 I/O를 사용하려면 코드 프로젝트에서 썼던 몇 가지 기사를 살펴보고 시작점을 제공 할 수 있습니다. 이들은 IO Completion Ports를 사용하는데, 이는 Windows에서 중복 I/O를 수행하는 가장 효율적인 방법이며 완전한 소스 코드와 함께 제공됩니다. 기사 및 최신 소스 here에 대한 링크가 있습니다.

간략한 문제 설명에서 무엇이 잘못 될지 정확하게 말하기는 어렵습니다. 당신의 읽기가 당신이 쓰고있는 것과 같은 양의 데이터를 읽을 것이라고 가정하고 이것이 TCP의 경우가 아닌 경우가 대부분입니다. TCP는 바이트 스트림이며, 읽음은이를 고려하여 완전한 '메시지'를 재구성 할 때까지 반복해야합니다.

관련 문제