从套接字读取时出现问题

Trouble while reading from socket

我正在尝试从套接字中读取字符;这是我为此创建的函数,很大程度上受到 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++ = ...

取消引用 and/or 递增 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() 函数:如果它被调用但发件人没有发送任何东西,它根本不会 return 只要连接还在。

并且:使 process() 处理传入的值作为 n

尝试将第一行更改为 char *buf = (char *) 缓冲区; 并在

上使用带有 -Werror 的 gcc 进行编译