连接时的BSD套接字无效参数
BSD Sockets Invalid Argument at connection
当我尝试将客户端连接到服务器时,我一直得到无效参数错误。网上有几个线程说,当addrlen不正确时,可能会发生这种情况,但我试图在计算长度后将其更改为文字值,这不起作用。我也试过strlen(),但没有成功。总之,相关代码-
server -
struct sockaddr name;
int main(int agrc, char** argv) {
int sock, new_sd, adrlen; //sock is this socket, new_sd is connection socket
name.sa_family = AF_INET;
strcpy(name.sa_data, "127.0.0.1");
adrlen = strlen(name.sa_data) + sizeof(name.sa_family);
//make socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
printf("nBind error %m", errno);
exit(1);
}
//unlink and bind
unlink("127.0.0.1");
if(bind (sock, &name, adrlen) < 0)
printf("nBind error %m", errno);
//listen
if(listen(sock, 5) < 0)
printf("nListen error %m", errno);
//accept
new_sd = accept(sock, &name, (socklen_t*)&adrlen);
if( new_sd < 0) {
printf("nAccept error %m", errno);
exit(1);
}
client -
int main(int agrc, char** argv) {
int sock, new_sd, adrlen;
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
printf("nserver socket failure %m", errno);
exit(1);
}
//stuff for server socket
name.sa_family = AF_INET;
strcpy(name.sa_data, "127.0.0.1");
adrlen = strlen(name.sa_data) + sizeof(name.sa_family);
cout<<"nadrlen: "<<adrlen<<"n";
if(connect(sock, &name, adrlen) < 0) {
printf("nclient connection failure %m", errno);
exit(1);
}
我没有看到任何可能出错的地方,但我想我可能只是忽视了一些事情或没有意识到一些事情。
strcpy(name.sa_data, "127.0.0.1");
真的吗?地址应该是32位的IPv4地址,而不是字符串。
这是AF_INET的结构(从这里开始):
// IPv4 AF_INET sockets:
struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this if you want to
};
struct in_addr {
unsigned long s_addr; // load with inet_pton()
};
你最大的问题是完全误解了sockaddr结构体!
首先使用sockaddr_in
然后你可以像这样写代码:
sockaddr_in sai;
sai.sin_family = AF_INET;
sai.sin_port = htons( 12345 ); /// Or whatever port you wish to use.
inet_aton("127.0.0.1", &sai.sin_addr.s_addr);
注:htons将短值从主机格式转换为网络格式。主机可以是大端或小端。网络是大端的
相关文章:
- 为什么 CRTP 模板C++给出无效参数错误?
- 为什么此字符串在传递到stoi时被视为无效参数
- boost::asio::async_write无效参数
- C ++回测问题:如何检查构造函数在假定失败时是否失败(给定输入的无效参数)
- 无效参数 C++ cygwin
- 套接字接受无效参数 (c++)
- 从带有 getline() 的文件读入一行上有多个信息得到无效参数错误
- 将无效参数传递给将无效参数视为致命的函数
- 如何避免字符串到整数转换情况下的无效参数异常
- 张量流 无效参数:In[0] 不是矩阵
- cudaFreeHost() 无效参数错误
- 未经治疗的例外,无效的参数传递给了一个认为无效参数作用的函数
- C++带有可变参数模板的无效参数
- std::find是否隐式修复无效参数
- 为什么这个程序告诉我传递了无效参数
- 在Win32中获取SetConsolecursorPosition函数的ERRORRORNO 87(无效参数)
- MSVCR120.dll的无效参数错误(在64位窗口中构建Tesseract Lib)
- 在C++中使用字符串类的 .substr 获取无效参数
- MySQL++ 无效参数错误
- 搜索无效参数