首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > windows >

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

2013-07-25 
windows如何获取连接远程socket(客户端)的ip地址,使用accept或者getpeername#include iostream#include

windows如何获取连接远程socket(客户端)的ip地址,使用accept或者getpeername
#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 functionmemset((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); //orgetpeername(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 ".'' notationstrcpy(szPeerAddress,inet_ntoa(addr_conn.sin_addr));//Copy a string.the second parameter strSource Null-terminated source stringcout << 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 valueaddr_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地址是不可知的。

热点排行