套接字连接错误c套接字

时间:2013-10-29 19:10:03

标签: c++ winsock

我制作了一个简单的客户端程序,通过端口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

3 个答案:

答案 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只是将地址转换为网络字节顺序。