gpt4 book ai didi

c - 从套接字读取时出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 08:26:55 25 4
gpt4 key购买 nike

我正在尝试从套接字中读取字符;这是我为此创建的功能,主要灵感来自 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 编程的新手,非常感谢您的帮助!

最佳答案

int process(..., void * b, ...
{
...

*b++ = ...

取消引用和/或递增 void 指针在 C 中是无效的。编译器至少应该警告过您这一点。

在打开所有警告的情况下重新编译您的代码(对于 gcc,为此传递选项 -Wall -Wextra -pedantic)。然后修复代码,直到不再发出警告。


引用您对相关函数调用方式的编辑:

这个

char *buffer = "";

不声明缓冲区,而只是一个指针。此指针指向大小为 1 的字符串文字。根据定义,字符串文字是常量。

总结一下:您向您的 process() 函数提供了一个指向大小为 1 的常量内存的指针。

问题:

  1. 你不能读入常量内存。
  2. 即使 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 传入的值。

关于c - 从套接字读取时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30088408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com