【问题标题】:Sockets: What is causing read() to return EINVAL?套接字:是什么导致 read() 返回 EINVAL?
【发布时间】:2011-05-16 14:36:41
【问题描述】:

一个socket客户端程序与服务器建立连接, 写入一些字节并使用(阻塞)read() 等待响应。

但这会失败并出现错误EINVAL(“无效参数”)。 先前对create()bind()connect() 套接字的调用已成功。

我的问题

  • 这里有什么问题?

平台是 Linux x64。

【问题讨论】:

  • ...并告诉使用您使用的平台。
  • 确实,您需要发布代码。 EINVAL 通常表示一个粗心的错误(可能像错误的参数一样简单),因此如果不查看代码就无法诊断。

标签: c sockets io blocking nonblocking


【解决方案1】:

fd 附加到一个对象,该对象是 不适合阅读;或文件 使用 O_DIRECT 标志打开,并且 buf 中指定的地址, count 中指定的值,或 当前文件偏移量不合适 对齐。

http://www.kernel.org/doc/man-pages/online/pages/man2/read.2.html

【讨论】:

  • 请避免链接到die.net 手册页。它们非常过时,但由于人们发现它们并将它们链接为问题的答案的反馈效应,它们位于 Google 搜索结果的顶部。最新的权威副本位于kernel.org
【解决方案2】:

问题是我将 1 个字节的大小传递给 read() 函数。 似乎不支持这一点
(为什么?最小尺寸是多少?必须是 2 的倍数/平台的位数?)。

现在我通过了 8 并且它有效。 谢谢大家的cmets。

【讨论】:

  • 没有“平台的比特性”之类的东西。您可能在某个地方有/有一个错误,并且它恰好可以工作。您应该将代码提供给我们。
  • 你不应该接受它作为答案,因为这不是它以前不起作用的原因!
猜你喜欢
  • 2021-06-22
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 2021-07-26
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多