(C 소켓 프로그래밍) 동일한 클라이언트 recv () 버퍼에서 끝나는 서버에서 별도의 send () 호출

사용자 2209521

두 개의 개별 send () 호출이 테스트를 위해 루프백 주소를 사용하는 동일한 recv () 버퍼에서 끝나는 이유에 대해 누군가가 밝힐 수 있는지 궁금합니다. 한 번 두 개의 원격 시스템으로 전환하면 대신 두 개의 recv () 호출이 필요합니다. ? 나는 wireshark 캡처를 보았지만 이것이 왜 발생하는지에 대해 이해가되지 않는 것 같습니다. 아마도 누군가가 내 코드를 비판하고 내가 잘못되고있는 곳을 말해 줄 수있을 것입니다. 서버에서 들어오는 두 개의 메시지는 클라이언트에 대한 길이가 결정되지 않습니다. 그건 그렇고 우분투에서 C를 사용하여 BSD 소켓을 사용하고 있습니다.

아래에 표시된 예에서 전체 버퍼를 구문 분석하여 두 개의 개별 메시지를 추출하는 것은 이상적인 접근 방식이 아닙니다.

-------서버 측--------

// Send greeting string and receive again until end of stream
ssize_t numBytesSent = send(clntSocket, greeting, greetingStringLen, 0);
if (numBytesSent < 0)
  DieWithSystemMessage("send() failed");

//-----------------------------Generate "RANDOM" Message -----------------------

srand(time(NULL)); //seed random number from system clock

size_t randomStringLen = rand() % (RANDOMMSGSIZE-3); //generates random num
                                                     // betweeen 0 and 296

char randomMsg [RANDOMMSGSIZE] = "";

// declare and initialize allowable characteer set for the
const char charSet[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (randomStringLen) {
    --randomStringLen;
    for (size_t i = 0; i < randomStringLen; i++) {
        int p = rand() % (int) (sizeof charSet - 1);
        randomMsg[i] = charSet[p];
    }
    randomStringLen = strlen(randomMsg);
    printf("Random String Size Before newline: %d\n", (int)randomStringLen);

strcat(randomMsg,"\r\n");
}

randomStringLen = strlen(randomMsg);

printf("Random String: %s\n", randomMsg);

//-----------------------------Send "RANDOM" Message ---------------------------

// Send greeting string and receive again until end of stream
numBytesSent = send(clntSocket, randomMsg, randomStringLen, 0);
if (numBytesSent < 0)
  DieWithSystemMessage("send() failed");

//------------------------------------------------------------------------------

------고객 입장에서-------

//----------------------------- Receive Server Greeting ---------------------------

char buffer[BUFSIZE] = ""; // I/O buffer
// Receive up to the buffer size (minus 1 to leave space for
// a null terminator) bytes from the sender
ssize_t numBytesRcvd = recv(sock, buffer, BUFSIZE - 1, 0);

if (numBytesRcvd < 0)
  DieWithSystemMessage("recv() failed");
buffer[numBytesRcvd] = '\0'; //terminate the string after calling recv()

printf("Buffer contains: %s\n",buffer); // Print the buffer

//printf("numBytesRecv: %d\n",(int)numBytesRcvd); // Print the buffer


//------------------------ Extracts the random message from buffer ---------------------------

char *randomMsg = strstr(buffer, "\r\n"); // searches from first occurance of substring
char randomMessage [BUFSIZE] = "";
strcat(randomMessage, randomMsg+2);

int randomStringLen = strlen(randomMessage)-2;

printf("Random Message: %s\n",randomMessage); // Print the buffer

char byteSize [10];
sprintf(byteSize,"%d", randomStringLen);
printf("ByteSize = %s\n",byteSize);

//----------------------- Send the number for random bytes recieved -------------------------

size_t byteStringLen = strlen(byteSize); // Determine input length

numBytes = send(sock, byteSize, byteStringLen, 0);
if (numBytes < 0)
  DieWithSystemMessage("send() failed");
else if (numBytes != byteStringLen)
  DieWithUserMessage("send()", "sent unexpected number of bytes");

shutdown(sock,SHUT_WR); // further sends are disallowed yet recieves are still possible

//----------------------------------- Recieve Cookie ----------------------------------------
에반 다크

유닉스 시스템 recvsend의 단지 특별한 경우입니다 readwrite그 추가 플래그를 받아들입니다. (Windows는 Winsock으로이를 에뮬레이트합니다.)

일반적으로 사실이 아니기 때문에 하나가 하나에 recv해당 한다고 가정해서는 안됩니다 send(단일 쓰기로 작성 되었더라도 여러 부분으로 파일을 읽을 수있는 것처럼). 대신 메시지의 길이를 알려주는 헤더로 각 "메시지"를 시작해야합니다. 별도의 메시지가 무엇인지 아는 것이 중요한 경우, 중요하지 않은 경우 일반 파일처럼 스트림을 읽어야합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Windows Phone 8.1에서 소켓 프로그래밍 다중 클라이언트 하나의 서버

분류에서Dev

c Linux를 사용하는 하나의 프로그램에서 TCP 소켓 클라이언트 및 서버

분류에서Dev

C # 비동기 소켓 서버는 클라이언트에서 하나의 메시지 만받습니다.

분류에서Dev

C에서 클라이언트 및 서버 send () 및 recv ()

분류에서Dev

소켓 프로그래밍-간단한 클라이언트 / 서버

분류에서Dev

클라이언트와 서버 간의 .c 프로그래밍에서 SIP 세션을 설정하는 방법

분류에서Dev

소켓 프로그래밍은 여러 클라이언트를 하나의 서버에 연결하고 나열합니다.

분류에서Dev

소켓 C # 클라이언트 / 서버로 파일 보내기

분류에서Dev

소켓 프로그래밍 클라이언트는 파일을 동시에 보내고받습니다.

분류에서Dev

Java에서 단일 서버 클래스를 호출하는 두 개의 클라이언트 시뮬레이션

분류에서Dev

C 소켓 클라이언트에서 Java 소켓 서버로 입력 읽기

분류에서Dev

클라이언트 소켓 프로그램에서 단일 읽기에 대한 서버 소켓의 다중 쓰기?

분류에서Dev

클라이언트가 서버 C와 연결되지 않음 (소켓 프로그래밍)

분류에서Dev

recv를 호출하고 서버와 클라이언트 측 모두에서 기능을 보내는 동안 클라이언트의 파일 설명자가 사용되는 이유는 무엇입니까?

분류에서Dev

Python 서버 및 Android 클라이언트를 사용한 소켓 프로그래밍

분류에서Dev

asyncio 소켓 서버에서 클라이언트의 호스트 이름 결정

분류에서Dev

C에서 원격 호스트에 연결 (소켓 프로그래밍)

분류에서Dev

C 소켓 서버 프로그래밍 전송 파일

분류에서Dev

C ++-동일한 프로그램에서 하나의 서버 스레드와 하나의 클라이언트 스레드 실행

분류에서Dev

소켓을 통해 Java 클라이언트에서 c 서버로 int 쓰기

분류에서Dev

서브 서버 소켓이 다운되는 동안 ZMQ 펍 클라이언트 소켓이 메시지를 버퍼로 만들려면

분류에서Dev

Java의 소켓을 통해 클라이언트에서 서버로 파일 전송

분류에서Dev

C #에서 클라이언트 서버 프로그래밍을 시작하는 방법

분류에서Dev

하나의 솔루션에서 wpf 클라이언트에서 서버로 호출하는 동안 시간 초과 예외

분류에서Dev

여러 순차 클라이언트에서 서버에 대한 단일 영구 소켓 연결로의 tcp 소켓 전달

분류에서Dev

소켓 프로그래밍에서 버퍼로부터 데이터 수신

분류에서Dev

Unix 도메인 소켓 C 서버 및 Python 클라이언트

분류에서Dev

소켓 C 서버, 안드로이드 클라이언트

분류에서Dev

클라이언트 소켓에서 동시에 여러 요청에 응답하는 소켓 서버

Related 관련 기사

  1. 1

    Windows Phone 8.1에서 소켓 프로그래밍 다중 클라이언트 하나의 서버

  2. 2

    c Linux를 사용하는 하나의 프로그램에서 TCP 소켓 클라이언트 및 서버

  3. 3

    C # 비동기 소켓 서버는 클라이언트에서 하나의 메시지 만받습니다.

  4. 4

    C에서 클라이언트 및 서버 send () 및 recv ()

  5. 5

    소켓 프로그래밍-간단한 클라이언트 / 서버

  6. 6

    클라이언트와 서버 간의 .c 프로그래밍에서 SIP 세션을 설정하는 방법

  7. 7

    소켓 프로그래밍은 여러 클라이언트를 하나의 서버에 연결하고 나열합니다.

  8. 8

    소켓 C # 클라이언트 / 서버로 파일 보내기

  9. 9

    소켓 프로그래밍 클라이언트는 파일을 동시에 보내고받습니다.

  10. 10

    Java에서 단일 서버 클래스를 호출하는 두 개의 클라이언트 시뮬레이션

  11. 11

    C 소켓 클라이언트에서 Java 소켓 서버로 입력 읽기

  12. 12

    클라이언트 소켓 프로그램에서 단일 읽기에 대한 서버 소켓의 다중 쓰기?

  13. 13

    클라이언트가 서버 C와 연결되지 않음 (소켓 프로그래밍)

  14. 14

    recv를 호출하고 서버와 클라이언트 측 모두에서 기능을 보내는 동안 클라이언트의 파일 설명자가 사용되는 이유는 무엇입니까?

  15. 15

    Python 서버 및 Android 클라이언트를 사용한 소켓 프로그래밍

  16. 16

    asyncio 소켓 서버에서 클라이언트의 호스트 이름 결정

  17. 17

    C에서 원격 호스트에 연결 (소켓 프로그래밍)

  18. 18

    C 소켓 서버 프로그래밍 전송 파일

  19. 19

    C ++-동일한 프로그램에서 하나의 서버 스레드와 하나의 클라이언트 스레드 실행

  20. 20

    소켓을 통해 Java 클라이언트에서 c 서버로 int 쓰기

  21. 21

    서브 서버 소켓이 다운되는 동안 ZMQ 펍 클라이언트 소켓이 메시지를 버퍼로 만들려면

  22. 22

    Java의 소켓을 통해 클라이언트에서 서버로 파일 전송

  23. 23

    C #에서 클라이언트 서버 프로그래밍을 시작하는 방법

  24. 24

    하나의 솔루션에서 wpf 클라이언트에서 서버로 호출하는 동안 시간 초과 예외

  25. 25

    여러 순차 클라이언트에서 서버에 대한 단일 영구 소켓 연결로의 tcp 소켓 전달

  26. 26

    소켓 프로그래밍에서 버퍼로부터 데이터 수신

  27. 27

    Unix 도메인 소켓 C 서버 및 Python 클라이언트

  28. 28

    소켓 C 서버, 안드로이드 클라이언트

  29. 29

    클라이언트 소켓에서 동시에 여러 요청에 응답하는 소켓 서버

뜨겁다태그

보관