0

此代码完美地发送和接收 txt 文件,但无法将其发送到 .exe 或 .img 等其他格式。请帮我解决这些问题,因为我需要使用 htonl 或 htons?看一看!!

这是服务器端recv函数::

 if (socket_type != SOCK_DGRAM)
        {

                fi = fopen (final,"wb");
                retval = recv(msgsock, recv_buf, strlen(recv_buf), 0);
                /*recv_buf[retval] = '\0';
                fprintf (fi,"%s",recv_buf);*/

                int i;
                i=atoi(recv_buf);
                char *q;
                q=(char *)malloc(i*sizeof(char));
                retval = recv(msgsock, q, strlen(q), 0);
                //printf ("%s",q);
                fwrite(q,i,1,fi);
                fclose(fi);

        }
        else
        {
            retval = recvfrom(msgsock,recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&from, &fromlen);
            printf("Server: Received datagram from %s\n", inet_ntoa(from.sin_addr));
            printf ("SOCK_DGRAM");
        }

        if (retval == SOCKET_ERROR)
        {
            fprintf(stderr,"Server: recv() failed: error %d\n", WSAGetLastError());
            closesocket(msgsock);
            //continue;
        }
        else
            printf("Server: recv() is OK.\n");

        if (retval == 0)
        {
            printf("Server: Client closed connection.\n");
            closesocket(msgsock);
                //continue;
        }
        printf("Server: Received %d bytes, data from client\n", retval);

The client side sending function :::

void send_command()
{
    int bytesent;
    FILE *file_out;
    //file_out = fopen(file_path,"rb");
    char str_all[100000];//flag [30]="end";

    ///////////////////////getsize//////////////
    char fsize[5];
    int filesize;
    file_out = fopen(file_path, "rb");
    fseek(file_out, 0, SEEK_END);
    filesize = ftell(file_out);
    rewind (file_out);
    itoa (filesize,fsize,10);
    /////////////////////////////////////////////
    send (ConnectSocket, fsize, strlen (fsize), 0);

    char *r = (char *)malloc (filesize * sizeof(char));

    fread(r,filesize,1,file_out);
    bytesent = send( ConnectSocket, r, strlen(r), 0 );
    printf("\nClient: Bytes sent: %ld\n", bytesent);
    fclose (file_out);

    /*while (fscanf(file_out,"%s",&str_all) != EOF)
    {
        bytesent = send( ConnectSocket, str_all, strlen(str_all), 0 );
        printf("\nClient: Bytes sent: %ld\n", bytesent);
        //Sleep(500);
    }*/

    /*printf("%s",flag);
    send( ConnectSocket, flag, strlen(flag), 0 );*/
    WSACleanup();
    //return 0;
    }
4

2 回答 2

2

好的,您的程序存在多个问题。

  • 您正在传输二进制数据。接收者只会看到一个字节序列。接收者无法知道数据的结尾,因为所有可能的值char都是合法的数据值。如果您正在发送文本数据,您可以说 a0表示数据的结束,但现在您不能。因此,您必须决定服务器和客户端之间的“协议”——最简单的是服务器在前 4 个字节中发送数据的长度(阅读ntonl()ntohl()了解如何可移植地执行此操作)。然后,接收器将确切地知道要读取多少字节。
  • 您将接收缓冲区声明为char *recv_buf,并且类似地声明为recv_buf1。您没有为这两个指针中的任何一个分配任何存储空间,因此它们没有指向任何有用的地方。然后,您的recv电话是:recv(msgsock, recv_buf, sizeof(recv_buf), 0); 这也有问题。第一个是上面提到的:你没有recv_buf. 第二个是在为 分配存储空间后,recv_buf将获取 char 指针的大小,而不是缓冲区recv指向的长度。解决这两个问题的一种简单方法是声明recv_buf为:char recv_buf[SIZE];然后sizeof recv_bufrecv()调用中使用。

我还没有查看您的其余代码。您可能需要一个好的 C 和网络编程介绍。

于 2010-01-21T07:15:37.933 回答
1

我认为您将 C 字符串的空终止与在套接字上发送的数据包的结尾混淆了。没有数据包的“终止”,它只是一串字节。零是完全合法的,您可以明确传递(并接收)长度。您当然不需要使用带外功能来接收多个数据包。你能更具体地说明你在问什么吗?

于 2010-01-20T22:22:50.577 回答