关于SOCKET接收网上邻居的计算机获取相对应IP的问题求解。

关于SOCKET接收网上邻居的计算机获取相对应IP的问题求解。,第1张

通过计算机名称获得ip

SystemNetIPAddress[] addresses = SystemNetDnsGetHostAddresses ( ">

既然是Socket点对点的都会是长连接

socket对象有

socketgetInetAddress();

socketgetPort()

就可以得到对方的ip和端口号

[解决方法]

主机地址可以用API 获得int gethostname (char name, int namelen );

[程序实现]

假设你有了名为My的对话框工程有一个按钮并有响应的程序:如OnButton1();

BOOL CListCtrl1Dlg::OnInitDialog()

{

CDialog::OnInitDialog();

AfxSocketInit(NULL);//支持Socket若在向导是没选Support Socket,这就的加还要加#include <afxsockh>在StdAfxh中

// Add "About" menu item to system menu

// IDM_ABOUTBOX must be in the system command range

// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control

}

void CListCtrl1Dlg::OnButton1()

{

WORD wVersionRequested;

WSADATA wsaData;

char name[255];

CString ip;

PHOSTENT hostinfo;

wVersionRequested = MAKEWORD( 2, 0 );

if ( WSAStartup( wVersionRequested, &wsaData ) == 0 )

{

if( gethostname ( name, sizeof(name)) == 0)

{

if((hostinfo = gethostbyname(name)) != NULL)

{

ip = inet_ntoa ((struct in_addr )hostinfo->h_addr_list);

}

}

WSACleanup( );

}

AfxMessageBox(name);//name里是本机名

AfxMessageBox(ip); //ip中是本机IP

#include<WinSock2h>

#pragma comment(lib,"WS2_32")

class CInitSock

{

public:

    CInitSock(BYTE minorVer=2,BYTE majorVer=2)

    {

        WSADATA wsaData;

        WORD sockVersion=MAKEWORD(minorVer,majorVer);

        if(WSAStartup(sockVersion,&wsaData)!=0)

        {

            exit(0);

        }

    }

    ~CInitSock()

    {

        WSACleanup();

    }

};

WSADATA 这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets 数据。它包含Winsockdll 执行的数据。

WSAStartup    为了在应用程序当 中调用任何一个Winsock API函数,首先第一件事情就是必须通过WSAStartup函数完成对Winsock服务的初始化,因此需要调用WSAStartup函数。使用 Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明 副版本、低位字节指明主版本; *** 作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时, *** 作系统根据请求的Socket版本来搜索相应的 Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。

WSACleanup   应用程序或DLL在使用Windows Sockets服务之前必须要进行一次成功的WSAStartup()调 用当它完成了Windows Sockets的使用后,应用程序或DLL必须调用WSACleanup()将其从Windows Sockets的实现中注销,并且该实现释放为应用程序或DLL分配的任何资源任何打开的并已建立连接的SOCK_STREAM类型套接口在调用 WSACleanup()时会重置; 而已经由closesocket()关闭却仍有要发送的悬而未决数据的套接口则不会受影响- 该数据仍要发送 对应于一个任务进行的每一次WSAStartup()调用,必须有一个 WSACleanup()调用只有最后的WSACleanup()做实际的清除工作;前面的调用仅仅将Windows Sockets DLL中的内置引用计数递减一个简单的应用程序为确保WSACleanup()调用了足够的次数,可以在一个循环中不断调用WSACleanup()直 至返回WSANOTINITIALISED

#include"initsockh"

#include<iostream>

using std::cout;

using std::endl;

CInitSock initSock;

void IP()

{

    int i;

    char szHost[256];

    gethostname(szHost,256);

    hostent pHost=gethostbyname(szHost);

    in_addr addr;

   

    char p=pHost->h_addr_list[0];

    memcpy(&addrS_unS_addr,p,pHost->h_length);

    char szIp=inet_ntoa(addr);

    cout<<szIp<<endl;

}

int main()

{

    IP();

    system("pause");

    return 0;

}

gethostname()   返回本地主机的标准主机名。

int PASCAL FAR gethostname(char FAR name, int namelen); 

name: 一个指向将要存放主机名的缓冲区指针。 

namelen:缓冲区的长度。

hostent      是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表。之所以主机的地址是一个列表的形式,原因是当一个主机有多个网络接口时,自然有多个地址。

#define h_addr h_addr_list[0]    h_addr_list中的第一地址。

struct hostent { 

     char h_name;       //地址的正式名称 

     char h_aliases; //空字节-地址的预备名称的指针。

     int h_addrtype; //地址类型; 通常是AF_INET。

     int h_length;     //地址的比特长度。

     char h_addr_list;     //零字节-主机网络地址指针。网络字节顺序。

};

memcpy

extern void memcpy(void destin, void source, unsigned n);

由source指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。

Server端不是要建立serversocket么,这个类会监听socket连接,客户端连接服务端的时候会携带本机(客户端)的ip,服务器接收连接,经过三次握手之后双方建立tcp连接,然后就可以通讯了,编写服务端的时候并不需要关心客户端发起连接的端口。

获取ip:socketgetInetAddress()

获取端口:socketgetPort();

以上就是关于关于SOCKET接收网上邻居的计算机获取相对应IP的问题求解。全部的内容,包括:关于SOCKET接收网上邻居的计算机获取相对应IP的问题求解。、如何获取当前IP地址、java socket点对点聊天 就跟QQ一样,怎么获取ip问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10138243.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存