Thomas Woods
Thomas Woods

Reputation: 443

Why isn't AF_INET working with SOCK_STREAM?

I'm just starting out on gaining a better understanding of socket programming, and I'm trying to build a simple program that can send and receive messages. I've run into an issue with binding a socket to an address to use it. Here is what I have-

#include "stdafx.h"

using namespace std;

int main()
{
    bool devbuild = true;

    WSADATA mainSdata;
    SOCKET sock = INVALID_SOCKET;
    sockaddr tobind;
    tobind.sa_family = AF_INET;
    char stringaddr[] = "192.168.1.1";
    inet_pton(AF_INET,stringaddr,&tobind);


    //initiating Windows Socket API (WSA)
    if (WSAStartup(2.2, &mainSdata) == 0)
    {
        if (devbuild == true)
        {
            printf("WSA successfully started...\n");
        }
    }
    else
    {
        printf("WSA failed to set up, press [ENTER] to exit...\n");
        pause();
        return 1;
    }

    //instantiating the socket
    sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, NULL);
    if (sock != INVALID_SOCKET)
    {
        if (devbuild == true)
        {
            printf("Socket successfully created...\n");
        }
    }
    else
    {
        printf("Socket failed to set up, press [ENTER] to exit...\n");
        pause();
        return 2;
    }

    //binding the socket
    if (bind(sock, &tobind, sizeof(tobind)) == 0)
    {
        if (devbuild == true)
        {
            printf("Socket successfully bound...\n");
        }
    }
    else
    {
        printf("Socket failed to bind, press [ENTER] to exit...\n");
        printf("Last WSA error was: %d", WSAGetLastError());
        pause();
        return 3;
    }


    pause();


    return 0;
}

I'm getting a return of 3, with WSA error code 10047

10047 - WSAEAFNOSUPPORT Address family not supported by protocol family. An address incompatible with the requested protocol was used. All sockets are created with an associated address family (that is, AF_INET for Internet Protocols) and a generic protocol type (that is, SOCK_STREAM). This error is returned if an incorrect protocol is explicitly requested in the socket call, or if an address of the wrong family is used for a socket, for example, in sendto.

This doesn't make sense, because I am only using SOCK_STREAM and AF_INET, which support one another.

Upvotes: 0

Views: 1879

Answers (1)

Jeremy Friesner
Jeremy Friesner

Reputation: 73294

I believe one problem (possibly not the only problem, but this is what jumps out at me) is in this line:

inet_pton(AF_INET,stringaddr,&tobind);

The problem is that you are passing &tobind as the final argument, and tobind is a sockaddr, but inet_pton() expects its third argument to point to a struct in_addr instead when using AF_INET (the fact that inet_pton() takes a void-pointer rather than a typed pointer for its third argument makes this kind of mistake really easy to make).

So what you should be doing instead is (note added error checking also):

if (inet_pton(AF_INET,stringaddr,&tobind.sin_addr) != 1)
   printf("inet_pton() failed!\n");

Also, you need to make tobind be of type struct sockaddr_in rather than just a sockaddr, and also you need to zero out the struct before using it:

struct sockaddr_in tobind;
memset(&tobind, 0, sizeof(tobind));   // make sure the uninitialized fields are all zero
tobind.sa_family = AF_INET;
[...]

Upvotes: 3

Related Questions