2011-12-09 1 views
2

텔넷을 통해 응용 프로그램에 긴 문자열을 보내려고합니다.소켓 문제 : 약 3,160 자 이상의 문자열을 어떻게 받습니까?

{ok, Sock} = gen_tcp:listen(Port, [{active, true}, {reuseaddr, true}], 
{ok, Sock} = gen_tcp:accpet(Sock), 
% start a process when someone connects 
{ok, Pid} = my_sup:start_handler(Sock), 
inet:setopts(Socket,[{active, once},{buffer, 2310731}, {recbuf, 1310731},{sndbuf, 1310731}]), 
gen_tcp:controlling_process(Socket, Pid), 

연결된 클라이언트가 gen_server입니다 처리 내 과정을 내가받을 수있는 표준

handle_info ({tcp, Sock, Data}, State) -> 

를 사용하고 incomming를 처리 : 내 응용 프로그램에서

, 내가 가진 소켓을 설정 보낸 사람의 메시지

처음에는 약 1,500 자의 문자열 만 보낼 수 있었고 버퍼 크기를 늘리려면 setopts/2 명령을 추가했습니다. 그러나 소켓을 약 3,160 개 이상의 문자를 처리 할 수는 없습니다.

getopts를 통해 값을 인쇄하여 setopts/2 호출에 표시된 값인지 확인했습니다.

나는 대형으로 문자열 값 최소 4 번 POST 내 HTTP 인터페이스를 활용할 수 있습니다 내가 무엇을 놓치고 ... 텔넷/소켓 클라이언트를 통해

를 얻을?

답변

0

packet 또는 line 옵션을 지정하지 않으면 하나의 TCP 패킷에서 보낸 것만 받게됩니다. 그래서 더 많이 받기를 원하면 우리 자신의 수신 루프와 프로토콜을 작성해야합니다. 추가 데이터는 버퍼에서 대기 중이지만 수집하지는 않았습니다.

+0

활성 한 번 소켓으로 시작하는 것이 합당한가요? 그리고 한 줄에 내 터미네이터가 포함되어 있다면 좋습니다. 하지만 수동 모드로 전환하고 나머지 데이터를 recv/2로 전환하지 않으면 어떻게됩니까? – Jr0

+0

@ Jr0 : 예, 한 가지 방법입니다. '{active, once}','receive' 루프도 반복 할 수 있습니다. –

+0

수신 버퍼보다 ​​긴 경우 한 번 활성화되지 않으면 줄이 잘리지 않습니까? – Jr0

관련 문제