`
aigo
  • 浏览: 2569137 次
  • 性别: 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地址是不可知的。

分享到:
评论

相关推荐

    socket实现了tcp的服务器断和客户端

    4. **Win32 API中的套接字函数**:除了上述的函数,还有其他辅助函数,如`getsockname()`获取Socket的本地地址,`getpeername()`获取远程连接的地址,以及`closesocket()`关闭Socket。 5. **错误处理**:在Socket...

    socket 编程

    - **`getpeername()`**:获取连接的对端Socket地址。 - **`gethostname()`**:获取本地主机名。 - **DNS解析**:将域名转换为IP地址,反之亦然,例如将"whitehouse.gov"解析为"63.161.169.137"。 #### 五、客户端-...

    windows socket api函数大全

    1. **accept()**:用于接受来自客户端的连接请求,返回一个新的Socket,该Socket将用于与客户端进行数据通信。 2. **bind()**:将Socket绑定到特定的IP地址和端口号,以便监听来自网络的连接。 3. **closesocket()**...

    获取ip的两个好方法

    在这个例子中,`socket_getpeername()`函数用于获取与socket连接的远程主机名和端口,即客户端的IP地址。 总结来说,获取IP地址在PHP中可以通过`$_SERVER`全局数组或者Socket通信实现。前者适用于大多数Web应用,后...

    用SOCKET写的简单服务器端程序

    服务器解析这些数据后,可以获取客户端的IP地址(通常是通过Socket对象的getpeername函数)。 4. 返回IP:服务器将客户端的IP地址打包成字符串形式,然后通过新的Socket回送给客户端。 5. 关闭连接:在完成交互后,...

    windows_socket_api_函数大全

    - `gethostbyaddr()` 和 `gethostbyname()`:通过IP地址或名称获取主机信息。 - `getprotobyname()` 和 `getprotobynumber()`:通过名称或数字获取协议信息。 - `getservbyname()` 和 `getservbyport()`:通过...

    Linux系统环境下的Socket编程详细解析

    此外,还有其他高级功能,如`getsockopt()`和`setsockopt()`用于获取和设置Socket选项,`getpeername()`和`getsockname()`用于获取远程或本地Socket的信息,`select()`或`poll()`用于多路复用I/O,监控多个Socket的...

    SocketTest

    在SocketTest中,可能会用到如`CreateThread`来创建并发的客户端或服务器线程,`Sleep`来控制线程等待,`GetSockName`和`GetPeerName`获取Socket的本地和远程地址信息,以及错误处理函数如`WSAGetLastError`等。...

    c语言SOCKEt编程指南.pdf

    9. 其他辅助函数包括getpeername()用于获取已连接的远程Socket的地址信息,gethostname()用于获取本地主机名。 Socket编程还涉及到网络字节序和主机字节序的概念。在进行数据传输时,需要确保数据在发送和接收时的...

    C语言Socket简单编程指南

    Socket编程涉及到多种结构体,比如sockaddr用于存储IP地址和端口号信息,用于bind()、connect()、accept()等函数中。结构体的使用对于网络地址转换和数据处理是不可或缺的。 ### 本机转换 本机转换是指将网络字节...

    socket 经典编程 详解 教程

    服务器程序使用`socket()`、`bind()`、`listen()`和`accept()`来创建并监听连接,而客户端程序使用`socket()`和`connect()`来发起连接请求。一旦连接建立,双方就可以通过`send()`和`recv()`进行数据交换。 此外,...

    linux-socket网络编程详解.doc

    - **connect()函数**:在面向连接的Socket中,客户端使用connect()函数与服务器建立连接,并将本地和远程的地址信息存储在Socket数据结构中。 - **listen()函数**:仅适用于服务器端,设置Socket为监听模式,等待...

    第章-Socket编程PPT实用.ppt

    对于使用最多的 Internet 簇,其 Socket 地址主要包括两大部分:端口号、IP 地址。地址结构在 `&lt;netinet/in.h&gt;` 中定义。 Berkeley Socket 函数 ------------------- Berkeley Socket 函数是 Socket 编程的基础...

    socket简单教材

    获取连接的对端(远程)的Socket信息。 16)`gethostname()`函数 获取本地主机名。 17)域名服务(DNS) DNS用于将人类可读的域名转换为IP地址,反之亦然,使用gethostbyname()和gethostbyaddr()等函数。 18)...

    c语言SOCKET编程指南.pdf

    15. getpeername()函数:getpeername()函数是SOCKET编程中的一个重要函数,用于获取套接字的远程主机名。 16. gethostname()函数:gethostname()函数是SOCKET编程中的一个重要函数,用于获取本机的主机名。 17. ...

    c语言socket编程超级完整.docx

    9. **getpeername()**:获取已连接Socket的远程地址信息。 10. **gethostname()**:获取本地主机名。 #### 八、域名服务(DNS) - **DNS**:域名系统,用于将域名解析为IP地址。 - **gethostbyname/gethostbyname2...

    Linux环境下的Socket编程.txt

    - **getpeername()**:获取已连接Socket的远程地址信息。 - **gethostname()**:获取本机的主机名。 #### 六、域名解析 - **DNS**:用于将域名转换为IP地址的过程称为域名解析。Linux系统提供了多种API来实现这一...

    linux_socket编程.pdf

    getpeername() 函数是用于获取远程主机的信息的函数。这一步骤对于 Socket 编程非常重要。 gethostname() 函数 gethostname() 函数是用于获取本地主机的信息的函数。这一步骤对于 Socket 编程非常重要。 域名服务...

    C语言socket编程指南

    10. `getpeername()`:获取与当前socket连接的远程对端的地址信息。 11. `gethostname()`:获取本地主机名。 12. `select()`:用于多路复用I/O,监控多个socket的活动状态,实现非阻塞I/O。 此外,你还需要掌握IP...

Global site tag (gtag.js) - Google Analytics