# Python Socket Module

The `socket` module provides access to the BSD socket interface. It is available on all modern Unix systems, Windows, macOS, and other platforms. It is the foundation for network communication in Python.

## Importing the Module

```python
import socket
```

## Socket Families and Types

### Address Families

*   `socket.AF_INET`: IPv4 (default).
*   `socket.AF_INET6`: IPv6.
*   `socket.AF_UNIX`: Unix Domain Sockets (local inter-process communication).

### Socket Types

*   `socket.SOCK_STREAM`: TCP (reliable, connection-oriented).
*   `socket.SOCK_DGRAM`: UDP (unreliable, connectionless).

## Creating a Socket

```python
import socket

# Create a TCP/IP socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
```

## Utility Functions

### Hostname and IP

```python
# Get the local hostname
hostname = socket.gethostname()
print(f"Hostname: {hostname}")

# Get IP address by hostname
ip_address = socket.gethostbyname(hostname)
print(f"IP Address: {ip_address}")

# Get fully qualified domain name
print(socket.getfqdn('8.8.8.8'))
```

### Service Names

```python
# Get port number for a service
print(socket.getservbyname('http')) # 80
print(socket.getservbyname('ssh'))  # 22
```

## Timeouts

You can set a default timeout for all new sockets or specific timeouts for individual sockets.

```python
# Set default timeout for new sockets (in seconds)
socket.setdefaulttimeout(5)

# Set timeout for a specific socket
s.settimeout(2.0)
```

## Error Handling

Socket operations raise `socket.error` (an alias for `OSError`) on failure.

```python
import socket

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("non-existent-host", 80))
except socket.error as e:
    print(f"Socket error: {e}")
```

For a full client/server implementation guide, see [[programming/python/socket-programming]].

[[programming/python/python]]