我正在尝试从套接字中读取字符;这是我为此创建的函数,主要来自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编程的新手,非常感谢你的帮助!
答案 0 :(得分:2)
int process(..., void * b, ...
{
...
*b++ = ...
取消引用和/或递增void
- 指针无效C.编译器应该至少警告过你。
使用所有警告重新编译代码(对于gcc,为此传递选项-Wall -Wextra -pedantic
)。然后修复代码,直到不再发出警告。
参考您关于如何调用相关函数的编辑:
此
char *buffer = "";
不会声明缓冲区,而只是指针。此指针指向大小为1
的字符串文字。根据定义,字符串文字是一个常量。
总结:您向process()
- 函数提供指向大小为1
的常量内存的指针。
问题:
1
字节。要修改此更改,请按如下方式更改代码:
char buffer[100] = ""; /* Define a buffer of 100 characters size and
initialise it to all `0`s. */
int l = process(newsockfd, buffer, 100);
根据process()
阻止,您需要查看read()
函数:如果它被调用但发件人没有发送任何内容,只要连接仍在运行,它就不会返回。
然后:让process()
处理以n
传入的值。
答案 1 :(得分:0)
尝试将第一行更改为 char * buf =(char *)buffer; 并使用带有-Werror的gcc编译