recv()函数标志用于在一个字符串中获取while缓冲区[windows C]

时间:2010-01-20 22:20:15

标签: c windows function flags recv

这段代码完美地发送和恢复了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;
    }

2 个答案:

答案 0 :(得分:2)

好的,您的计划存在多个问题。

  • 您正在传输二进制数据。接收器只会看到一个字节序列。接收器无法知道数据的结束,因为char的所有可能值都是合法数据值。如果您要发送文本数据,可以说0表示数据结束,但现在您不能。因此,您必须决定服务器和客户端之间的“协议” - 最简单的是服务器在前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_buf调用中使用recv()

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

答案 1 :(得分:1)

我认为你把C字符串的空终止和套接字上发送的数据包的末尾混淆了。数据包没有“终止”,它只是一串字节。零是完全合法的,你明确地传递(和接收)长度。您当然不需要使用带外设施来接收多个数据包。你能更具体地谈谈你的要求吗?