从套接字读取时出现问题
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. 不适用,您也只能读取
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 进行编译
我正在尝试从套接字中读取字符;这是我为此创建的函数,很大程度上受到 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. 不适用,您也只能读取
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 进行编译