유닉스 도메인 소켓을 통해 데이터를 공유하는 두 개의 간단한 프로그램을 설정했습니다. 하나의 프로그램은 Queue에서 데이터를 읽어서 다른 응용 프로그램으로 보냅니다. 전송되기 전에 각 데이터 조각은 길이가 4 바이트 앞에 붙습니다. 4 바이트보다 작 으면 왼쪽 위에있는 바이트는 '^'기호입니다.유닉스 도메인 스트림 소켓 더 많은 데이터를 보내야합니다.
클라이언트 응용 프로그램은 처음 네 바이트를 읽고 버퍼를 적절한 크기로 설정 한 다음 나머지를 읽습니다. 내가 가지고있는 문제는 처음 메시지를 완벽하게 보냈다는 것입니다. 그 후 다른 시간에 여분의 데이터가 전송되므로 "좋은 하루를 보낸다"와 같은 메시지가 "좋은 하루를 보낸다"라는 메시지가 나옵니다. 그래서 버퍼가 정확하게 지워지지 않는 것처럼 느껴지지만 그것을 찾지 못하는 것 같습니다.
클라이언트 코드 :
listen(sock, 5);
for (;;)
{
msgsock = accept(sock, 0, 0);
if (msgsock == -1)
perror("accept");
else do
{
char buf[4];
bzero(buf, sizeof(buf));
if ((rval = read(msgsock, buf, 4)) < 0)
perror("reading stream message");
printf("--!%s\n", buf);
string temp = buf;
int pos = temp.find("^");
if(pos != string::npos)
{
temp = temp.substr(0, pos);
}
int sizeOfString = atoi(temp.c_str());
cout << "TEMP STRING: " << temp << endl;
cout << "LENGTH " << sizeOfString << endl;
char feedWord[sizeOfString];
bzero(feedWord, sizeof(feedWord));
if ((rval = read(msgsock, feedWord, sizeOfString)) < 0)
perror("reading stream message");
else if (rval == 0)
printf("Ending connection\n");
else
printf("-->%s\n", feedWord);
bzero(feedWord, sizeof(feedWord));
sizeOfString = 0;
temp.clear();
}
while (rval > 0);
close(msgsock);
}
close(sock);
unlink(NAME);
서버 코드
pthread_mutex_lock(&mylock);
string s;
s.clear();
s = dataQueue.front();
dataQueue.pop();
pthread_mutex_unlock(&mylock);
int sizeOfString = strlen(s.c_str());
char sizeofStringBuffer[10];
sprintf(sizeofStringBuffer, "%i", sizeOfString);
string actualString = sizeofStringBuffer;
int tempSize = strlen(sizeofStringBuffer);
int remainder = 4 - tempSize;
int x;
for(x =0; x < remainder; x++)
{
actualString = actualString + "^";
}
cout << "LENGTH OF ACTUAL STRING: " << sizeOfString << endl;
actualString = actualString + s;
cout << "************************" << actualString << endl;
int length = strlen(actualString.c_str());
char finalString[length];
bzero(finalString, sizeof(finalString));
strcpy(finalString, actualString.c_str());
if (write(sock, finalString, length) < 0)
perror("writing on stream socket");
이것은 나에게 좋은 해결책 인 것처럼 보이지만 나는 readv로 무엇을해야하는지 혼동합니다. 독서면에서 iov [0]의 크기로 버퍼를 설정합니다.iov_len 그리고 그 버퍼를 iov [1] .iov_base로 채 웁니다. 이 경우에 – whatWhat
은 readv를 사용할 수 없습니다. 먼저 4 바이트 길이 필드를 읽고 지정된 길이의 두 번째 버퍼를 읽어야합니다. – Alnitak
여전히 문제의 코드에 근본적인 문제를 수정하지 않습니다. 즉, 읽을 문자열이 null로 끝나지 않아 printf()가 문자열을 출력하고 일부 스택은 첫 번째 null까지 인쇄합니다 발생했습니다. – Beano