分類: LINUX
一,、UDP的connect函數(shù),,并不進行3次握手機制,而僅僅是指定了目的ip和port而已,。對于已經(jīng)connect過的套接口
(1)不能再使用sendto或recvfrom函數(shù),,因為connect已經(jīng)指定ip和port,所以只能用write和read函數(shù),。 (2)UDP中,,connect可以多次使用,也可以斷開connect后重新指定ip和port,。,。設(shè)置地址族為AF_UNSPEC,再調(diào)用 connect,,則可以斷開此接口,。 實際上,,sendto的操作即是循環(huán) 連接套接口,,輸出數(shù)據(jù),關(guān)閉套接口 這3個動作的,。 (3)一個socket只能connect一個目的主機,。僅在進程用udp套接口與確定的唯一對方進行通信時,才調(diào)用connect,。 二,、 UDP中 ,長度為0的數(shù)據(jù)包是可以發(fā)送的,,會生成一個包含IP頭部(ipv4-20字節(jié),,ipv6-40字節(jié)),和8字節(jié)UDP頭部,,以及沒有數(shù)據(jù)的 IP數(shù)據(jù)包,,recvfrom返回0,。 所以,當recvfrom返回0,,并不意味著對方關(guān)閉了連接,。實際上,UDP本來就沒有連接可言,。 TCP服務(wù)器一般是并發(fā)多進程的,,UDP服務(wù)器一般是迭代的 。,。 如果服務(wù)端進程未開啟,,那么客戶端往其發(fā)送udp數(shù)據(jù)包時,會返回ICMP不可到達錯誤,,但是這個錯誤一般不返回到客戶端進程,,因為ICMP不可到達錯誤 是異步錯誤,如果客戶端發(fā)送多個UDP,,其中一個返回錯誤,,內(nèi)核是無法判斷這個錯誤屬于哪個數(shù)據(jù)包的。 只有當客戶端使用connect與服務(wù)端建立unp連接時,,ICMP不可到達錯誤才會返還給客戶端進程,,具體地說是在客戶端recv或者read時讀取到 這個 ICMP錯誤。 #include<unp.h> int main(int argc, char **argv) { struct sockaddr_in ser; int fd; char str[20]; bzero(&ser, sizeof(struct sockaddr_in)); ser.sin_family=AF_INET; ser.sin_port=htons(9877); inet_pton(AF_INET, "127.0.0.1", &ser.sin_addr); fd=socket(AF_INET, SOCK_DGRAM, 0); if (connect(fd, (struct sockaddr *)&ser, sizeof(struct sockaddr_in))<0) perror("connect:"); if (sendto(fd, "ok", 3, 0, (struct sockaddr*)&ser, sizeof(struct sockaddr_in))<0) perror("sendto:"); if (recvfrom(fd, str, 10, 0, NULL, NULL)<0) perror("recvfrom:"); } 如果服務(wù)器未開啟的話,,那么會有如下輸出 recvfrom:: Connection refused 而如果沒有connect進行udp連接的話,,那么進程就會一直阻塞在recvfrom。,。,。 |
|