리눅스에서 write()함수 리턴값
글쓴이: ryuts / 작성시간: 수, 2008/10/22 - 3:28오후
서버와 클라이언트가 같은 서버에 존재 하며,
서버 측에서는 accept외에 다른 어떤 액션도 취하지 않는 상태입니다.
클라이언트측에서 커넥트를 성공하고 write를 하면 -1 리턴이 와야 할거 같은데(서버에서 recv(read)를 하지 않으므로,)
클라이언트 write는 지정해준 패킷만큼 썻다고 (길이가 4이면 4를..) 리턴값을 돌려 줍니다.
클라이언트 read(recv)는 서버에서 당연히 write를 안하므로 에러가 오는데... 이놈에 write(client)가 계속 서버측에서
받지도 않는데 보냈다고 리턴값을 보내내요.. 이런 현상 겪어 보신분 도움좀 구하겠습니다.
Forums:
write()는 쓰는
write()는 쓰는 것까지만 체크하고 그 다음에 어떻게 되는지는 체크하지 않습니다. 예를 들면, 설사 디스크에 write()을 했다고 하더라도, 실제로 디스크에 해당 바이트가 기록되었는지의 여부는 알 수 없는 거죠. (엄청난 버그가 있는 implementation이 아니라면 이런 일은 없겠습니다만. :-)) 정상적인 동작으로 보입니다.
----
Let's shut up and code.
----
Let's shut up and code.
헐...
아~ 우선 답변 감사드립니다.
그렇다면 write()함수는 단순히 송신버퍼에 쓰기만을 하고 나머지는 어떻게 되든 상관않는다는 말씀인가요!?
그렇다면 서버측에 recv(read)가 안되는걸 client에서 체크 할 방법은 없는건가요 ?!
아마 서버쪽 버퍼에
아마 서버쪽 버퍼에 전송되는것 까지는 TCP로 연결하셨다면 보장될지도 모릅니다. 몇년전에 본것들이라 기억이 잘 안나네요.. 잘 아시는 분들이 확인해 주셨으면 좋겠습니다. 그리고 소켓에 쓰실거면 write()보단 send()를 쓰시는 게 나으실 거예요.
그리고 전송을 받았는지를 프로토콜에 의존하셔야 하지 않을까요? 서버에서 받으면 받았다는 패킷을 보내주고, 클라이언트에서는 받길 기다린다든가.. 머 이런 식으로요. timeout/resend 메커니즘을 잘 활용하시면 신뢰성 있는 통신을 하실 수 있을 겁니다.
----
Let's shut up and code.
----
Let's shut up and code.
댓글 달기