문제

나는 혼란에 대한 소켓 프로그래밍 C.

당신은 소켓을 생성,바인딩하는 인터페이스와 IP 주소에 그것을 얻을 들어 있습니다.나는 몇 가지를 발견했의 웹에 자원,그리고 그것을 이해 괜찮습니다.특히,나는 기사를 발견 네트워크 프로그래밍이 아래에서 유닉스 시스템 하는 것은 매우 유익하다.

어떤 나를 혼동이의 타이밍 데이터에 도착하는 소켓에.

어떻게 당신이 말할 때는 패킷이 도착하고,얼마나 큰 패킷은,당신은 당신이해야 할 모든 무거운 자신?

나의 기본 가정 여기에는 패킷을 수 있는 변수의 길이,그래서 한 번 이진 데이터의 시작 아래로 나타나는 소켓,당신은 어떻게 시작 구성된 패킷에서는?

도움이 되었습니까?

해결책

짧은 대답은 당신이해야 할 모든 무거운 들기 자신입니다.알림을 받을 수 있는 데이터가 읽을 수 있지만,당신은 알 수 없는 방법은 바이트 사용할 수 있습니다.에서 가장 IP 프로토콜을 사용하는 변수 패킷의 길이,있을 것입니다 헤더로 알려진 고정 길이에 추가되는 패킷을 전송합니다.이 헤더를 포함됩 패킷의 길이.당신은 헤더를 읽을 얻을,패킷의 길이를 읽을 다음,이 패킷을 전송합니다.당신은 이것을 반복 패턴(읽기 헤더를 읽을 다음,패킷까지)통신이 완료됩니다.

에서 데이터를 읽을 때 소켓,당신은 요청의 특정 번호를 바이트 단위이다.읽기 호출을 차단할 수 있습까지 요청한 바이트 수를 읽지만,그것은 반환할 수 있는 것보다 적은 바이트는 무엇이었을 요청합니다.이 경우,당신은 단순히 다시 읽을 요청하는 나머지 바이트입니다.

여기에는 전형적인 C 기능을 읽고 설정한 번호의 바이트로에서 소켓:

/* buffer points to memory block that is bigger than the number of bytes to be read */
/* socket is open socket that is connected to a sender */
/* bytesToRead is the number of bytes expected from the sender */
/* bytesRead is a pointer to a integer variable that will hold the number of bytes */
/*           actually received from the sender. */
/* The function returns either the number of bytes read, */
/*                             0 if the socket was closed by the sender, and */
/*                            -1 if an error occurred while reading from the socket */
int readBytes(int socket, char *buffer, int bytesToRead, int *bytesRead)
{
    *bytesRead = 0;
    while(*bytesRead < bytesToRead)
    {
        int ret = read(socket, buffer + *bytesRead, bytesToRead - *bytesRead);
        if(ret <= 0)
        {
           /* either connection was closed or an error occurred */
           return ret;
        }
        else
        {
           *bytesRead += ret;
        }
    }
    return *bytesRead;
}

다른 팁

그래서,당신의 질문에 답을 따라 공정한 비트 사용 여부에 UDP,TCP 으로 전송 합니다.

UDP,생명을 얻는 훨씬 더 간단에서 호출할 수 있는 recv/recvfrom/소 켓 에으로 패킷이 필요한 크기(할 가능성이 보내 고정 길이 패킷 소스에서 어쨌든)만들고,가정 하는 경우 사용할 수 있는 데이터,그것은 거기에서 배수 패킷의 길이의 크기입니다.(I.E.당신이 전화 recv*크기를 보내면 패킷을 설정할 수 있습니다.)

에 대한 TCP,생명을 얻는 조금 더 재미있-의 목적을 위해 이 설명,내가를 이미 사용하는 방법을 알고 socket(),bind(),listen()및 동의()-후자는 어떻게 당신은 파일 기술자(FD)의 새로 만든 연결합니다.

의 두 가지 방법이 있을하고 I/O 소켓을 차단하는 당신이 전화를 읽(fd,buf,N)고 읽기 앉아 있을 때까지 기다립을 읽을 N 바이트로 buf 또는 무단,당신은 확인(선택을 사용하여()또는 폴())지 FD 읽을 수 있고 다음 작업을 수행하 read().

을 처리할 때는 TCP 기반 연결 OS 에서 주의하지 않는 패킷 크기 때문에,그것의 지속적인 데이터 스트림,지 않는 별도의 패킷 크기의 덩어리.

응용 프로그램에서 사용하는 경우""패킷(포장 또는 압축을 푼 데이터 구조는 당신이 주위에 전달),당신은 당신을 부를 수 있을 읽()적당한 크기에 인수,읽고 전체 데이터 구조 소켓니다.주의해야 할 점이 있을 다루고,기억을 제대로바이트-기 위해 모든 데이터는 당신이 보내는 경우에는 소스 및 대상 시스템의 다른 바이트 endian-ness.이 모두 적용됩니다 UDP,TCP.

로*유닉스 소켓 프로그래밍에 관한 한,나는 추천 W.리차드 스티븐스"Unix 네트워크 프로그래밍,Vol.1"(UNPv1)와"프로그래밍 언어에는 유닉스의 환경은"(APUE).첫 번째는 tome 에 관한 네트워크-기반 프로그래밍에 관계없이,전송,그리고 후자는 좋은 프로그래밍 예약에 적용되*유닉스 기반 프로그래밍입니다.또한,look for"TCP/IP 를 그림",볼륨 1 및 2.

을 할 때에는 읽기 소켓에서,당신이 말한 그것은 얼마나 많은 최대 바이트를 읽지 않는 경우가 많은 것,그것은 당신을 제공합니다 그러나 많은 것을 얻었.그것은 당신을 디자인하는 프로토콜 그래서 당신은 여부를 알 수 있는 부분 또는 패킷하지 않습니다.예를 들면,과거에는 전송할 때 가변 길이는 데이터는 바이너리,나 int 처음에는 얼마나 많은 바이트를 기대합니다.을 읽을 요청하는 바이트 수를 더보다 가장 큰 가능한 패킷에서 내 프로토콜,그리고 나면 비교 첫 번째 int 에 대하여 그러나 많은 바이트 내가 받은 것은,그리고 프로세스 중 하나 또는 그것도 더 읽어지고 전체 패킷을 따라.

소켓에서 작동하보다 더 높은 수준 raw 패킷이다-그것은 다음과 같이 파일을 읽기/쓰기 할 수 있습니다.또한,하려고 하면서 읽은 소켓을 운영 체제 블록을(상태)의까지 프로세스는 데이터를 성취하는 요청을 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top