-1

我制作了一个简单的客户端程序,通过端口 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 错误帮助修复我的代码 pastebin.com/4pdqsGqW

4

3 回答 3

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;
}
于 2013-10-30T00:21:57.457 回答
0

10038 是WSAENOTSOCK. 显然 的值socket是无效的。

在发布之前,您应该自己找到所有这些,并查看错误的含义。

于 2013-10-30T01:04:54.177 回答
-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 只是将地址转换为网络字节顺序。

于 2013-10-29T19:37:12.703 回答