专题 16 基于UDP的通信程序设计

  1. UDP数据的收发

UDP协议使用函数sendto发送函数,使用函数recvfrom接收数据。

    1. 数据发送函数sendto

函数原型:

intsendto(int s , const void *msg, int len, int flags, const structsockaddr *to, int tolen);

通过函数sendto发送数据时总能立即成功返回。它不保证对方套接字是否成功接收,甚至不保证对方套接字协议信息的正确性。

    1. 数据接收函数recvfrom

函数原型:

intrecvfrom(int s, void *buf, int len, int flags, struct sockaddr *from,int *fromlen);

参数flags通常取0即可。函数recvfrom默认以阻塞方式读取数据,成功时返回接收数据的字节长度。

  1. UDP协议的基础编程

    1. 基本编程步骤

步骤1:创建套接字描述符。

步骤2:服务器端命名套接字

服务器端进程调用build将套接字描述符绑定协议、本地址和本地端口。

步骤3:客户服务器端通信

客户端与服务器端的套接字进行数据传输,调用sendto可向对方发送数据,调用recvfrom可接收数据。

步骤4:关闭套接字。

调用closeshutdown关闭套接字。

    1. 创建服务器端套接字程序

intCreateUdpSock(int *pnSock, int nPort)

{

structsockaddr_in addrin;

structsockaddr *paddr = (struct sockaddr*)&addrin;

ASSERT(pnSock!= NULL && nPort > 0);

memset(&addrin,0, sizeof(addrin));

/*协议组包*/

addrin.sin_family= AF_INET;

addrin.sin_addr.s_addr= htonl(INADDR_ANY);

addrin.sin_port= htons(nPort);


ASSERT((*pSock= socket(AF_INET, SOCK_DGRAM, 0)) > 0);


if(VERIFY(bind(*pnSock,paddr, sizeof(addrin)) >= 0))

return0;

VERIFY(close(*pnSock)==0);

return1;

}

PS:TCP方式相比,没有listenaccept

    1. 创建UDP套接字发送程序

intSendMsgByUdp(void *pMsg, int nSize, char *szAddr, int nPort)

{

intnSock;

structsockaddr_in addrin;


ASSERT((nSock= socket(AF_INET, SOCK_DGRAM, 0)) > 0);

memset(&addrin,0, sizeof(struct sockaddr));


addrin.sin_family= AF_INET;

addrin.sin_addr.s_addr= inet_addr(szAddr);

addrin.sin_port= htons(nPort);


VERIFY(sendto(nSock,pMsg, nSize, 0, (struct sockaddr *)&addrin, sizeof(addrin)) >0);

close(nSock);

return0;

}

    1. UDP套接字接收程序

intRecvMsgByUdp(int nFile, void *pData, int *pnSize)

{

intnSize;

/***接收数据,并不关心发送方协议地址****/

VERIFY((*pnSize= recvfrom(nFile, pData, *pnSize, 0, NULL, NULL));

return0;

}


你可能感兴趣的:(编程,struct,socket,服务器,null,Build)