我制作了一个简单的客户端程序,通过端口80连接到服务器;
int v=connect(mysocket,(struct sockaddr *)&server,sizeof(server));
if(v==SOCKET_ERROR){
cout<<"error connecting to server";
}
if (v==0) cout<<"connected"<<endl;
如果成功,则表示连接返回0。
但是我得到了错误;
你能告诉我何时必须使用htonl或htons我只使用server.sin_port=htons(80);
我应该使用server.sin_addr.s_addr=inet_addr("someip_ignorethis");
还是必须使用
server.sin_addr.s_addr=htonl(inet_addr("someip_ignorethis"));
问题是什么?为什么我需要使用主机进行网络对话,它如何使我的程序可移植? 我必须使用什么插座?插座版本2,2? 谢谢你的帮助! 我得到10038 ERROR HELP FIX MY CODE pastebin.com/4pdqsGqW
答案 0 :(得分:2)
如果您打算使用调试器并自行调试代码,您会发现mySocket
变量始终为0,因为您没有正确初始化它。
这一行:
if (mysocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)==INVALID_SOCKET){
实际上与此相同:
if (mysocket=(socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)==INVALID_SOCKET)){
如果socket()
成功,==INVALID_SOCKET
评估为false,则将{0}分配给mysocket
。阅读Operator Precedence。 ==
运算符的优先级高于=
运算符。
要解决此问题,请将该行改为:
if ((mysocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){
或者更好的是,摆脱在同一语句中分配和比较变量的习惯:
mysocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (mysocket==INVALID_SOCKET){
另外,如果你不注意编译器的输出消息,你会发现你的"CONNECTED!"
消息是从未到过的代码,因为它在大括号内时connect()
失败,但在打印邮件之前有一个return
。
请尝试使用此代码:
#include <winsock2.h>
#include <iostream.h>
#include <windows.h>
//#define portnumber 80
using namespace std;
//Winsock Library
int main(int argc, char* argv[])
{
WSADATA ws = {0};
int v = WSAStartup(MAKEWORD(2,2), &ws);
if (v != 0)
{
cout << "error initialising winsock: " << v << endl;
getchar();
return 1;
}
cout << "winsock started" << endl;
SOCKET mysocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (mysocket == INVALID_SOCKET)
{
cout << "error creating socket: " << WSAGetLastError() << endl;
getchar();
return 1;
}
cout << "socket created" << endl;
struct sockaddr_in server = {0};
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("84.95.234.174");
//cout << inet_ntoa(server.sin_addr) << endl;
server.sin_port = htons(80);
if (connect(mysocket, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
{
cout << "error connecting to server: " << WSAGetLastError() << endl;
getchar();
return 1;
}
cout << "CONNECTED!" << endl;
getchar();
closesocket(mysocket);
return 0;
}
答案 1 :(得分:0)
10038是WSAENOTSOCK
。显然socket
的值无效。
你应该在发布之前找到所有这些,并查看错误的含义。
答案 2 :(得分:-1)
就个人而言,我使用它并且它永远不会让我失望..
struct addrinfo *it = nullptr, *result = nullptr;
getaddrinfo(Address.c_str(), nullptr, nullptr, &result);
for (it = result; it != nullptr; it = it->ai_next)
{
sockaddr_ipv4 = reinterpret_cast<sockaddr_in*>(it->ai_addr);
Address = inet_ntoa(sockaddr_ipv4->sin_addr);
if (Address != "0.0.0.0") break;
}
freeaddrinfo(result);
我用:
struct sockaddr_in SockAddr;
memset(&SockAddr, 0, sizeof(SockAddr));
SockAddr.sin_port = htons(Port);
SockAddr.sin_family = AF_INET;
SockAddr.sin_addr.s_addr = Address == "INADDR_ANY" ? htonl(INADDR_ANY) : inet_addr(Address.c_str());
if (connect(socket, reinterpret_cast<SOCKADDR*>(&SockAddr), sizeof(SockAddr)) == SOCKET_ERROR)
{
//print error.. clean up..
}
它做的是检查地址。如果它是INADDR_ANY,那么它将使用htonl。如果没有,它使用inet_addr将地址转换为IP。另一方面,Htonl只是将地址转换为网络字节顺序。