如何将任意大的文件读入C中的TCP套接字?

如何将任意大的文件读入C中的TCP套接字?,c,sockets,tcp,client-server,C,Sockets,Tcp,Client Server,我正在学习socket编程,我正在尝试编写一个echo客户端,它从stdin读取数据,写入socket,然后将服务器响应从socket读取到stdout。问题是我不知道stdin会持续多长时间,或者服务器的响应会持续多长时间。我尝试使用的代码如下(不包括创建套接字和连接到服务器): length=BUF\u大小; 而(length==BUF_SIZE){//length将等于BUF_SIZE,如果BUF已满,则当length

我正在学习socket编程,我正在尝试编写一个echo客户端,它从stdin读取数据,写入socket,然后将服务器响应从socket读取到stdout。问题是我不知道stdin会持续多长时间,或者服务器的响应会持续多长时间。我尝试使用的代码如下(不包括创建套接字和连接到服务器):

length=BUF\u大小;
而(length==BUF_SIZE){//length将等于BUF_SIZE,如果BUF已满,则当length
BUF_大小定义为100。当我运行我的程序时,程序通常会连接到服务器并发送正确的消息,但它写入标准输出的不是什么,就是胡言乱语


我做错了什么?

您的while循环只会在第一次执行。read()。假设您从套接字读取10个字节,然后将100个字节写入stdout,最后90个字节将是垃圾

沿着这些路线的一些东西会让你更接近你想要的东西

while (1)
{
    if ((length = read(STDIN_FILENO, buf, BUF_SIZE)) < 0)
    {
        fprintf(stderr, "Error in reading from STDIN");
        return 4;
    }

    if ((write(sock, buf, length)) < 0)
    {
        fprintf(stderr, "Error writing to socket");
        return 5;
    }

    if ((length = read(sock, buf, BUF_SIZE)) < 0)
    {
        fprintf(stderr, "Error reading from socket");
        return 7;
    }

    if ((write(STDOUT_FILENO, buf, length)) < 0)
    {
        fprintf(stderr, "Error writing to STDOUT");
        return 8;
    }
}
while(1)
{
如果((长度=读取(标准文件号、基本单位、基本单位大小))<0)
{
fprintf(标准偏差,“从标准数据中读取错误”);
返回4;
}
if((写入(sock,buf,length))<0)
{
fprintf(stderr,“写入套接字时出错”);
返回5;
}
如果((长度=读取(sock、buf、buf_大小))<0)
{
fprintf(stderr,“从套接字读取错误”);
返回7;
}
如果((写入(标准输出文件号,buf,长度))<0)
{
fprintf(stderr,“写入标准输出时出错”);
返回8;
}
}

您的while循环只会在第一次执行时起作用。read()。假设您从套接字读取10个字节,然后将100个字节写入stdout,最后90个字节将是垃圾

沿着这些路线的一些东西会让你更接近你想要的东西

while (1)
{
    if ((length = read(STDIN_FILENO, buf, BUF_SIZE)) < 0)
    {
        fprintf(stderr, "Error in reading from STDIN");
        return 4;
    }

    if ((write(sock, buf, length)) < 0)
    {
        fprintf(stderr, "Error writing to socket");
        return 5;
    }

    if ((length = read(sock, buf, BUF_SIZE)) < 0)
    {
        fprintf(stderr, "Error reading from socket");
        return 7;
    }

    if ((write(STDOUT_FILENO, buf, length)) < 0)
    {
        fprintf(stderr, "Error writing to STDOUT");
        return 8;
    }
}
while(1)
{
如果((长度=读取(标准文件号、基本单位、基本单位大小))<0)
{
fprintf(标准偏差,“从标准数据中读取错误”);
返回4;
}
if((写入(sock,buf,length))<0)
{
fprintf(stderr,“写入套接字时出错”);
返回5;
}
如果((长度=读取(sock、buf、buf_大小))<0)
{
fprintf(stderr,“从套接字读取错误”);
返回7;
}
如果((写入(标准输出文件号,buf,长度))<0)
{
fprintf(stderr,“写入标准输出时出错”);
返回8;
}
}

更不用说检查不应该是从套接字读取多少数据,而是在远程端关闭套接字后,套接字返回-1的读取;stdin也是一样。如果套接字中有超过100个字节,它会通过前100个字节,然后再通过下100个字节,然后再通过下100个字节,直到达到EOF,还是我错了?是的,但这不是你的问题。正好相反。无法保证在执行读取操作时,100个字节将通过网络传输并被TCP缓冲。如果数量较少,您将只获得缓冲区中的内容,并返回长度。它可能是100,也可能是4。基于这个假设,大多数代码在一些方面都是错误的。您只需读取/写入给定的内容或具有已知的协议(例如,一个长度字节表示消息中有多少字节,或一个消息分隔符,如换行符)并将您的读/写操作放入一个循环中,直到它传输了整个消息。我是否可以测量套接字中消息的大小,以便动态分配足够大的缓冲区来存储它?更不用说检查不应该是从套接字读取多少数据,但是在套接字上,远程端关闭它后,在读取时返回-1;stdin也是一样。如果套接字中有超过100个字节,它会通过前100个字节,然后再通过下100个字节,然后再通过下100个字节,直到达到EOF,还是我错了?是的,但这不是你的问题。正好相反。无法保证在执行读取操作时,100个字节将通过网络传输并被TCP缓冲。如果数量较少,您将只获得缓冲区中的内容,并返回长度。可能是100,也可能是4。m中的大多数代码都是错误的