在我的应用程序的客户端,下面的代码在OSX上运行良好。但是,在Linux (Ubuntu 12或Raspbian)上编译/运行时,sendto()总是使用EINVAL/22/无效参数失败。如何在Linux上运行?
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看起来和这个很像。
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 发布于 2015-03-06 23:03:16
sendto说,如果“dest_len参数不是地址家族的有效长度”,则可能会返回EINVAL,尽管对于连接模式套接字来说,地址参数被忽略了。考虑到您在标题中提到了TCP,我假设control_fd是一个连接模式套接字。试着简单地使用send(control_fd, sendBytes, sendSize, 0),甚至write(control_fd, sendBytes, SendSize)。
发布于 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)的情况就是如此。
https://stackoverflow.com/questions/28908548
复制相似问题