基本TCPソケット2−4

getsockname関数とgetpeername関数

#include <sys/socket.h>

int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);

int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen);

戻り値:成功 → 0,  エラー → -1

getsocknameサンプル

#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>#include <arpa/inet.h>

int
main()
{
  int sockfd;
  struct sockaddr_in addr;
  struct sockaddr_in sockname;
  socklen_t addr_len = sizeof(sockname);
  int sockname_len = sizeof(sockname);
  sockfd = socket(AF_INET, SOCK_STREAM, 0);

  addr.sin_family = AF_INET;
  addr.sin_port = htons(80);
  addr.sin_addr.s_addr = inet_addr("192.168.10.254");//接続先IPアドレスを指定する
  connect(sockfd, (struct sockaddr*)&addr, addr_len);

  getsockname(sockfd, (struct sockaddr*)&sockname, &sockname_len);

  printf("IP Address = %s, Port Number = %d\n",
    inet_ntoa(sockname.sin_addr), ntohs(sockname.sin_port));

  return 0;
}

getpeername サンプル

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>

int
main()
{
  int listenfd, connfd;
  struct sockaddr_in addr;
  struct sockaddr_in client_addr;
  struct sockaddr_in peer;
  int client_addr_len = sizeof(client_addr);
  socklen_t peer_len = sizeof(peer);

  listenfd = socket(AF_INET, SOCK_STREAM, 0);
  addr.sin_family = AF_INET;
  addr.sin_port = htons(8000);
  addr.sin_addr.s_addr = htonl(INADDR_ANY);
  bind(listenfd, (struct sockaddr*)&addr, sizeof(addr));
  listen(listenfd, 64);
  connfd = accept(listenfd, (struct sockaddr*)&client_addr, &client_addr_len);

  getpeername(connfd, (struct sockaddr*)&peer, &peer_len);

  printf("IP Address=%s, Port=%d\n",
    inet_ntoa(peer.sin_addr), ntohs(peer.sin_port));
  return 0;
}

参考文献

  • UNIXネットワークプログラミング スティーブンズ