【问题标题】:Send a string with white space through socket tcp通过套接字 tcp 发送带有空格的字符串
【发布时间】:2017-12-02 15:20:28
【问题描述】:

我正在尝试从客户端向服务器发送从 bash 读取的整行。

客户:

char buf[200];
int line_len;
getline(&buf, &line_len, stdin);
printf("Sending: %s", buf);
sendl(tcp_sock, buf);

服务器:

char app[200];
recvl(client, app);
printf("\n%s\n", app);

Sendl 和 recvl 是我定义的函数,它们实际上是 send 和 recv,100% 工作

问题出在getline 上,无法正常工作。 当我在输入“你好香蕉”后打印Sending: %s 时,我总是得到像�� 这样的奇怪字符,在这里我什至无法显示..

你能帮帮我吗?

编辑:感谢@dbush,现在可以工作

【问题讨论】:

  • 你怎么知道getline 工作不正常?请使用minimal reproducible example 更新您的问题。
  • getline 返回读取的字符数。你可以查一下号码。返回的字符数并与您要发送到服务器的行长度进行交叉验证。
  • 对不起,我希望现在已经很好了
  • @kiner_shah 我什至可以验证,无论如何读取的字符与我输入的字符完全不同。所以???
  • 这仍然不是minimal reproducible example。请显示所有相关变量的定义,尤其是buf

标签: c sockets getline


【解决方案1】:

getline 函数的第一个参数需要 char **。相反,您传递的是char [200],它会衰减为char *。这些类型是不兼容的,你的编译器应该已经警告你了。

您需要为第一个参数传递指针变量的地址。该指针应初始化为NULLlinelen 应初始化为0。然后getline 将为读取的行分配内存。当你用完这个缓冲区后,你应该free它:

char *buf = NULL;
int line_len = 0;
getline(&buf, &line_len, stdin);
buf[line_len] = '\0';
printf("Sending: %s", buf);
sendl(tcp_sock, buf);
free(buf);

【讨论】:

  • 如果修改成 getline(&buf, &line_len, stdin); 就完美了。非常感谢:)
  • @ducajack 对于“完美”,代码应该检查getline()的返回值。
  • dbush:为什么是buf[line_len] = '\0';?似乎没有必要。
猜你喜欢
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 2019-03-31
相关资源
最近更新 更多