-
網(wǎng)絡(luò)編程第五天
今天是網(wǎng)絡(luò)編程最后一天,老師今天主要給我們講了gethostbyname和UDP編程,最后還給我們推薦了一個抓包工具——wrieshark翠忠,只是看老師演示了一遍,而且下載的版本和老師的不同,版塊都變了辆脸。以后有時間還需要學(xué)習(xí)一下怎么使用這個軟件,老師說要學(xué)會使用這個軟件看數(shù)據(jù)循帐。明天開始就要學(xué)習(xí)C++了,但是我的第一個項目仍然沒有完成,不能在老師給的期限內(nèi)完成就要留到下個班級,我也打算留到下個班級,但是是在聽完所有課程之后,否則到時聽后面的課程還是新知識,這樣消化會比較慢,如果在已經(jīng)有一定概念和基礎(chǔ)的情況下再次去聽嘎虐一定會比聽第一次效果好的碧查。
一、gethostbyname
域名------>ip地址
原型:struct hostent *gethostbyname(const char *name);
正常調(diào)用的前提
1.聯(lián)網(wǎng)
2.dns配置(dns服務(wù)器的ip地址)
基本工作原理:
調(diào)用該函數(shù)的程序被當(dāng)作客戶端與dns服務(wù)器進行網(wǎng)絡(luò)通信, 過程大致如下:
1.鏈接服務(wù)器
2.給dns服務(wù)器發(fā)送域名
3.服務(wù)器返回對應(yīng)的ip地址
4.斷開鏈接,函數(shù)返回
注意:該函數(shù)返回的是數(shù)據(jù)區(qū)空間的首地址,因此不要對其進行free
T *func(...)
{
T *p = NULL;
T t;
p = &t;
.....
return p;//返回的是該函數(shù)普通局部變量所在空間的地址版确,這樣的操作是找死
}
T *func(...)
{
T *p = NULL;
p = (T *)malloc(...);
.....
return p;//返回的是堆區(qū)一塊內(nèi)存空間的首地址梢灭,請記得如果該空間不再被使用請及時釋放
}
//T t;
T *func(...)
{
T *p = NULL;
static T t;
p = &t;
.....
return p;//返回的是數(shù)據(jù)區(qū)一個變量所占空間的首地址
}
T *func(T * pa,...)
{
T *p = pa;
.....
p++;
.....
return p;//返回的是數(shù)據(jù)區(qū)一個變量所占空間的首地址
}
二、心跳包
作用:維持長連接
實現(xiàn):客戶端與服務(wù)器的通信協(xié)議里要支持該PDU
三幕侠、UDP編程
1.面向非鏈接
2.不可靠的傳輸
3.實現(xiàn)組播和廣播
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
UDP客戶端(非定向形式)
fd = socket(AF_INET,SOCK_DGRAM,0);
sendto()/recvfrom();
close(fd);
UDP客戶端(定向形式)
fd = socket(AF_INET,SOCK_DGRAM,0);
...給servaddr賦值
connect(fdd,(struct)&servaddr,sizeof(servaddr));
send()/recv()/read/write;
close(fd);
UDP服務(wù)端
fd = socket(AF_INET,SOCK_DGRAM,0);
bind();
sendto()/recvfrom();
close(fd);
如果客戶端想與服務(wù)器定向傳輸,在發(fā)送和接受數(shù)據(jù)前,可以先調(diào)用connect;
此時的connect函數(shù)并不會與服務(wù)器建立鏈接,只是將遠(yuǎn)端的地址和自己的描述符進行了綁定;
因此客戶端發(fā)送和接受數(shù)據(jù)不可以再用sendto和recvfrom,只能使用read/write或者send/recv.
四帝美、抓包工具(wireshark)