현재 두대의 피씨에서 전송 속도를 다르게 하여 ip 패킷을
전송해야 합니다. 두 피씨간의 latency는 보통 1ms 정도
나오는데요.. 이를 50ms 혹은 100ms로 조절하여 전송할 수 있는
방법이 있을까요? 제 생각에는 수신되는 ip 패킷에 응답할 때
정해진 딜레이를 준 후에 응답하면 될 듯 한데.. 관련 자료를
찾을 수가 없네요..
이를 해결할 수 있는 관련 자료 부탁드립니다.
block socket을 사용할때는 랜상에서 초당 10메가의 속도로 파일 전송이 되었습니다. 그런데 non-block으로 바꾸고 EAGAIN or EWOULDBLOCK 에러를 리턴할때 못보낸 데이터를 재전송해주는 코드를 추가했더니 초당 5~6메가 정도밖에 속도가 안나오네요.
데이터 재전송 해주는 코드는 다시 파일을 읽는게 아니라 메모리에 있는 내용을 다시 보내주는거라서 특별히 오버헤드가 발생할 부분은 없습니다. 다만 한번에 보낼걸 두번에 보내는거 빼고는요..
그리고 non-block에서 파일전송시 EAGAIN을 리턴할때는 send buffer에 write하는 속도를 네트워크가 받쳐주지 못해서 그런건가요? 그렇게 보기엔 EAGAIN 나올때마다 write 된 사이즈가 일관되게 나오는게 좀 이상해서요.. 예를들어 write에 8192바이트를 요청했는데 5142바이트만 쓰고 리턴하는것처럼 항상 일정한 값만 쓰고 리턴을 합니다.
[code:1]$uname -a
SunOS solomon 5.8 Generic_108528-15 sun4u sparc SUNW,Ultra-Enterprise-10000
$ gcc -v
Reading specs from /usr/local/gnu/2.95.2/lib/gcc-lib/sparc-sun-solaris2.6/2.95.2/specs
gcc version 2.95.2 19991024 (release)
$ make
gcc -g -O2 -D_REENTRANT -Wall -D__EXTENSIONS__ -c loopudp.c -o loopudp.o
loopudp.c: In function `loop_udp':
loopudp.c:106: `iov' undeclared (first use in this function)
loopudp.c:106: (Each undeclared identifier is reported only once
loopudp.c:106: for each function it appears in.)
loopudp.c:108: `msg' undeclared (first use in this function)