2013-04-09 2 views
1

이미지를 base64 인코딩으로 인코딩하고 생성중인 C++ 서버로 보내려고합니다. 나는 그것을하기 위해 PHP를 사용하고있다.socket_write를 사용하여 PHP를 사용하여 큰 패킷 보내기

따라서 PHP 코드는 클라이언트이고 C++ 코드는 수신 서버입니다.

큰 이미지에는 문제가 발생합니다. 예 : 70KB 이미지. 작은 이미지에서 제대로 작동합니다. 5KB 등.

경고 : socket_write() [function.socket-write] : 소켓 [0]에 쓸 수 없습니다 : 데이터 그램 소켓에서 보낸 메시지가 내부 메시지 버퍼 또는 다른 네트워크 제한보다 크거나 데이터 그램을 수신하는 데 사용 된 버퍼보다 ​​큽니다. into는 데이터 그램 자체보다 작습니다.

이미지를 여러 개의 작은 패킷으로 나누지 않고도이 문제를 해결할 수 있습니까?

송신 패킷이 1MB 만 필요합니다. 가능한 많은 문제가 있습니다

$con=file_get_contents("image url"); 
$binary_data=base64_encode($con); 
$host = "192.168.35.54"; 
$port = 1060; 
$message = $binary_data; 
// No Timeout 
set_time_limit(0); 
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or die("Could not create socket\n"); 
socket_connect($socket, $host, $port) or die("Could not connect to server\n"); 
socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n"); 

답변

0

당신은 할 수 :

내가 사용하고있는 코드입니다. TCP를 사용하고 있다고 가정합니다. 또한 socket_write에 대한 한 번의 호출로 전체 이미지를 작성한다고 가정합니다. 내 첫 번째 추측은 문제가 수신 측면 중 하나라는 것입니다. 수신 측에서 소켓을 읽을 때 하나의 읽기에서 전체 데이터 블록을 가져올 수는 없습니다. 일반적으로 TCP 소켓을 읽을 때 예상 한 모든 데이터를 얻을 때까지 루프를 읽고 데이터를 축적합니다. 그렇지 않으면 오류가 발생합니다.

당신은 SO 게시물이 다른 몇 가지 예제 코드를 볼 수 있습니다

Read from socket: Is it guaranteed to at least get x bytes?

편집

이러한 추가 세부 사항을 본 후, 내 첫 번째 제안은 TCP로 전환하는 것입니다. 그런 식으로 단일 전송을 수행 한 다음 위의 예제 코드 에서처럼 수신 측에서 루프를 읽습니다. 그렇지 않으면 패킷을 해체하고 자신의 오류 감지 코드를 작성하여 모든 조각이 도착하는지 확인하고 순서 코드를 순서대로 재구성하여 기본적으로 기능 TCP를 이미 복제 한 것입니다 제공합니다.

+0

데이터를 보내고 받기 위해 UDP를 사용하고 있습니다. 사용중인 PHP 코드는 다음과 같습니다. $ con = file_get_contents ("image url"); $ binary_data = base64_encode ($ con); $ host = "ip"; $ port = 1060; $ message = $ binary_data; // 제한 시간 없음 set_time_limit (0); \t \t \t \t $ 소켓 = socket_create (AF_INET, SOCK_DGRAM, SOL_UDP) 또는 ("소켓 \ n을 만들 수 없습니다") 죽을; socket_connect ($ socket, $ host, $ port) 또는 죽습니다 ("서버에 연결할 수 없습니다 \ n"); socket_write ($ 소켓, $ 메시지, strlen ($ 메시지)) 또는 사망 ("서버로 데이터를 전송할 수 없습니다 \ n"); –

+1

오케이, 방금받은 오류 메시지를 보았습니다. 기본적으로 대답은 '아니오'입니다. 패킷을 분해해야합니다. 하지만 UDP를 사용하는 좋은 이유가 없다면 TCP로 전환 할 것입니다. –

+0

왜이 답변에 투표 한 사람이 있습니까? –

0

소켓 전송 버퍼를 전송할 가장 큰 UDP 데이터 그램 이상으로 설정해야합니다.

PHP로 수행하는 방법을 묻지는 않지만 소켓 API 레벨에서 setsockopt()의 경우 SO_SNDBUF 옵션을 사용하십시오.

관련 문제