[C++] 纯文本查看 复制代码
#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
[C++] 纯文本查看 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <arpa/inet.h>
//显示错误信息
static void display_error(const char *err_msg)
{
perror (err_msg);
exit (EXIT_FAILURE);
}
//获取本地协议地址或外地协议地址
char *sock_addr(int s, char *buf, size_t buf_size, int type)
{
int z;
struct sockaddr_in addr_inet;
int len;
len = sizeof(addr_inet);
if (!type) {
z = getsockname(s, (struct sockaddr *)&addr_inet, &len);
if (z == -1) {
return NULL; // 获取失败
}
bzero(buf, buf_size);
snprintf(buf, buf_size, "%s:%u", //将地址信息存储到缓冲区
inet_ntoa(addr_inet.sin_addr),
(unsigned)ntohs(addr_inet.sin_port));
return buf;
} else {
z = getpeername(s, (struct sockaddr *)&addr_inet, &len);
if (z == -1) {
return NULL; // Failed
}
bzero(buf, buf_size);
snprintf(buf, buf_size, "%s:%u", //将地址信息存储到缓冲区
inet_ntoa(addr_inet.sin_addr),
(unsigned)ntohs(addr_inet.sin_port));
return buf;
}
}
int main(int argc, char **argv, char **envp)
{
int z;
int sockfd;
int len;
char buf[64];
struct sockaddr_in addr_inet, client_addr;
//创建一个套接字
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if ( sockfd == -1 ) {
display_error("socket()");
}
memset (&addr_inet, 0, sizeof(addr_inet));
addr_inet.sin_family = AF_INET;
addr_inet.sin_port = htons(2012); //服务器绑定在 2012 端口
inet_aton ("192.168.1.108", &addr_inet.sin_addr); //服务器 IP 地址
len = sizeof(addr_inet);
//将地址绑定到套接字上
z = bind(sockfd, (struct sockaddr *)&addr_inet, len);
if ( z == -1) {
display_error("bind()");
}
//获取服务器端 IP 地址
if (!sock_addr(sockfd, buf, sizeof(buf), 0)) {
display_error("sock_addr()");
}
printf("Server address is '%s'\n", buf);
if (listen(sockfd, 5) == -1) {
display_error("listen()");
}
int new_fd;
if ((new_fd = accept(sockfd, (struct sockaddr *)&client_addr, &len)) == -1) {
display_error("accept()");
}
if (!sock_addr(new_fd, buf, sizeof(buf), 1)) { //注意:如果应用 getsockname() 并通过 new_fd 来获取到地址仍然是服务器端地址
display_error("sock_addr()");
}
printf ("Client address is '%s'\n", buf);
close(new_fd);
close(sockfd);
return 0;
}