17.UDP與connect()函式;ICMP非同步錯誤
阿新 • • 發佈:2018-12-17
1.connect在UDP中的用途
[**ICMP非同步錯誤]
ICMP非同步錯誤是指:傳送報文的時候,沒有錯誤;接收報文的時候,會收到ICMP應答
重點:非同步錯誤,無法返回給未連線的套接字。UDP可以呼叫connect解決不能收到ICMP
非同步錯誤的問題。
2.UDP與connect()函式
UDP的client呼叫connect()函式後:執行recvfrom函式,不會發生阻塞,可以收
到ICMP非同步錯誤(recvfrom: Connection refused)。
客戶端示例程式碼
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <ctype.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #define MAX_BUF 80 #define SRV_PORT 8001 int main() { int ret = 0; struct sockaddr_in srv_addr; int sock_fd; char buf[MAX_BUF]={0}; socklen_t addr_len; //建立UDP套接字 sock_fd = socket(AF_INET,SOCK_DGRAM,0); //填充伺服器地址 bzero(&srv_addr,sizeof(srv_addr)); srv_addr.sin_family = AF_INET; srv_addr.sin_port = htons(SRV_PORT); srv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); connect(sock_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr)); //呼叫connect連線 //獲取地址長度 addr_len = sizeof(srv_addr); //從標準輸入獲取資料傳送給伺服器並等待伺服器返回資料 while(fgets(buf,sizeof(buf),stdin) != NULL) { addr_len = sizeof(srv_addr); //sendto第一次傳送的時候,會繫結地址,需要指定對方的地址 ret = sendto(sock_fd,buf,strlen(buf),0,(struct sockaddr*)&srv_addr,sizeof(srv_addr));//開始傳送 if(ret == -1) { perror("sendto"); exit(-1); } ret = recvfrom(sock_fd,buf,sizeof(buf),0,(struct sockaddr*)&srv_addr,&addr_len);//等待伺服器反饋資料 if(ret == -1) { if (errno == EINTR) continue; perror("recvfrom"); exit(-1); } printf("recv from IP:%s,IP:%d\n",inet_ntoa(srv_addr.sin_addr),ntohs(srv_addr.sin_port)); fputs(buf,stdout);//列印接收到的資料 memset(buf,0,sizeof(buf));//清空緩衝區 } return 0; }