【发布时间】:2015-07-17 06:41:29
【问题描述】:
我正在尝试从套接字读取字符;这是我为此创建的函数,很大程度上受Here 启发,我在这里删除了一些不相关的部分(此示例正在正确编译)。
int process(int socketfd, void *buffer, int n)
{
int totread = 0;
char ch;
int numread;
for(;;)
{
numread = read(socketfd, &ch, 1);
if(numread == 0) {
if (totread == 0) {
return 0;
} else {
break;
}
} else {
if(totread < n-1) {
totread++;
printf("totread: %d\n", totread);
printf("Here is OK, ch value gets printed %c\n", ch);
*buffer++ = ch;
printf("With help provided, this line gets printed\n");
printf("But the value <%s> of buffer, is blank (<> output)\n, buffer);
}
if (ch == '\n') {
printf("%c\n", ch);
printf("%s\n", buffer);
break;
}
}
}
return totread;
}
我不明白为什么第二行没有打印出来。
很明显,*buf++ = ch 指令有问题;但它看起来是正确的。它只是将字符读取到字符数组 buf 的下一个值。我在编译时看不到错误或警告,客户端在第一行打印后断开连接,第二行未到达。
编辑
这是我初始化缓冲区的方法:
char *buffer = "";
int l = process(newsockfd, buffer, 100);
printf("Number read (function network) %d\n", l);
这可能不是合适的方法;我还尝试指定一个固定长度,例如char buffer = [255]; 该函数不会退出,但没有打印任何内容。我是C编程的新手,非常感谢您的帮助!
【问题讨论】:
-
当你说第二行没有被打印出来时,我想你的意思是因为程序崩溃了。这很可能是在
buf是NULL或无效内存时写入buf引起的segv。当您在gdb下运行它并使用-g编译以包含调试符号时会发生什么? -
缓冲区够大吗?另外,我相信 buf[0] 永远不会被写入,这似乎是一个等待发生的潜在问题。
-
请告诉我们如何调用这个函数,特别是传入的缓冲区是如何定义和初始化的。
-
另外:您是否有意遗漏了用于错误检查的代码以使该示例更好地可读?
-
n(传入的)是干什么用的?