套接字连接错误 c 套接字

Socket connect error c socket

本文关键字:套接字 连接 错误      更新时间:2023-10-16

我做了一个简单的客户端程序,它通过端口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或我只用过的HTON 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
如果您费

心使用调试器并自己调试代码,您会发现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 。 阅读运算符优先级。 ==运算符的优先级高于=运算符。

要修复它,请将该行更改为以下内容:

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;
}

10038 是WSAENOTSOCK 。显然,socket的价值是无效的。

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

就个人而言,我使用它,它永远不会让我失望。

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