gpt4 book ai didi

php - 翻译代码 : C Socket to PHP Socket

转载 作者:太空宇宙 更新时间:2023-11-04 05:00:28 26 4
gpt4 key购买 nike

我在这里浏览了过去的线程,以找到有关将 C 套接字转换为 PHP 套接字的任何相关主题,并且我已经在 php.net 和 C 教程上进行了大量准备,以弄清楚如何将我拥有的一些 C 源代码转换成涉及远程套接字连接的 PHP 源代码。

我要发布的源代码是用 C 语言编写的。此代码已经在我的一位程序员编写的已编译 .exe 中运行并确认可以运行。他不懂 PHP,而我在其中创建的这个新程序需要此代码段。

程序这样做:它创建到远程服务器/端口的套接字连接,将需要发送的图像的文件大小发送到服务器,然后我猜测当服务器知道文件大小时,程序发送二进制图像数据和图像的文件大小(就像通过套接字上传到服务器的功能)。然后它使用 recv(); C 中的函数接收特定长度的字节返回。

基本上它发送的是一张图片,里面有一些加密的东西。服务器上已经有一个程序在解密图像的指定端口上运行。然后套接字发回解密后的文本。我无权访问解密算法,否则我显然不会使用套接字。

这是我收到的 C 源代码,以及我随后在 PHP 中正确翻译它的​​尝试。

//在这个C代码中,有long size;在底部使用但从未初始化的变量。我不知道该怎么办。其他一些变量也从未使用过。

function picBin()assume curlBinaryData variable pic is filled with binary data from picture download.pic->currentSize is set to the size of the image

it will return 0 if successful. also char *word in the function's params will be set to the pic's decryption

//bin data structure i use for a quick ghetto download function, just so you know how it looks

struct curlBinaryData{
char *data;
int currentSize;
int maxSize;
};

int picBin(curlBinaryData *pic, char *word, int threadNum,
char *host, unsigned short port)
{
char data1[1000], data2[1000],
temp[1000], printBuf[1000], buffer[1000], *p, *p2;
int num, a, totalBytes;
long size;
char *pSize;
SOCKET sock;

while ((sock = connectSocket(host, port)) == INVALID_SOCKET)
{
sprintf(printBuf, "Could not connect(picBin) %s:%d\n", host, port);
print_ts(printBuf, "red");
//Sleep(15000);
}

buffer[0]='\0';
send(sock, buffer, 1, 0);

pSize=(char *)&(pic->currentSize);
send(sock, pSize, 4, 0);

send(sock, pic->data, pic->currentSize, 0);

totalBytes=0;
do{
if ( (num=recv(sock, data1+totalBytes, 1, 0)) > 0)
totalBytes+=num;
} while( (totalBytes<4) && (num>0) );

pSize=(char *)&size;
if (totalBytes==4){ //got 4 bytes for dword
memcpy(pSize, data1, 4);
if (size==1)
{
totalBytes=0;
do
{
if ( (num=recv(sock, data1+totalBytes, 1, 0)) > 0)
totalBytes+=num;
} while( (totalBytes<4) && (num>0) );
memcpy(pSize, data1, 4);
if (totalBytes==4)
{ //got 4 bytes for dword
totalBytes=0;
for (a=0; ( (a<size) && (num>0) ); a++)
{
if ( (num=recv(sock, data1+totalBytes, 1, 0)) > 0)
totalBytes+=num;
}
if (totalBytes==size)
{
closesocket(sock);
data1[totalBytes]='\0';
strcpy(word, data1);

return 0; //0 on success
}
}
}
}
closesocket(sock);
return -1; //something errord
}

现在这是我尝试的 PHP 代码:

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false)
{
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
}

if (socket_connect($sock, $host, $port) === false)
{
echo "socket_connect() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}

socket_send($sock, '\0', 1, MSG_EOF);

$ci = file_get_contents($picURL);
$ciwrite = fopen('pic.jpg', 'w+');
fwrite($ciwrite, $ci);
fclose($ciwrite);

$picFileSize = filesize('pic.jpg');

socket_send($sock, $picFileSize, 4, MSG_EOF);

socket_send($sock, $ci, $picFileSize, MSG_EOF);

$num = socket_recv($sock, $totalBytes, 1, MSG_DONTWAIT);

print $num; // this doesn't even Print anything to my console when I execute it via CLI

/*do{
if (($num = socket_recv($sock, $totalBytes, 1)) > 0)
{
$totalBytes += $num;
}
} while(($totalBytes &lt; 4) && ($num > 0));*/

最佳答案

    buffer[0]='\0';
send(sock, buffer, 1, 0);

socket_send($sock, '\0', 1, MSG_EOF);

\'\\ 以外的反斜杠转义序列不会在单引号字符串中展开;因此,'\0'\0这两个字符组成的字符串,而上面的socket_send() 发送字符 \
MSG_EOF 充其量是无效的,最坏的情况是有害的;最好不要使用它。
正确的翻译是:

  socket_send($sock, "\0", 1, 0);
    pSize=(char *)&(pic->currentSize);
send(sock, pSize, 4, 0);

socket_send($sock, $picFileSize, 4, MSG_EOF);

上面的 socket_send() 发送了 $picFileSize 的 ASCII 字符串表示的前 4 个字符,因为 socket_send() 期望一个 < em>string 作为它的第二个参数,因此给定的 integer 被强制转换为 string。发送一个 4 字节的二进制整数:

  socket_send($sock, pack("L", $picFileSize), 4, 0);
$num = socket_recv($sock, $totalBytes, 1, MSG_DONTWAIT);

print $num; // this doesn't even Print anything to my console when I execute it via CLI

如果您DONTWAIT 获取不到数据也就不足为奇了。
C 程序接收部分的工作翻译是:

$totalBytes = socket_recv($sock, $data1, 4, MSG_WAITALL);
if ($totalBytes==4)
{ //got 4 bytes for dword
$size = unpack("L", $data1);
if ($size[1]==1)
{
$totalBytes = socket_recv($sock, $data1, 4, MSG_WAITALL);
if ($totalBytes==4)
{ //got 4 bytes for dword
$size = unpack("L", $data1);
$totalBytes = socket_recv($sock, $data1, $size[1], MSG_WAITALL);
if ($totalBytes==$size[1])
{
echo $data1, "\n";
}
}
}
}

关于php - 翻译代码 : C Socket to PHP Socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6248043/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com