What is the difference between AF_INET and PF_INET in socket programming?

CLinuxSockets

C Problem Overview


What is the difference between AF_INET and PF_INET in socket programming?

I'm confused between using AF_INET and PF_INET in socket() and bind().

Also, how to give ip-address in sin_addr field?

C Solutions


Solution 1 - C

Beej's famous network programming guide gives a nice explanation:

> In some documentation, you'll see mention of a mystical "PF_INET". > This is a weird etherial beast that is rarely seen in nature, but I > might as well clarify it a bit here. Once a long time ago, it was > thought that maybe a address family (what the "AF" in "AF_INET" stands > for) might support several protocols that were referenced by their > protocol family (what the "PF" in "PF_INET" stands for).
> That didn't happen. Oh well. So the correct thing to do is to use AF_INET in your > struct sockaddr_in and PF_INET in your call to socket(). But > practically speaking, you can use AF_INET everywhere. And, since > that's what W. Richard Stevens does in his book, that's what I'll do > here.

Solution 2 - C

I found in Linux kernel source code that PF_INET and AF_INET are the same. The following code is from file include/linux/socket.h, line 204 of Linux kernel 3.2.21 tree.

/* Protocol families, same as address families. */
...
#define PF_INET     AF_INET

Solution 3 - C

  • AF = Address Family
  • PF = Protocol Family

Meaning, AF_INET refers to addresses from the internet, IP addresses specifically. PF_INET refers to anything in the protocol, usually sockets/ports.

Consider reading the man pages for [socket(2)][1] and [bind(2)][2]. For the sin_addr field, just do something like the following to set it:

struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr); 

[1]: http://man.cx/socket%282%29 "socket(2)" [2]: http://man.cx/bind%282%29 "bind(2)"

Solution 4 - C

In fact, AF_ and PF_ are the same thing. There are some words on Wikipedia will clear your confusion

> The original design concept of the socket interface distinguished between protocol types (families) and the specific address types that each may use. It was envisioned that a protocol family may have several address types. Address types were defined by additional symbolic constants, using the prefix AF_ instead of PF_. The AF_-identifiers are intended for all data structures that specifically deal with the address type and not the protocol family. However, this concept of separation of protocol and address type has not found implementation support and the AF_-constants were simply defined by the corresponding protocol identifier, rendering the distinction between AF_ versus PF_ constants a technical argument of no significant practical consequence. Indeed, much confusion exists in the proper usage of both forms.

Solution 5 - C

AF_INET = Address Format, Internet = IP Addresses

PF_INET = Packet Format, Internet = IP, TCP/IP or UDP/IP

AF_INET is the address family that is used for the socket you're creating (in this case an Internet Protocol address). The Linux kernel, for example, supports 29 other address families such as UNIX sockets and IPX, and also communications with IRDA and Bluetooth (AF_IRDA and AF_BLUETOOTH, but it is doubtful you'll use these at such a low level).

For the most part sticking with AF_INET for socket programming over a network is the safest option.

Meaning, AF_INET refers to addresses from the internet, IP addresses specifically.

PF_INET refers to anything in the protocol, usually sockets/ports.

Solution 6 - C

Checking the header file solve's the problem. One can check for there system compiler.

For my system , AF_INET == PF_INET

AF == Address Family And PF == Protocol Family

Protocol families, same as address families.

enter image description here

Solution 7 - C

There are situations where it matters.

If you pass AF_INET to socket() in Cygwin, your socket may or may not be randomly reset. Passing PF_INET ensures that the connection works right.

Cygwin is self-admittedly a huge mess for socket programming, but it is a real world case where AF_INET and PF_INET are not identical.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSP SandhuView Question on Stackoverflow
Solution 1 - CDamonView Answer on Stackoverflow
Solution 2 - CDukeView Answer on Stackoverflow
Solution 3 - CcodemacView Answer on Stackoverflow
Solution 4 - CfiroView Answer on Stackoverflow
Solution 5 - CDINO UView Answer on Stackoverflow
Solution 6 - CEmbedded GuyView Answer on Stackoverflow
Solution 7 - CFlyingJesterView Answer on Stackoverflow