2010-08-19 5 views
0

우리는 자바 서버 소켓 문제는 그 작업) (블록 전송 /()에 연결연결/보내기에서 시간 초과를 설정하는 방법은 무엇입니까? (AS400의 i 시리즈 V5R4, 롤 플레잉)이 <a href="http://www.scottklement.com/rpg/socktut/tutorial.html" rel="nofollow noreferrer">rpg socket tutorial</a>에서

에게 호출 롤 플레잉의 소켓 클라이언트를 생성하고 우리는 요구 사항 경우가 연결/전송은 1 초마다 완료 할 수 없습니다. 우리는 단지 기록하고 완료해야합니다.

소켓을 비 차단 모드로 설정하면 (fnctl로 생각합니다), 우리는 진행 방법을 완전히 이해하지 못하고 있으며 예제가있는 유용한 문서를 찾을 수 없습니다.

내가 차단 (non-blocking) 소켓에 연결하면 연결이 성공하고/(바이트)를 보낼 수 있는지 알려주는 select (..., timeout)을 수행해야한다고 생각합니다. 하지만, 나중에 (바이트)를 보내면, 비 블로킹 소켓 (즉, 호출 후에 즉시 반환 됨)이므로, send()가 실제로 바이트를 서버에 보내기 전에 소켓?

AS400의 클라이언트 소켓을 자바 또는 C 프로 시저로 사용할 수 있지만 간단히 RPG 프로그램에 보관하고 싶습니다.

제발 저에게 어떻게 도와 주실 수 있습니까? 감사합니다.

답변

2

내 생각에, 당신이 언급 한 RPG 튜토리얼에는 약간의 결함이 있습니다.

...
이 결과적으로, 우리는 일반적으로이 같은 전송() API 호출 :

D miscdata  S    25A 
D rc    S    10I 0 

C     eval  miscdata = 'The data to send goes here' 
C     eval  rc = send(s: %addr(miscdata): 25: 0) 
c     if  rc < 25 
C* for some reason we weren't able to send all 25 bytes! 
C     endif 

을 ...

내가 믿는 당신의 혼란을 일으키는 것은 다음 section's 코드

send()의 설명서를 읽으면 위의 코드에서 반환 값이 -1보다 큰 경우 오류를 나타내지 않습니다. 마치 오류가 발생한 것처럼 보입니다. 사실, 리턴 된 값의 합계는 버퍼에 포인터를 이동시켜 전송 된 것을 반영한다고 가정 할 때 버퍼의 크기와 동일해야합니다. hereBeej's Guide to Network Programming입니다. 리차드 스티븐스 (Richard Stevens)의 책 UNIX Network Programming, Volume 1을보고 자세한 설명을 듣고 싶을 수도 있습니다.

close() 전에 마지막으로 보낼 것인지 결정하는 문제에 관해서는 위의 단락은 데이터의 어떤 부분을 보낸 것인지 결정하는 방법을 설명합니다. 그러나 SO_LINGER이 설정되어 있지 않으면 close()을 호출하면 보내지 않은 모든 데이터를 보내려고 시도합니다.

fnctl()은 블로킹을 제어하는데 사용되고, setsockopt()SO_LINGER을 설정하는데 사용된다.

사용되고있는 네트워크 통신의 추상화는 BSD 소켓입니다. OS마다 약간의 차이점이 있지만 일반적으로 상당히 균질합니다. 이것은 일반적으로 광범위한 개요를 위해 다른 OS 용으로 작성된 문서를 사용할 수 있음을 의미합니다. 대부분의 시간은입니다.