getsockname
Synopsis
int getsockname(
SOCKET s,
struct sockaddr *name,
int *namelen
);
Description
The getsockname
function retrieves the local address information associated with a socket. This includes the IP address and port number that the socket is bound to.
Typical usage scenarios:
- Determining the port assigned by the system when an application binds to
INADDR_ANY
with port 0. - Verifying the address after a
connect
on a client socket.
Parameters
Name | Direction | Description |
---|---|---|
s | Input | Socket descriptor returned by socket . |
name | Output | Pointer to a sockaddr structure that receives the address. |
namelen | In/Out | On entry, size of name ; on return, actual size of the address. |
Return Value
Returns 0
on success. On failure, -1
is returned and WSAGetLastError
provides the error code.
Example
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")
int main() {
WSADATA wsaData;
SOCKET listenSock = INVALID_SOCKET;
struct sockaddr_in serverAddr, localAddr;
int addrLen = sizeof(localAddr);
int result;
WSAStartup(MAKEWORD(2,2), &wsaData);
listenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listenSock == INVALID_SOCKET) { printf("socket failed\\n"); return 1; }
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(0); // ask OS for an available port
result = bind(listenSock, (SOCKADDR*)&serverAddr, sizeof(serverAddr));
if (result == SOCKET_ERROR) { printf("bind failed\\n"); return 1; }
result = getsockname(listenSock, (SOCKADDR*)&localAddr, &addrLen);
if (result == SOCKET_ERROR) {
printf("getsockname failed: %d\\n", WSAGetLastError());
} else {
char ipStr[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &localAddr.sin_addr, ipStr, sizeof(ipStr));
printf("Listening on %s:%d\\n", ipStr, ntohs(localAddr.sin_port));
}
closesocket(listenSock);
WSACleanup();
return 0;
}