프로그램 용 소켓 관리자를 만들려고합니다.소켓 - 정확한 양의 데이터 받기
내 문제는 내가 소켓에서 버퍼에 정확한 양의 데이터를 검색해야합니다.
1)를 사용하여 정적 배열
같은 정적 버퍼가 나를 위해 작동 만들기,하지만 난 항상 데이터의 크기가 수신 할 수 알 수 없습니다.
ubyte[2] buffer;
socket.receive(buffer);
이 작동하지 않습니다
그래서 내 첫 번째 질문은int size = buffer[0]; // for example ...
ubyte[size] buffer2; // crash at compilation because size is not known
socket.receive(buffer2);
: 가 컴파일에서 크기를 모른 채 정적 배열을 할 수 있습니까?
동적 버퍼를 사용하는 방법을 검색했지만 다른 문제가 발생했습니다. 버퍼
ubyte[] buffer;
socket.receive(buffer);
ubyte[2] header = buffer[0..2];
이 작동하지만, 어떻게 메인 버퍼에서 추출 슬라이스를 제거 할 수 있습니다에서 데이터를 추출하기 위해 조각을 사용하여
2)?
Error: undefined identifier tuple
: 내가 모르는 나를 위해 작동 왜, 내가 컴파일에서이 오류가없는
buffer = remove(buffer,tuple(0,2));
않습니다 튜플로 std.algorithm에서 제거 기능을 사용하여,이 방법은 여기에 무슨 문제가 있습니까?
또한 비동기이기 때문에 소켓이 비 블로킹입니다. 소켓이 동시에 데이터를 푸시하려고하면 주 버퍼에서 제거를 수행하면 문제가 발생합니까?
나를 읽어 주셔서 감사합니다. 불쌍한 영어를 유감스럽게 생각하며, 저는 원어민이 아닙니다.
이 모든 정보를 제공해 주셔서 감사합니다. 나는 뭔가를 만들 수 있었지만 여전히 문제가 남아있다 :'ubyte [] content = new ubyte [size];는 내용의 길이를 같은 크기로 만들어 소켓에서받은 데이터의 길이를 더 이상 테스트 할 수 없다. 버퍼 ... 그것을 얻을 수있는 방법이 있습니까? – Munrek
그래서 내 예제에서는 receive()를 두 번 호출했습니다. 한 번 길이를 가져오고 다시 한 번 크기가 지정된 데이터를 가져옵니다. 좋은 추측을하고 나중에 고칠 수 없다면 소켓 프로그래밍에서이 문제를 해결할 방법이 없습니다. 컴파일시에 추측 할 수 있다면, 다음 중 하나를 수행하십시오 :'ubyte [sizeGuess] buffer; 또는'ubyte [] buffer = new ubyte [sizeGuess];'. 예 : ubyte [] buf = new ubyte [sizeGuess]; auto nBytes = socket.receive (buf); assert (nBytes> 2); ushort size = bigEndianToNative! ushort (buf [0..2]); assert (nBytes - 2> = 크기); // 더 좋을 수있다;) buf = buf [2 .. size + 2]; – chadjoan
이 주석에 코드 서식을 지정하는 것은 어렵습니다. [다음은 pastebin의 예입니다.] (http://dpaste.dzfl.pl/fff2cee8) – chadjoan