Pergunta

Portanto, esta é realmente uma questão de duas partes, com a primeira levando à segunda.

Estou trabalhando em um projeto de servidor PHP e estou um pouco confuso com todas as diferentes maneiras de criar um soquete.Consegui criar três soquetes, cada um usando um novo método.Alguém sabe a diferença fundamental entre esses três métodos, se houver?

Método 1 usando 'socket_create'

$Socket1 = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
socket_bind($Socket1, $LocalIP, $LocalPort)
socket_connect($Socket1, $DestIP, $DestPort)
//Method 1 Read
socket_read($Socket1)
//Method 1 Write
socket_write($Socket1, $WriteMsg, strlen($WriteMsg))

Método 2 usando 'fsockopen'

$Socket2 = fsockopen($Server, $Port)
//Method 2 Read
fgets($Socket2)
//Method 2 Write
fputs($Socket2, $PutMsg, strlen($PutMsg))

Método 3 usando 'stream_socket_client'

$Socket3 = stream_socket_client('tcp://'.$DestIP.':'.$DestPort)
//Method 3 Read
stream_socket_recvfrom($Socket3, $RecSize)
//Method 3 Write
stream_socket_sendto($Socket3, $SendMsg)

Embora eu não entenda a diferença, estava explorando todas as três opções procurando uma maneira de controlar o tamanho da janela TCP.Estou tentando enviar um pacote para um cliente pela minha LAN que tem uma carga útil de dados de 1460 bytes e, depois de revisar uma captura de pacote, a parte de dados TCP do meu pacote é sempre interrompida em 1448 bytes.Alguma ideia?

Desde já, obrigado!

Foi útil?

Solução

Você não pode controlar a quantidade real de dados recebidos de cada vez.TCP é um protocolo de streaming.Ele apresenta uma API de fluxo de bytes para o aplicativo.Você apenas precisa estar preparado para ler e reler até conseguir o que deseja.

Outras dicas

Você deve ser capaz de fazer isso com o socket_set_option comando (onde as opções estão documentadas no socket_get_option comando):

$Socket1 = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
// send window
socket_set_option($Socket1, SOL_SOCKET, SO_SNDBUF, 1460);

Apenas certifique-se de ligar logo depois socket_create.Se você precisar que a janela de recebimento seja modificada:

socket_set_option($Socket1, SOL_SOCKET, SO_RCVBUF, 1460);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top