2015-01-20 5 views
0

클라이언트에서 서버로 번호를 보내려고합니다. 내 코드는 다음과 같습니다C - read()를 사용하여 클라이언트에서 서버로 정수 읽기

서버

n= read(client_sockfd, &choice_client, 1); //read client's choice printf("%d\n", choice_client);

클라이언트

my_choice=1; //basically everything exept 0

n = write(sockfd , &my_choice, 1); //send choice to server

Outuput는

0 (항상)

+0

수동으로 소켓 입출력을 버퍼링해야합니다. 따라서 큰 (예 : 16 킬로바이트) 청크에서'read' (또는'recv')와'write' (또는'send')를 호출하고 코드가 청크를 의미있는 메시지로 분리하도록하십시오. 한쪽면에서'send '가 다른면에서 하나의'recv'에 해당한다고 기대하지 마십시오. TCP/IP 소켓은 단지 바이트 스트림 (* 메시지가없는)이다. –

+0

또한, 한번에 * 싱글 바이트를'read' 또는'recv '할 수 없다면 피하라. 매우 비효율적입니다. 내가 말했듯이, 당신은 완충해야합니다. –

+0

어떤 운영 체제에 있습니까? –

답변

1

당신은 주어진 형식에 대한 충분한 메모리를 설정해야합니다.

integer 또는 float 변수 값을 작성하므로 integer 또는 float 크기를 제공해야합니다. 정확한 크기는 다음 기본 값 또는 변수의 초기 값을 출력 할 것이다 지정하지 않으면

n = write(sockfd , &my_choice, sizeof(int)); 

을 쓰는 동안

n=read(client_fds,&choice_client,sizeof(int)); //sizeof(integer or float). 

처럼

은 마찬가지로 당신은 지정해야합니다.

+1

일반적으로'sizeof (int)'는 4이지만,'read'는 단지 2 또는 3 바이트를 줄 수 있음을주의하십시오. 그래서 당신은 언제나 완충해야합니다. –

0

클라이언트와 서버 사이의 프로토콜 (메시지가 전송되는 방식, 메시지가 구분되는 방식)을 적어도 잘 작성한 주석으로 정의해야합니다. textual 메시지 프로토콜을 디버깅하는 것이 일반적으로 더 쉽습니다. 따라서 각각 을 줄 바꿈 문자로 끝내거나 머리글과 본문으로 구성된 더 복잡한 메시지가있는 메시지 본문의 크기를 나타내는 머리글로 보내면됩니다. 영감을 얻으려면 HTTP 또는 SMTP을 참조하십시오.

예를 들어 각 메시지에 JSON 인코딩 된 데이터가 저장되고 줄 바꿈이 종료되도록 결정할 수 있습니다. endianness 문제 (서버와 클라이언트는 종종 서로 다른 컴퓨터 임)에주의하십시오. byteorder(3)을 참조하십시오 (따라서 숫자를 텍스트로 보내는 것이 더 간단합니다).

텍스트 형식의 인코딩에는 전송 시간이 CPU 시간보다 훨씬 깁니다.

내가 주석을 달았으므로 수동으로 소켓 I/O를 버퍼링해야합니다. 그러므로 큰 (예 : 16 킬로바이트) 청크에 read (또는 recv) 및 write (또는 send)을 호출하고 코드가 청크를 의미있는 메시지로 분리하도록하십시오. 한쪽의 send (또는 write)이 다른 쪽의 하나의 recv (또는 read)에 해당한다고 생각하지 마십시오. TCP/IP 소켓은 단지 메시지 스트림 경계가없는 바이트 스트림입니다. read (또는 recv) 또는 write (또는 send)의 결과를 사용하고 이에 따라 버퍼링을 구현해야합니다.

send -ing (또는 write -ing) 짧은 메시지 (예 : 각각 1 바이트 또는 몇 바이트)를 피하십시오. 이것은 일반적으로 매우 비효율적입니다. TCPread(2), recv(2), write(2), send(2), socket(7), ip(7), tcp(7) 등 ... 매뉴얼 페이지

읽기 위키 페이지.

1

실제로 숫자를 보낼 수 있습니다. 왜냐하면 읽기와 쓰기 모두 void *를 인수로 사용하기 때문입니다. 변수의 sizeof를 마지막 인수로 전달하면됩니다.

//Server code 
n= read(client_sockfd, &choice_client, sizeof(choice_client));   
printf("%d\n", choice_client); 

//client code 
my_choice=1;          
n = write(sockfd , &my_choice, sizeof(my_choice)); 
+1

내가 말했듯이, 당신은 단지 2 또는 3 바이트 ('n '이 될 것입니다)를'읽을 수있어서 읽기가 부분적 일 수 있습니다. –