图像发送通过socket c++服务器端和c#客户端

本文关键字:服务器端 客户端 c++ socket 图像 | 更新日期: 2023-09-27 17:50:35

我正在使用c#开发一个windows商店应用程序。我想建立TCP连接来接收来自桌面服务器的图像(目前)。

我有一个客户端c++测试的功能,它是完美的工作。现在我想要的是一个类似的客户端,但在c#。我试着转换它,但没有运气,我试图使用相同的逻辑,但我有大量的错误,并删除了一切。

感谢你的帮助。

c++服务器

int size = 8192;     //image size
char* bufferCMP;
bufferCMP = (char*)malloc(sizeof(char)* size);
FILE *p_file;
p_file = fopen("C:''Program Files''img1.png", "rb");
fread(bufferCMP, 1, size, p_file);
fclose(p_file);

int chunkcount = size / DEFAULT_BUFLEN;
int lastchunksize = size - (chunkcount * DEFAULT_BUFLEN);
int fileoffset = 0;
printf("Sending actual Chunk");
while (chunkcount > 0)
{
    iResult = send(ClientSocket, bufferCMP + (fileoffset * DEFAULT_BUFLEN), DEFAULT_BUFLEN, 0);
    fileoffset++;
    chunkcount--;
    if (iResult != DEFAULT_BUFLEN)
    {
        printf("Sending Buffer size <> Default buffer length  ::: %d'n");
    }
    else
    {
        printf("Sending Buffer size = %d 'n", iResult, fileoffset);
    }
}
printf("Sending last Chunk", lastchunksize);
iResult = send(ClientSocket, bufferCMP + (fileoffset * DEFAULT_BUFLEN), lastchunksize, 0);

c++客户端(将转换为c#)

int size = 8192;

int FileCounter = 0;
bool flg = true;
char * fileComplete;
char * filesizeBuffer;
FILE *temp;
int receiveBuffer = 0;
int desiredRecBuffer = size;
//int desiredRecBuffer = DEFAULT_BUFLEN ; 
fileComplete = (char*)malloc(sizeof(char)* size);
while (desiredRecBuffer > 0)
{
    iResult = recv(ConnectSocket, fileComplete + receiveBuffer, desiredRecBuffer, 0);
    //iResult = recv( ClientSocket, fileComplete + receiveBuffer , fileSize , 0 );
    if (iResult < 1)
    {
        printf("Reveive Buffer Error  %d 'n", WSAGetLastError());
    }
    else
    {
        receiveBuffer += iResult;
        desiredRecBuffer = size - receiveBuffer;
        printf("Reveived Data size :  %d 'n", desiredRecBuffer);
    }
}
FILE *File = fopen("C:''Users''amirk_000''Pictures''img1b.png", "wb");
fwrite(fileComplete, 1, size, File);
//flg = true;
free(fileComplete);
fclose(File);

图像发送通过socket c++服务器端和c#客户端

c#客户端套接字的完整示例在MSDN

修改给定的SocketSendReceive方法,将接收到的缓冲区(bytesReceived数组)写入文件流。

应该这样做:

    using (var file = File.OpenWrite("myimage.png"))
    {
        do
        {
            bytes = s.Receive(bytesReceived, bytesReceived.Length, 0);
            file.Write(bytesReceived, 0, bytes);
        }
        while (bytes > 0);
    }