`
aigo
  • 浏览: 2535777 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

windows如何获取连接远程socket(客户端)的ip地址,使用accept或者getpeername

 
阅读更多

 原文:http://blog.csdn.net/gukesdo/article/details/6889594

 

#include <iostream>
#include <winsock.h>
#include <stdio.h>

#pragma comment(lib, "wsock32")
using namespace std;

void main() 
{
	int ret = 0;
	WSADATA wsadata;
	WORD version = MAKEWORD(2,0);
	ret = WSAStartup(version,&wsadata);

	//服务器端口创建
	SOCKET m_hServerSocket;
	m_hServerSocket = socket(AF_INET,SOCK_STREAM,0);

	//服务器端口绑定
	SOCKADDR_IN m_addr;
	m_addr.sin_family = AF_INET;
	m_addr.sin_addr.S_un.S_addr = INADDR_ANY;//如果服务器是单网卡的,则就是这块网卡的ip地址;如果是多网卡,则是其中的任意一块的ip地址
	m_addr.sin_port = htons(10000);
	ret = bind(m_hServerSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr));

	//服务器端口开始监听
	ret = listen(m_hServerSocket,10);//第二个参数指定最大申请的连接数

	WSADATA cli_wsadata;
	ret = WSAStartup(version,&cli_wsadata);

	//客户端端口创建
	SOCKET m_hClientSocket;
	m_hClientSocket = socket(AF_INET,SOCK_STREAM,0);


	//客户端向服务器发送连接请求
	SOCKADDR_IN m_addr1;
	m_addr1.sin_family = AF_INET;
	m_addr1.sin_addr.S_un.S_addr = inet_addr("192.168.100.57");//服务器的ip地址
	m_addr1.sin_port = htons(10000);//服务器socket的端口号
	ret = connect(m_hClientSocket,(LPSOCKADDR)&m_addr1,sizeof(m_addr1));//从客户端端口m_hClientSocket想服务器端口m_addr1发送连接请求

	//0xCD,0xCD,0xCD,0XCD. 因为DEBUG为每个字节初始化0xcd(204),你未正确取得对方IP,并且你的变量未初始化的结果。 
	//开始使用accept和getpeername一直返回204.204.204.204的原因

	SOCKET com_Sock;
	SOCKADDR_IN addr_conn;
	int nSize = sizeof(addr_conn);
	//initialize the memory block via the memset function
	memset((void *)&addr_conn,0,sizeof(addr_conn));

	com_Sock = accept(m_hServerSocket,NULL,NULL);			//从连接队列中取第一个连接进行通信
	//开始时候错误是因为把第三个参数写成了(int *)(sizeof(addr_conn)),所以不会报错但是取不到正确结果!!!
	//com_Sock = accept(m_hServerSocket,(SOCKADDR *)&addr_conn,&nSize); //or
	getpeername(com_Sock,(SOCKADDR *)&addr_conn,&nSize);

	char szPeerAddress[16];
	//Sets buffers to a specified character.
	memset((void *)szPeerAddress,0,sizeof(szPeerAddress));
	cout << szPeerAddress << "**************" <<endl;
	//If no error occurs, inet_ntoa returns a character pointer to a static buffer 
	//containing the text address in standard ".'' notation
	strcpy(szPeerAddress,inet_ntoa(addr_conn.sin_addr));
	//Copy a string.the second parameter strSource Null-terminated source string
	cout << szPeerAddress << endl;
	//so remember that every time use the inet_ntoa, you must copy the result by yourself
	//or it will be covered by the other value
	addr_conn.sin_addr.S_un.S_addr = inet_addr("192.168.111.2");
	cout << inet_ntoa(addr_conn.sin_addr) << endl;

	cout << endl;
}

 

 

另外还有一个getsockname函数,区别在于

getsockname()函数用于获取一个套接口的名字。它用于一个已捆绑或已连接套接口s,本地地址将被返回。本调用特别适用于如下情况:未调用bind()就调用了connect(),这时唯有getsockname()调用可以获知系统内定的本地地址。在返回时,namelen参数包含了名字的实际字节数。

  若一个套接口与INADDR_ANY捆绑,也就是说该套接口可以用任意主机的地址,此时除非调用connect()或accept()来连接,否则getsockname()将不会返回主机IP地址的任何信息。除非套接口被连接,WINDOWS套接口应用程序不应假设IP地址会从INADDR_ANY变成其他地址。这是因为对于多个主机环境下,除非套接口被连接,否则该套接口所用的IP地址是不可知的。

分享到:
评论

相关推荐

    c语言socket编程指南

    6) IP 地址和如何处理它们 7) socket()函数 8) bind()函数 9) connect()函数 10) listen()函数 11) accept()函数 12) send()和recv()函数 13) sendto()和recvfrom()函数 14) close()和shutdown()函数 15) ...

    Linux-socket编程指南

    6) IP 地址和如何处理它们 7) socket()函数 8) bind()函数 9) connect()函数 10) listen()函数 11) accept()函数 12) send()和recv()函数 13) sendto()和recvfrom()函数 14) close()和shutdown()函数 15) ...

    C语言SOCKEt编程指南.rar

    6) IP 地址和如何处理它们 7) socket()函数 8) bind()函数 9) connect()函数 10) listen()函数 11) accept()函数 12) send()和recv()函数 13) sendto()和recvfrom()函数 14) close()和shutdown()...

    socket教程

    6) IP 地址和如何处理它们 7) socket()函数 8) bind()函数 9) connect()函数 10) listen()函数 11) accept()函数 12) send()和recv()函数 13) sendto()和recvfrom()函数 14) close()和shutdown()函数 15) ...

    linux网络编程

    网络字节序 字节序转换函数 地址转换函数 套接字类型 07socket编程(二) TCP客户/服务器模型 回射客户/服务器 socket、bind、listen、accept、connect 08socket编程(三) SO_REUSEADDR 处理多客户连接(process-...

    linux网络编程学习笔记

    接的 IP我们可以在 accept 调用成功后 使用而得到IP地址. 在网络上有许多的默认端口和服务,比如端口 21 对 ftp80 对应 WWW.为了得到指定的端口号 的服务 我们可以调用第四个函数,相反为了得到端口号可以调用第三个...

    网络socket编程指南

    6) IP 地址和如何处理它们 7) socket()函数 8) bind()函数 9) connect()函数 10) listen()函数 11) accept()函数 12) send()和recv()函数 13) sendto()和recvfrom()函数 14) close()和shutdown()函数 15) ...

    2018年C++教程网的linux网络编程视频共41集百度云下载链接.rar

    socket、bind、listen、accept、connect 08socket编程(三) SO_REUSEADDR 处理多客户连接(process-per-conection) 点对点聊天程序实现 09socket编程(四) 流协议与粘包 粘包产生的原因 粘包处理方案 readn ...

    C++教程网《Linux网络编程》视频百度云地址

    socket、bind、listen、accept、connect 08socket编程(三) SO_REUSEADDR 处理多客户连接(process-per-conection) 点对点聊天程序实现 09socket编程(四) 流协议与粘包 粘包产生的原因 粘包处理方案 ...

    TCP_IP详解卷1

    3.6 特殊情况的IP地址 33 3.7 一个子网的例子 33 3.8 ifconfig命令 35 3.9 netstat命令 36 3.10 IP的未来 36 3.11 小结 37 第4章 ARP:地址解析协议 38 4.1 引言 38 4.2 一个例子 38 4.3 ARP高速缓存 40 4.4 ARP的...

    Linux网络编程 视频 教程

    socket、bind、listen、accept、connect 08socket编程(三) SO_REUSEADDR 处理多客户连接(process-per-conection) 点对点聊天程序实现 09socket编程(四) 流协议与粘包 粘包产生的原因 粘包处理方案 ...

    C++教程网视频:linux网络编程

    socket、bind、listen、accept、connect 08socket编程(三) SO_REUSEADDR 处理多客户连接(process-per-conection) 点对点聊天程序实现 09socket编程(四) 流协议与粘包 粘包产生的原因 粘包处理方案 ...

    c++教程网的linux网络编程视频下载

    socket、bind、listen、accept、connect 08socket编程(三) SO_REUSEADDR 处理多客户连接(process-per-conection) 点对点聊天程序实现 09socket编程(四) 流协议与粘包 粘包产生的原因 粘包处理方案 ...

    [免费]2018年C++教程网的linux网络编程视频百度云下载链接.rar

    socket、bind、listen、accept、connect 08socket编程(三) SO_REUSEADDR 处理多客户连接(process-per-conection) 点对点聊天程序实现 09socket编程(四) 流协议与粘包 粘包产生的原因 粘包处理方案 ...

    TCPIP详解--共三卷

    3.6 特殊情况的IP地址 33 3.7 一个子网的例子 33 3.8 ifconfig命令 35 3.9 netstat命令 36 3.10 IP的未来 36 3.11 小结 37 第4章 ARP:地址解析协议 38 4.1 引言 38 4.2 一个例子 38 4.3 ARP高速缓存 40 4.4 ARP的...

    TCP/IP详解part_2

    3.6 特殊情况的IP地址 33 3.7 一个子网的例子 33 3.8 ifconfig命令 35 3.9 netstat命令 36 3.10 IP的未来 36 3.11 小结 37 第4章 ARP:地址解析协议 38 4.1 引言 38 4.2 一个例子 38 4.3 ARP高速缓存 40 4.4 ARP的...

    TCP-IP详解卷2

    6.6.11 删除IP地址:SIOCDIFADDR 140 6.7 接口ioctl处理 141 6.7.1 leioctl函数 141 6.7.2 slioctl函数 142 6.7.3 loioctl函数 143 6.8 Internet实用函数 144 6.9 ifnet实用函数 144 6.10 小结 145 第7章 域和协议 ...

    TCP-IP详解卷2:实现

    6.6.11 删除IP地址:SIOCDIFADDR 140 6.7 接口ioctl处理 141 6.7.1 leioctl函数 141 6.7.2 slioctl函数 142 6.7.3 loioctl函数 143 6.8 Internet实用函数 144 6.9 ifnet实用函数 144 6.10 小结 145 第7章 域和协议 ...

    TCP-IP详解卷二:实现

    6.6.10 附加IP地址:SIOCAIFADDR 139 6.6.11 删除IP地址:SIOCDIFADDR 140 6.7 接口ioctl处理 141 6.7.1 leioctl函数 141 6.7.2 slioctl函数 142 6.7.3 loioctl函数 143 6.8 Internet实用函数 144 6.9 ifnet实用函数...

    TCP-IP详解卷2_2.rar

    6.6.11 删除IP地址:SIOCDIFADDR 140 6.7 接口ioctl处理 141 6.7.1 leioctl函数 141 6.7.2 slioctl函数 142 6.7.3 loioctl函数 143 6.8 Internet实用函数 144 6.9 ifnet实用函数 144 6.10 小结 145 第7章 域和协议 ...

Global site tag (gtag.js) - Google Analytics