首页澳门新葡亰官方网站 › 1. gethostname(卡塔尔国 & gethostbyname(卡塔尔(قطر‎ & get_host_ip(卡塔尔国

1. gethostname(卡塔尔国 & gethostbyname(卡塔尔(قطر‎ & get_host_ip(卡塔尔国

addrTo.sin_addr.S_un.S_addr=htonl(dwIP);

hostent->h_name:
表示的是主机的规范名。例如www.google.com的规范名其实是www.l.google.com。

addrTo.sin_family=AF_INET;
addrTo.sin_port=htons(6000);

   
memset(&serverAddress,0,sizeof(serverAddress));

DWORD dwIP = *((DWORD*)pHost->h_addr_list[0]);

}

if(SOCKET_ERROR==WSASendTo(m_socket,&wsabuf,1,&dwSend,0,
    (SOCKADDR*)&addrTo,sizeof(SOCKADDR),NULL,NULL))
{
   MessageBox("发送数据失败!");
   return;
}

        Sleep(3000);

SOCKADDR_IN addrTo;      

struct hostent* hostaddr;  

SetDlgItemText(IDC_EDIT_SEND,"");

         int WSAStartup(WORD wVersionRequest,
LPWSADATA lpWSAData);

A:

  1. 通过gethostname() 和 gethostbyname()得到机器ip

      
7)完成将主机名转换为IP地址的功能,以前将IP地址转换为主机名的功能
嘿嘿,单线程的聊天室创建完毕!性能并且非常出色!

 

char* HostName =
gethostbyaddr((char*)&addrTo.sin_addr.S_un.S_addr,4,AF_INET))->h_name;
  

#define h_addr h_addr_list[0]/* for backward compatibility */

GetDlgItemText(IDC_EDIT_SEND,strSend);
len=strSend.GetLength();
wsabuf.buf=strSend.GetBuffer(len);
wsabuf.len=len+1;

   

1>通过IP获取对方主机名:

返回值:如果函数成功,则返回0。如果发生错误则返回-1。错误号存放在外部变量errno中。

第16课
1.事件对象:来实现线程的同步。与互斥对象一样均属于内核对象。
            
当人工重置有信号时,所有线程均得到信号,所以不能设为人工重置。代码就不贴了。
            
通过创建匿名的事件对象,也可以让一个程序只能运行一个实例。  
2.关键代码段实现线程的同步:类似公用电话亭,只有当电话亭里面没人了,其它人才可以再进去打电话。用了4个函数,这种方法比较简单!但缺点是如果使用了多少关键代码码,容易赞成线程的死锁
3.线程死锁,用关键代码示例,用了两个临界区对象,实战中要注意避免这种错误!
4.使用异步套接字编写网络聊天室
  
1)加载套接字库,进行版本协商,包含头文件,链接库文件,这次请示的是2.2版本!
   2)在类CChatDlg中增加一个成员变量m_socket,在析构函数中释放这个变量
   3)利用WSASocket()创建套接字(数据报类型的UDP型的)
  
4)然后调用WSAAsyncSelect(m_socket,m_hWnd,UM_SOCK,FD_READ)为网络事件定义消息!此时如果发生FD_READ消息,系统会发送UM_SOCK消息给应用程序!程序并不会阻塞在这儿了!
   以上是在BOOL CChatDlg::OnInitDialog()完成
   5)然后完成消息响应!
   头文件中:#define UM_SOCK   WM_USER+1
afx_msg void OnSock(WPARAM,LPARAM);
    源文件中:
     ON_MESSAGE(UM_SOCK,OnSock)
     实现消息响应函数:void CChatDlg::OnSock(WPARAM wParam,LPARAM
lParam)
{
switch(LOWORD(lParam))
{
case FD_READ:
   WSABUF wsabuf;
   wsabuf.buf=new char[200];
   wsabuf.len=200;
   DWORD dwRead;
   DWORD dwFlag=0;
   SOCKADDR_IN addrFrom;
   int len=sizeof(SOCKADDR);
   CString str;
   CString strTemp;
   HOSTENT *pHost;
   if(SOCKET_ERROR==WSARecvFrom(m_socket,&wsabuf,1,&dwRead,&dwFlag,
       (SOCKADDR*)&addrFrom,&len,NULL,NULL))
   {
    MessageBox("接收数据失败!");
    return;
   }
  
pHost=gethostbyaddr((char*)&addrFrom.sin_addr.S_un.S_addr,4,AF_INET);
   //str.Format("%s说 :%s",inet_ntoa(addrFrom.sin_addr),wsabuf.buf);
   str.Format("%s说 :%s",pHost->h_name,wsabuf.buf);
   str+="rn";
   GetDlgItemText(IDC_EDIT_RECV,strTemp);
   str+=strTemp;
   SetDlgItemText(IDC_EDIT_RECV,str);
   break;
}
}
OK!
       6)完成数据发送的功能!
       void CChatDlg::OnBtnSend()
{
// TOD Add your control notification handler code here
DWORD dwIP;
CString strSend;
WSABUF wsabuf;
DWORD dwSend;
int len;
CString strHostName;
SOCKADDR_IN addrTo;
HOSTENT* pHost;
if(GetDlgItemText(IDC_EDIT_HOSTNAME,strHostName),strHostName=="")
{
  
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);
   addrTo.sin_addr.S_un.S_addr=htonl(dwIP);
}
else
{
   pHost=gethostbyname(strHostName);
  
addrTo.sin_addr.S_un.S_addr=*((DWORD*)pHost->h_addr_list[0]);
}

    }else{

HOSTENT pHost=gethostbyname(strHostName);

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

}

 

char* LocalHostName = gethostname(hostname,128);

const char *inet_ntop(int af, const void *src, char *dst, socklen_t
cnt) :

    if(WSAStartup(MAKEWORD(2,1),&wsa) != 0){

B:获取本机主机名可以直接通过gethostname函数完成,如:

inth_length;/* length of address */

    return 0;

2>通过主机名获取对方IP

char buf[256];

        
Name:用于指向主机名缓冲区的指针,namelen: 缓冲区的大小。

这个函数,是将类型为af的网络地址结构src,转换成主机序的字符串形式,存放在长度为cnt的字符串中。返回指向dst的一个指针。如果函数调用错误,返回值是NULL。

#include <iostream>

  1. gethostbyname()函数说明——用域名或主机名获取IP地址

 

返回hostent结构体类型指针,使用它需要使用2个头文件,#include
<netdb.h> 和 #inlude <sys/socket.h>

        Sleep(3000);

hostent->h_addr_lisst:
表示的是主机的ip地址,注意,这个是以网络字节序存储的。千万不要直接用printf带%s参数来打这个东西,会有问题的哇。所以到真正需要打印出这个IP的话,需要调用inet_ntop()。

            in_addr addr = *(in_addr*)
pht->h_addr_list[i];

char**h_aliases;/* alias list */

#include <Windows.h>

这个函数的传入值是域名或者主机名,例如"www.google.cn"等等。传出值,是一个hostent的结构。如果函数调用失败,将返回NULL。

    serverAddress.sin_port =
htons(listen_port);

}

 

memcpy(&addr.s_addr, hostaddr->h_addr_list[0],
sizeof(addr.s_addr));

 

inth_addrtype;/* host address type */

            in_addr addr = *(in_addr*)
pht->h_addr_list[i];

接收缓冲区name,其长度必须为len字节或是更长,存获得的主机名。

            cout << "接受来自" << inet_ntoa(clientAddress.sin_addr)
<<"的连接"<< endl;

hostent->h_aliases:
表示的是主机的别名.www.google.com就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。

        Sleep(3000);

hostent->h_length: 表示的是主机ip地址的长度

 

char*h_name;/* official name of host */

    if(serverSocket == INVALID_SOCKET){

struct hostent {

    }

  1. 地址转换函数:inet_aton & inet_ntoa & inet_addr和inet_pton &
    inet_ntop

    }

函数原型 struct hostent *gethostbyname(const char *name);

    }

参数说明:这个函数需要两个参数:

         ws2_32.lib对应的是ws2_32.dll,提供对于常见网络编程的API接口支持,使用其中的网络接口就需要将ws2_32.dll添加到工程,否则需要动态的加载ws2_32.dll。

1. 使用gethostname()函数和gethostbyname()函数获取主机相关信息

        cout << "获取本地主机的Name失败:"<<WSAGetLastError()<< SOCKET_ERROR <<
endl;

return std::string(inet_ntoa(addr));
#将一个32位的网络字节序二进制IPv4地址转换为相应的点分十进制数串。

 

char**h_addr_list;/* list of addresses */

    WSADATA wsa ;//
WSADATA 结构是用来保存函数WSAStartup 返回的Windows
socket初始化信息

原型int gethostname(char *name, size_t len);

        cout << "成功绑定端口:" << listen_port << endl;

const std::string get_host_ip() {

 

gethostname(buf, sizeof(buf));

 

hostaddr = gethostbyname(buf);

    }

接收缓冲区name的最大长度

         If the function return 0, 表示成功。

参考:

        cout << "h_addrtype:" << 
pht->h_addrtype << endl;

hostent->h_addrtype:
表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是pv6(AF_INET6)

    if( gethostname(buf,sizeof(buf)) ==
SOCKET_ERROR  ){

struct in_addr addr;  
#in_addr是一个结构体,可以用来表示一个32位的IPv4地址

#pragma comment(lib,"ws2_32.lib")

        cout << "h_aliases:" <<
pht->h_aliases << endl;

    if(WSAStartup(MAKEWORD(2,1),&wsa) != 0){

转载本站文章请注明出处:澳门新葡亰官方网站 http://www.radioritmo-bl.com/?p=1289

上一篇:

下一篇:

相关文章