首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCP sendto (C++)在Linux上失败,而不是OSX。Errno: EINVAL 22无效参数

TCP sendto (C++)在Linux上失败,而不是OSX。Errno: EINVAL 22无效参数
EN

Stack Overflow用户
提问于 2015-03-06 22:11:27
回答 2查看 621关注 0票数 0

在我的应用程序的客户端,下面的代码在OSX上运行良好。但是,在Linux (Ubuntu 12或Raspbian)上编译/运行时,sendto()总是使用EINVAL/22/无效参数失败。如何在Linux上运行?

代码语言:javascript
复制
std::vector<uint8_t> rawVect;
// rawVect.push_back()...a bunch of bytes

const uint8_t* sendBytes = &rawVect[0]; // or rawVect.data();  
size_t sendSize = rawVect.size();

if(sendSize > 0){

    long numBytes = sendto(control_fd, sendBytes, sendSize, 0, res->ai_addr, _res->ai_addrlen);
}

我怀疑Linux上的C++ 11库和std::C++向量。我的makefile看起来和这个很像。

代码语言:javascript
复制
mac:  
g++ -std=c++0x myprogram.cpp 
# (w/ llvm libc++)

ubuntu:  
clang++-3.5 -g -std=c++11 -stdlib=libc++ myprogram.cpp  
# couldn't use g++ 4.8 or prior because it didn't support std::vector::insert as I was using it elsewhere. 4.9 not avail for Ubuntu 12.  

pi:  
g++-4.9 -std=c++0x myprogram.cpp  
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-06 23:03:16

sendto说,如果“dest_len参数不是地址家族的有效长度”,则可能会返回EINVAL,尽管对于连接模式套接字来说,地址参数被忽略了。考虑到您在标题中提到了TCP,我假设control_fd是一个连接模式套接字。试着简单地使用send(control_fd, sendBytes, sendSize, 0),甚至write(control_fd, sendBytes, SendSize)

票数 1
EN

Stack Overflow用户

发布于 2015-03-06 22:24:30

没有足够的时间继续下去。添加print语句以显示传递给sendto的所有参数的值。然后在转换回sockaddr_in后打印出res->ai_addr的相关成员。

一个假设。ai_addrlen的值应该完全等于假定为ipv4的sizeof(struct sockaddr_in)。如果套接字是sizeof(sockaddr_in6),则为ipv6。如果您传递的值大于该套接字类型预期的实际大小,则有些操作系统就不那么宽容了。将ai_addrlen分配为sizeof(sockaddr_storage)的情况就是如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28908548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档