C 将文件内容发送到服务器:套接字

C 将文件内容发送到服务器:套接字,c,sockets,C,Sockets,我的代码逐行读取文件并将其发送到服务器 client.c int main(int argc, char *argv[]) { int sockfd, portno, n; struct sockaddr_in serv_addr; struct hostent *server; FILE* pFile; char* line = NULL; //char buffer[256]; char* buffer; int len;

我的代码逐行读取文件并将其发送到服务器

client.c

int main(int argc, char *argv[])
{
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;
    FILE* pFile;
    char* line = NULL;
    //char buffer[256];
    char* buffer;
    int len;



    if (argc < 3) {
       fprintf(stderr,"usage %s hostname port\n", argv[0]);
       exit(0);
    }



   pFile = fopen ("myfile.txt","r");
   if (pFile==NULL)
   {
        printf("Error reading temp file\n");
        exit (1);
       }

    portno = atoi(argv[2]);
    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    if (sockfd < 0) 
        error("ERROR opening socket");
    server = gethostbyname(argv[1]);
    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;

    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);

    serv_addr.sin_port = htons(portno);
    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
    error("ERROR connecting");


//loop  
     while (!feof(pFile)) {
    //printf("Please enter the message: ");
    line = readLine(pFile, line);
    len=strlen(line);
    buffer= (char*) malloc((len+1)*sizeof(char));
    bzero(buffer,len);
    memcpy(buffer,line,len+1);
   // fgets(buffer,len,pFile);
    printf("%s\n", buffer);
    n = write(sockfd,buffer,strlen(buffer)+1);
    if (n < 0) 
        error("ERROR writing to socket");
    free(buffer);    
    free(line); 
    }   



    buffer= (char*) malloc(2048*sizeof(char));   
    bzero(buffer,2048);
    n = read(sockfd,buffer,2048);

    if (n < 0) 
         error("ERROR reading from socket");
    printf("%s\n",buffer);

    free(buffer);
    fclose (pFile);
    close(sockfd);
    return 0;
}
要读取的文件内容为:

I am line number One,am I?
Here comes line number Two.
Will you welcome, Line number Three? And I am your Friend.
I am here, It is me - Line number Four.
Hello All, I am line number Five, am I? Yes I am.
It is over, because I am line number six.

看起来问题在于您没有检查and函数的结果,而and函数在部分成功状态下可能会失败,这表明它们已成功传输的字节数。通常,您需要将这些函数包装在一个循环中,该循环将重复执行,直到整个缓冲区被读取/写入为止。

问题似乎在于您没有检查和函数的结果,这可能会在部分成功状态下失败,指示它们已成功传输的字节数。通常,您需要将这些函数包装在一个循环中,该循环将重复执行,直到整个缓冲区都已读/写。

问题在于客户端有多个
,而服务器端只有一个
。怎么做

对于每一行,客户端都将
写入
,即多个
写入
(您在循环中使用
写入
),但在服务器中,您有一个
读取
,即单个
读取
(没有循环,因此它将只读取第一行)

对于第一行,您正在服务器端阅读。但对于第二行,客户机正在写入,但您的服务器没有read语句(第一行
read
已经执行)。因此,您不会收到完整的信息

一个简单的解决方案是一次写入整个文件内容,而不是逐行读取

也可以尝试下面的更改-

n = write(newsockfd,"Server received the message",50); // Increase the size

问题是客户端有多个
写入
,而服务器端只有一个
读取
。怎么做

对于每一行,客户端都将
写入
,即多个
写入
(您在循环中使用
写入
),但在服务器中,您有一个
读取
,即单个
读取
(没有循环,因此它将只读取第一行)

对于第一行,您正在服务器端阅读。但对于第二行,客户机正在写入,但您的服务器没有read语句(第一行
read
已经执行)。因此,您不会收到完整的信息

一个简单的解决方案是一次写入整个文件内容,而不是逐行读取

也可以尝试下面的更改-

n = write(newsockfd,"Server received the message",50); // Increase the size

对于这样的场景,通常需要实现一种通信协议


最重要的是,服务器需要知道需要读取多少字节才能接收整个内容。因此,通常情况下,将消息大小作为消息的第一部分(标头)进行传输。然后服务器知道在此之后要接收多少字节来消耗实际的有效负载数据。

对于这样的场景,您通常需要实现一种通信协议


最重要的是,服务器需要知道需要读取多少字节才能接收整个内容。因此,通常情况下,将消息大小作为消息的第一部分(标头)进行传输。然后,服务器知道在此之后要接收多少字节来消耗实际的有效负载数据。

除了无法正确解释系统调用返回的原因外,如其他海报所述,还有:

bzero(buffer,2048);
n=read(newsockfd,buffer,2048)
..
printf("%s\n",buffer);

如果read()返回2048个字节,printf将在缓冲区结束后尝试查找不存在的null时返回。分配/清除2049或读取2047,即使这样,也只能用于传输纯ASCII文本文件(即没有嵌入空值的文件)。

如其他海报所述,除了无法正确说明系统调用返回的原因外,还有:

bzero(buffer,2048);
n=read(newsockfd,buffer,2048)
..
printf("%s\n",buffer);

如果read()返回2048个字节,printf将在缓冲区结束后尝试查找不存在的null时返回。分配/清除2049或读取2047,即使这样,也只能用于传输纯ASCII文本文件(即没有嵌入空值的文件)。

从标题上可以预见到这一点-我也直接进行了发送/接收调用。从标题上可以预见到这一点-我也直接进行了发送/接收调用。