불완전한 TCP 소켓을 통해 char 버퍼 보내기

ro.nin

나는 C에서 소켓과 TCP 연결을 처리하는 방법을 배우고 있습니다. 기본적으로 서버에서 클라이언트로 또는 그 반대로 시스템 호출을 사용하여 문자 배열을 보내고받는 응용 프로그램 (긴 것)이 있습니다 (두 개의 개별 C 응용 프로그램). 물론이야). 동일한 PC에서 터미널에서 서버를 실행하고 다른 서버에서 클라이언트를 실행하는 로컬 연결로 사용하는 한 모든 것이 잘 작동하고 데이터가 대상에 도착합니다. 그러나 한 컴퓨터의 서버와 다른 컴퓨터의 클라이언트이지만 동일한 인터넷 회선에서 시도하면 192.168.1.X (서버가 실행되는 컴퓨터에서 가져옴)와 같은 주소를 클라이언트에 전달합니다. 연결이 설정되면 예상 바이트 수 (실제 char []를 보내기 전에 전달 함)가 도착하지 않았다는 오류가 표시됩니다.

내가 놓친 것이 있습니다. 일련의 바이트를 순서대로 보내는 데 제한이 있습니까?

오류가 발생한 코드입니다.

서버 측:

r=htonl(lghstr);
w=write(myFd,&r,sizeof(int));//writes the number of incoming bytes
if(w<0) perror("writeServer4"),exit(-1);
w=write(myFd,tmp->string,lghstr);
if(w<0) perror("writeServer5"),exit(-1);
if(w!=lghstr) perror("ERROR");

고객 입장에서

rC=read(fdc,&cod,sizeof(int));//read incoming number of bytes
lghstr=ntohl(cod);
if(rC<0) perror("readClient3"),exit(-1);
rC=read(fdc,dest,lghstr);
if(rC<0) perror("readClient4"),exit(-1);
if(rC!=lghstr) perror("error : "), printf("didn't read the right number of bytes"),exit(-1);

이제 이것은 기본적으로 여러 번 반복됩니다. 심지어 300 번이라고합시다. 큰 숫자로 인해 프로그램이 작동하지 않습니다.

셀비

이게 문제 야:

rC=read(fdc,dest,lghstr);
...
if(rC!=lghstr) perror("error : ")

소켓 프로그래밍과 함께 # 1 착오가 있음을 기대 recv()하고 read()정확히 반대편에 의한 쓰기 / 전송 호출에 해당하는 바이트의 같은 수를 반환합니다.

실제로 부분 데이터는 매우 가능성이 높고 예상됩니다. 간단한 해결 방법은 예상되는 정확한 바이트 수를 얻을 때까지 읽기 / 받기를 반복하는 것입니다.

size_t count = 0;
while (count < lghstr)
{
    ssize_t readresult = read(fdc, dest+count, lghstr-count);
    if (readresult == -1)
    {
      // socket error - handle appropriately (typically, just close the connection)
    }
    else if (readresult == 0)
    {
      // The other side closed the connection - handle appropriately (close the connection)
    }
   else
    {
        count += readresult;
    }
}

루핑의 다른 대안은 소켓과 함께 MSG_WAITALL 플래그를 사용하는 것입니다. 이것은 read () 대신 recv ()를 사용하는 것을 의미합니다. 여전히 오류 사례를 처리해야합니다.

rc = recv(fdc, dest, lghstr, MSG_WAITALL);
if (rc == -1)
{
  // socket error
}
else if (rc == 0)
{
  // socket closed by remote
}
else if (rc < lghstr)
{
   // the other side likely closed the connection and this is residual data (next recv will return 0)
}

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

TCP / IP 소켓 (웹 서버)을 통해 파일 보내기

소켓을 통해 파일 보내기-버퍼 크기

소켓을 통해 보내는 최대 버퍼 크기에 대한 지침이 있습니까?

TCP 소켓을 통해 서버에 오디오 쓰기

파이썬에서 TCP 소켓을 통해 파일 보내기

TCP 소켓을 통해 큰 Base64 문자열 보내기

TCP 소켓을 통해 파일 보내기 C++ | 창

c의 tcp 소켓을 통해 구조체 보내기

TCP 소켓을 통해 여러 파일 보내기

TCP 소켓을 통해 16진수 변수 보내기

Python에서 TCP 소켓을 통해 목록 보내기

파이썬에서 TCP 소켓을 통해 클라이언트-서버 간 파일 보내기?

Android에서 소켓을 통해 1MB 버퍼 데이터 보내기

Python TCP '보내기'소켓 버퍼 크기

struct.pack을 사용하여 파일의 전체 크기를 가져오고 TCP 소켓을 통해 서버로 보냅니다.

UDP 소켓을 통해 DNS 서버에 요청 보내기

소켓을 통해 서버에 이미지 보내기

TCP 소켓 파이썬을 통해 단일 바이트 보내기

소켓을 통해 거대한 배열 보내기

클라이언트 또는 서버에 하트 비트를 보내기 위해 Boost asio tcp 소켓을 스레드에 전달하는 방법

TCP 쓰기 소켓에 대해 버퍼링 된 바이트 수를 읽을 수 있습니까?

소켓을 통해 개체 보내기

소켓을 통해 개체 보내기

수신 된 버퍼 크기가 원래 소켓을 통해 전송 된 것보다 큰 이유는 무엇입니까?

Dart TCP 소켓을 통해 원시 바이트를 보내는 방법

TCP 소켓을 통해 큐 또는 스택에서 객체를 보내는 Java

GO에서 원시 소켓을 통해 TCP 패킷 읽기

golang의 tcp 소켓을 통해 수백만 개의 짧은 메시지 보내기

C의 소켓을 사용하여 TCP를 통해 오디오 파일 보내기

TOP 리스트

  1. 1

    Ionic 2 로더가 적시에 표시되지 않음

  2. 2

    JSoup javax.net.ssl.SSLHandshakeException : <url>과 일치하는 주체 대체 DNS 이름이 없습니다.

  3. 3

    std :: regex의 일관성없는 동작

  4. 4

    Xcode10 유효성 검사 : 이미지에 투명성이 없지만 여전히 수락되지 않습니까?

  5. 5

    java.lang.UnsatisfiedLinkError : 지정된 모듈을 찾을 수 없습니다

  6. 6

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  7. 7

    상황에 맞는 메뉴 색상

  8. 8

    SMTPException : 전송 연결에서 데이터를 읽을 수 없음 : net_io_connectionclosed

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    Windows cmd를 통해 Anaconda 환경에서 Python 스크립트 실행

  11. 11

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  12. 12

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  13. 13

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  14. 14

    Cassandra에서 버전이 지정된 계층의 효율적인 모델링

  15. 15

    복사 / 붙여 넣기 비활성화

  16. 16

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  17. 17

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  18. 18

    SQL Server-현명한 데이터 문제 받기

  19. 19

    Seaborn에서 축 제목 숨기기

  20. 20

    ArrayBufferLike의 typescript 정의의 깊은 의미

  21. 21

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

뜨겁다태그

보관