udp函式呼叫為:客戶不與伺服器建立連線,而是只管使用sendto函式給伺服器傳送資料報,其中必須指定目的地的位址為引數。類似地,伺服器不接受來客戶的連線,而是只管呼叫recvfrom函式,等待來自某個客戶的資料到達,recvfrom將與所接收的資料一道返回客戶的協議位址,因此可以把響應傳送給正確的客戶。
這兩個函式類似於標準的read和write函式,不過需要三個額外的引數
#includedssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags,
struct sockaddr *from, socklen_t &addrlen);
ssize_t sendto(int sockfd, const void *buff, size_t nbytes, int flags,
const struct sockaddr * to, socklen_t *addrlen);
若成功則返回為讀或寫的位元組數,若出錯則為-1
前三個引數sockfd、buff和nbytes等同於read和write函式的三個引數:描述符、指讀入或寫出緩衝區的指標和讀寫位元組數。
flags引數將在討論recv、send、recvmsg和sendmsg等函式數再介紹,當前我們把flags置為0
sendto的to引數指向乙個含有資料報接收者的協議位址(例如ip位址及埠號)的套接字位址結構,其大小由addrlen引數指定。recvfrom的from引數指向乙個將由該函式在返回時填寫資料報傳送者的協議位址的套接字位址結構,而套接字位址結構中的位元組數則放在addrlen引數所指的整數中返回給呼叫者。
#include #include #include #include #include void dg_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen);
int main(int argc, char **argv)
bzero(&servaddr, sizeof(servaddr));//清空套接字位址結構
servaddr.sin_family = af_inet;//指定協議
servaddr.sin_addr.s_addr = htonl(inaddr_any);//指定位址ip
servaddr.sin_port = htons(9988);//指定埠
int bindfd = bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
if(bindfd == -1)
dg_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
}void dg_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)
int s = sendto(sockfd, mesg, n, 0, pcliaddr, len);
if(s == -1)}}
#include #include #include #include #include #include #include void dg_cli(file *fp, int sockfd, const struct sockaddr *pservaddr, socklen_t servlen);
int main(int argc, char *argv)
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = af_inet;
servaddr.sin_port = htons(9988);
inet_pton(af_inet, argv[1], &servaddr.sin_addr);
sockfd = socket(af_inet, sock_dgram, 0);
dg_cli(stdin, sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
exit(0);
}void dg_cli(file *fp, int sockfd, const struct sockaddr *pservaddr, socklen_t servlen)
n = recvfrom(sockfd, recvline, 2048, 0, null, null);
if(n == -1)
recvline[n] = 0;
fputs(recvline, stdout);}}
UDP套接字程式設計
與面向連線的協議相比,面向無連線協議極為不同。其中乙個重要的不同點就是客戶端與伺服器之間不必建立連線。對於udp套接字程式設計而言,伺服器建立套接字後,呼叫bind 函式將套接字與準備接收資料的介面繫結在一起。和tcp程式設計不同的是,應用程式不必呼叫listen 和accept 函式等待客戶端的連...
UDP套接字程式設計
udp是使用者資料報協議,與tcp協議一樣,在網路中處理資料報,是一種無連線的傳輸層協議,具有不可靠性,udp有不提供資料報分組 組裝和不能對資料報進行排序的缺點,也就是說,當報文傳送之後,是無法得知其是否安全完整到達的。基於udp的客戶端伺服器 伺服器 include include includ...
UDP網路程式設計套接字
ip協議有兩個版本,乙個是ipv4,乙個是ipv6。ip位址是在ip協議中,用來標識網路中不同的主機的位址。對於ipv4來說,ip位址是乙個4位元組,32位的整數。在資料報頭部的兩個ip位址,乙個叫源ip位址,乙個叫目的ip位址 埠號port 必須是眾所周知的,並且不能隨意修改 埠號是乙個2個位元組...