2014-09-11 35 views
0

我想从标准输入读取,直到到达文件末尾,然后将其写入套接字。从标准读入并写入套接字

当我这样做时,我不想读取所有的数据,然后读取后写入套接字。

它应该是:读取一个字节的数据,将其写入套接字,读取另一个字节,将其写入套接字等,直到达到文件结尾。

这是我到目前为止有:

char *buffer[65535]; 

while (read(0, buffer, 65535) > 0) { 
    write(sock, buffer, 65535); 
} 

袜子是套接字文件描述符。我刚刚使用了65535,因为我读过的地方是它可以读取的最大值()。

这是怎么回事?

+3

你的'buffer'是一个'char' *指针*而不是'char'的数组吗?也就是说,假设你已经阅读过你的''read''和'write'的库文档,你是否尝试过*运行它? – WhozCraig 2014-09-11 01:44:15

+0

固定和雅我试过 – umdcoder 2014-09-11 21:43:28

回答

3

这是怎么回事?

答案:有点小车。

仅仅因为你要求64KiB的数据并不意味着你会得到64KiB的数据。你需要记录你接收的数据量,并且只写你读的数据。因此,(注意类型为buffer通过WhozCraig在他comment提到的变化):

char buffer[65536]; 
int nbytes; 
while ((nbytes = read(0, buffer, sizeof(buffer))) > 0) 
{ 
    if (write(sock, buffer, nbytes) != nbytes) 
    { 
     …process short write… 
    } 
} 

有几种方法来处理短写。一种是捕获实际写入的字节数,并保持循环,直到所有读取的数据都被写入。下面的循环将取代所有的if (write(…)…)代码。

警告:未经测试的代码!

int nleft = nbytes; 
    int nwritten; 
    char *start = buffer; 
    while (nleft > 0 && (nwritten = write(sock, start, nleft)) > 0) 
    { 
     nleft -= nwritten; 
     start += nwritten; 
    } 
    if (nwritten < 0) 
     …process error… 

或者你可以简单地报告错误,并放弃写作过程中,这是更简单,但不是弹性的。