从插座读取时出现问题

时间:2015-05-06 22:02:01

标签: c linux sockets io

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

2 个答案:

答案 0 :(得分:2)

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

  *b++ = ...

取消引用和/或递增void - 指针无效C.编译器应该至少警告过你。

使用所有警告重新编译代码(对于gcc,为此传递选项-Wall -Wextra -pedantic)。然后修复代码,直到不再发出警告。

参考您关于如何调用相关函数的编辑:

char *buffer = "";

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

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

问题:

  1. 你无法读入恒定的记忆。
  2. 即使1.不适用,您只能阅读1字节。
  3. 要修改此更改,请按如下方式更改代码:

    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编译