资源描述:
《Unix网络编程5-UDP编程.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Unix网络编程第五讲UDPsocket编程UDPC/S编程UDPSocketsProgrammingCreatingUDPsockets.ClientServerSendingdata.Receivingdata.ConnectedMode.CreatingaUDPsocketintsocket(intfamily,inttype,intproto);intsock;sock=socket(PF_INET,SOCK_DGRAM,0);if(sock<0){/*ERROR*/}绑定到有名地址intmysock;structso
2、ckaddr_inmyaddr;mysock=socket(PF_INET,SOCK_DGRAM,0);memset(&myaddr,0,sizeof(myaddr));myaddr.sin_family=AF_INET;myaddr.sin_port=htons(1234);myaddr.sin_addr.s_addr=htonl(INADDR_ANY);bind(mysock,&myaddr,sizeof(myaddr));通常只有服务器需要绑定地址发送UDP数据报文sockfd-UDPsocketbuff-数据缓冲区地址
3、(nbytes-长度)to-指向sockaddr结构的目标地址.addrlen-to指向的sockaddr结构的长度返回值-实际发送数据数目,-1表示出错ssize_tsendto(intsockfd,void*buff,size_tnbytes,intflags,conststructsockaddr*to,socklen_taddrlen);sendto()你可以发送0字节数据!可能的错误有:EBADF,ENOTSOCK:错误的socket描述符EFAULT:错误的缓冲地址EMSGSIZE:消息长度过大ENOBUFS:系统
4、缓冲区满sendto()sendto()的返回值指示的是多少数据被OS接受并且以一个数据报文发送–并非多少数据已经发送到目的地.sendto()无法指示数据没有到达目的地!!!接收UDP数据报文sockfd-UDPsocketbuff-缓冲区地址(长度nbytes)from-sockaddr的地址.返回接收到的字节长度,出错返回-1.ssize_trecvfrom(intsockfd,void*buff,size_tnbytes,intflags,structsockaddr*from,socklen_t*fromaddrle
5、n);recvfrom()如果缓冲区不够大,超过缓冲区的“多余”的数据将丢失...你可能接收到0字节数据!发送者的地址填入到sockaddr结构的from变量中.fromaddrlen需要在调用前添好合适的值.如果from和fromaddrlen都是NULL,我们将难以知道数据是从哪里发送过来的.recvfrom()除了和sendto一样的错误外,还有:EINTR:系统调用被信号中断.recvfrom正常情况下阻塞等待,一直到一个数据报文到来为止.典型的UDP客户程序创建UDPsocket.创建sockaddr填充好服务器的地
6、址.调用sendto(),发送请求给服务器.没有必要调用bind()!如果要接收数据,调用recvfrom().典型的UDP服务器程序创建UDPsocket并bind到有名地址.调用recvfrom()得到客户的请求,并且应当注意客户的地址.处理请求并调用sendto()发送应答.UDPEchoServerintmysock;structsockaddr_inmyaddr,cliaddr;charbuf[MAXLEN];socklen_tclilen;intmsglen;mysock=socket(PF_INET,SOCK_D
7、GRAM,0);memset(&myaddr,0,sizeof(myaddr));myaddr.sin_family=AF_INET;myaddr.sin_port=htons(S_PORT);myaddr.sin_addr.s_addr=htonl(INADDR_ANY);bind(mysock,&myaddr,sizeof(myaddr));while(1){len=sizeof(cliaddr);msglen=recvfrom(mysock,buf,MAXLEN,0,&cliaddr,&clilen);sendto(my
8、sock,buf,msglen,0,cliaddr,clilen);}NEEDTOCHECKFORERRORS!!!1#include"unp.h"2intmain(intargc,char**argv)4{5intsockfd;6structsockaddr_inserva