WSA Error: 10045

Hello. I'm trying to make a server but I can't seem to get past the listening part.

Here's my listen function.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    void SocketListen()
    {
        if(listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
        {
            std::cout << "--- Listen failed: " << WSAGetLastError() << ".\n";
            closesocket(ListenSocket);
            WSACleanup();
            exit(1);
        }
        else
        {
            std::cout << ":: Listening.\n";
        }
    }


I use AF_INET, IPPROTO_TPC, SOCK_STREAM and AI_PASSIVE. What could be causing this?


Here's the function which calls getaddrinfo, it might be useful to solve the problem.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    void ResolveAddr(const char *port)
    {

        wResult = getaddrinfo(NULL, port, &hints, &res);
        if(wResult != 0)
        {
            std::cout << "::Error:: getaddrinfo failed: " << wResult << ".\n";
            WSACleanup();
            exit(1);
        }
        else
        {
            std::cout << ":: getaddrinfo has been called.\n";
        }
    }



Thanks in advance.



Edit:
10045 means the following.
Operation not supported.

The attempted operation is not supported for the type of object referenced. Usually this occurs when a socket descriptor to a socket that cannot support this operation is trying to accept a connection on a datagram socket.

Copied from http://msdn.microsoft.com/en-us/library/ms740668%28v=vs.85%29.aspx.
Last edited on
Clearly the socket's not initialised incorrectly. Can't help if you don't post your code.
Fine, here you go.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
// Fixing the getaddrinfo-can't-be-found error.
/*------------------------------------------*/
#define _WIN32_WINNT 0x501
/*------------------------------------------*/


#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <iostream>
#include <string>


class SocketServer
{
    //Declare variables.
    struct addrinfo *res, *ptr, hints;
    int wResult;
    SOCKET ListenSocket;


    private:

    static void StartWSA()
    {
        int wResult;
        WSADATA wsaData;

        wResult = WSAStartup(MAKEWORD(2,2), &wsaData);
        if(wResult != 0)
        {
            std::cout << "WSAStartup has failed: " << wResult << ".\n";
            exit(1);
        }
        else
        {
            std::cout << ":: WSAStartup has been called.\n";
        }
    }

    void MemsetHints()
    {
        memset(&hints, 0, sizeof hints);
        std::cout << ":: memset has been called.\n";
    }

    void  SpecifyFamily(int ftype)
    {
        switch(ftype)
        {
            case 0: hints.ai_family = AF_UNSPEC;
            case 1: hints.ai_family = AF_INET; //IPv4
            case 2: hints.ai_family = AF_INET6; //IPv6
        }
        if(ftype != 0 && ftype != 1 && ftype != 2)
        {
            std::cout << "--- Family hasn't been specified.\n";
            exit(1);
        }
        else
        {
            std::cout << ":: Family has been specified.\n";
        }
    }

    void SpecifySocktype(int stype)
    {
        switch(stype)
        {
            case 0: hints.ai_socktype = SOCK_STREAM; //Streaming socket.
            case 1: hints.ai_socktype = SOCK_DGRAM;
        }
        if(stype != 0 && stype != 1)
        {
            std::cout << "--- Didn't specify socktype.\n";
            exit(1);
        }
        else
        {
            std::cout << ":: Socktype has been specified.\n";
        }
    }

    void SpecifyProtocol(int ptype)
    {
        switch(ptype)
        {
            case 0: hints.ai_protocol = IPPROTO_TCP; //Use TCP as protocol.
            case 1: hints.ai_protocol = IPPROTO_UDP;
        }
        if(ptype != 0 && ptype != 1)
        {
            std::cout << "--- Didn't specify protocol.\n";
            exit(1);
        }
        else
        {
            std::cout << ":: Protocol has been specified.\n";
        }
    }

    void SpecifyFlags()
    {
        hints.ai_flags = AI_PASSIVE;
    }

    void ResolveAddr(const char *port)
    {

        wResult = getaddrinfo(NULL, port, &hints, &res);
        if(wResult != 0)
        {
            std::cout << "::Error:: getaddrinfo failed: " << wResult << ".\n";
            WSACleanup();
            exit(1);
        }
        else
        {
            std::cout << ":: getaddrinfo has been called.\n";
        }
    }

    void CallSocket()
    {
        ListenSocket = INVALID_SOCKET;
        ListenSocket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

        if(ListenSocket == INVALID_SOCKET)
        {
            std::cout << "Error when calling socket: " << WSAGetLastError() << ".\n";
            freeaddrinfo(res);
            WSACleanup();
            exit(1);
        }
        else
        {
            std::cout << ":: Socket has been called.\n";
        }
    }

    void BindSocket()
    {
        wResult = bind(ListenSocket, res->ai_addr, (int)res->ai_addrlen);
        if(wResult == SOCKET_ERROR)
        {
            std::cout << "--- Bind failed: " << WSAGetLastError() << ".\n";
            freeaddrinfo(res);
            closesocket(ListenSocket);
            WSACleanup();
            exit(1);
        }
        else
        {
            std::cout << ":: Socket has been bound.\n";
            freeaddrinfo(res);
        }


    }

    void SocketListen()
    {
        if(listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
        {
            std::cout << "--- Listen failed: " << WSAGetLastError() << ".\n";
            closesocket(ListenSocket);
            WSACleanup();
            exit(1);
        }
        else
        {
            std::cout << ":: Listening.\n";
        }
    }

    void AcceptConnection() //Probably needs a loop or something.
    {
        SOCKET TempSocket;
        TempSocket = INVALID_SOCKET; //Creates a temporary socket.

        TempSocket = accept(ListenSocket, NULL, NULL);
        if(TempSocket == INVALID_SOCKET)
        {
            std::cout << ":: Couldn't accept: " << WSAGetLastError() << ".\n";
            exit(1);
        }
        else
        {
            std::cout << ":: Connection accepted.\n";
        }
    }

    public:

    //Initiialize variables using an initiializer list.
    SocketServer() : res(NULL), ptr(NULL), ListenSocket(NULL)
    {
    }

    void StartProgram()
    {
        /*-----------------------------------------*/
        /* Configure variables and functions here. */
        /*-----------------------------------------*/

        StartWSA();
        MemsetHints();
        SpecifyFamily(1);
        SpecifySocktype(0);
        SpecifyProtocol(0);
        SpecifyFlags();
        ResolveAddr("8080");
        CallSocket();
        BindSocket();
        SocketListen();
        AcceptConnection();
    }
};

int main()
{
    SocketServer ServerObject;
    ServerObject.StartProgram();
    return 0;
}
That's unnecessarily complicated. Did you have a simple version working before to wrote that?
No, I didn't.
I'm quite new when it comes to OOP, so feel free to share some tips on how I can improve my coding style.

Regarding my problem. I don't really know what's causing it, I doubt it has anything to do with datagrams since I specified SpecifyProtocol() to use the TCP protocol.
I can write a simplified version tomorrow if I have time and see if I can get it to work without any problems.


Thank you for your time.
You need to keep it simple. It helps to think a little more carefully. For example, there's no point in setting the protocol and stream type seperately as you can't have a TCP datagram or a UDP stream, so exposing yourself to the possibility of setting them incorrectly is pointless.

In all the example you'll see,a socket is initialised in a few lines of code. Your code is spread over a fair number of lines making it impossible to read.

The key is to keep it as simple as you can. Only introduce complexity when you need to.
Argh, this time I get the error code 10022.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#define _WIN32_WINNT 0x501

#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <iostream>
#include <string>


int main()
{
    int wResult;

    WSAData wsaData;

    wResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if(wResult != 0)
    {
        std::cout << "WSAStartup failed: " << wResult << ".\n";
        exit(1);
    }
    else
    {
        std::cout << "WSAStartup has been called.\n";
    }

    struct addrinfo *res = NULL, *ptr = NULL, hints;
    memset(&hints, 0, sizeof hints);

    hints.ai_family = AF_INET; //IPv4.
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;

    const char *port;
    port = "8080";

    wResult = getaddrinfo(NULL, port, &hints, &res);
    if(wResult != 0)
    {
        std::cout << "Error: getaddrinfo failed: " << wResult << ".\n";
        WSACleanup();
        exit(1);
    }
    else
    {
        std::cout << "getaddrinfo has been called.\n";
    }

    SOCKET ListenSocket = INVALID_SOCKET;

    ListenSocket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

    if(listen(ListenSocket, SOMAXCONN) == INVALID_SOCKET)
    {
        std::cout << "Listen failed: " << WSAGetLastError() << ".\n";
        freeaddrinfo(res);
        WSACleanup();
        exit(1);
    }
    else
    {
        std::cout << "Listening.\n";
    }

    wResult = bind(ListenSocket, res->ai_addr, (int)res->ai_addrlen);
    if(wResult == SOCKET_ERROR)
    {
        std::cout << "Bind failed: " << WSAGetLastError() << ".\n";
        freeaddrinfo(res);
        closesocket(ListenSocket);
        WSACleanup();
        exit(1);
    }
    else
    {
        std::cout << "The socket has been bound.\n";
    }

    return 0;


}


Meaning of 10022.
Invalid argument.

Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket—for instance, calling accept on a socket that is not listening.

Coped from http://msdn.microsoft.com/en-us/library/ms740668%28v=vs.85%29.aspx.
Check out Douglas Comer's examples here http://www.cs.odu.edu/~cs779/comer/
Topic archived. No new replies allowed.