专题 16 基于UDP的通信程序设计
2011-12-18 22:24
316 查看
UDP数据的收发
UDP协议使用函数sendto发送函数,使用函数recvfrom接收数据。
数据发送函数sendto
函数原型:
intsendto(int s , const void *msg, int len, int flags, const structsockaddr *to, int tolen);
通过函数sendto发送数据时总能立即成功返回。它不保证对方套接字是否成功接收,甚至不保证对方套接字协议信息的正确性。
数据接收函数recvfrom
函数原型:
intrecvfrom(int s, void *buf, int len, int flags, struct sockaddr *from,int *fromlen);
参数flags通常取0即可。函数recvfrom默认以阻塞方式读取数据,成功时返回接收数据的字节长度。
UDP协议的基础编程
基本编程步骤
步骤1:创建套接字描述符。
步骤2:服务器端命名套接字
服务器端进程调用build将套接字描述符绑定协议、本地址和本地端口。
步骤3:客户—服务器端通信
客户端与服务器端的套接字进行数据传输,调用sendto可向对方发送数据,调用recvfrom可接收数据。
步骤4:关闭套接字。
调用close或shutdown关闭套接字。
创建服务器端套接字程序
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方式相比,没有listen和accept。
创建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;
}
UDP套接字接收程序
intRecvMsgByUdp(int nFile, void *pData, int *pnSize)
{
intnSize;
/***接收数据,并不关心发送方协议地址****/
VERIFY((*pnSize= recvfrom(nFile, pData, *pnSize, 0, NULL, NULL));
return0;
}
UDP协议使用函数sendto发送函数,使用函数recvfrom接收数据。
数据发送函数sendto
函数原型:
intsendto(int s , const void *msg, int len, int flags, const structsockaddr *to, int tolen);
通过函数sendto发送数据时总能立即成功返回。它不保证对方套接字是否成功接收,甚至不保证对方套接字协议信息的正确性。
数据接收函数recvfrom
函数原型:
intrecvfrom(int s, void *buf, int len, int flags, struct sockaddr *from,int *fromlen);
参数flags通常取0即可。函数recvfrom默认以阻塞方式读取数据,成功时返回接收数据的字节长度。
UDP协议的基础编程
基本编程步骤
步骤1:创建套接字描述符。
步骤2:服务器端命名套接字
服务器端进程调用build将套接字描述符绑定协议、本地址和本地端口。
步骤3:客户—服务器端通信
客户端与服务器端的套接字进行数据传输,调用sendto可向对方发送数据,调用recvfrom可接收数据。
步骤4:关闭套接字。
调用close或shutdown关闭套接字。
创建服务器端套接字程序
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方式相比,没有listen和accept。
创建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;
}
UDP套接字接收程序
intRecvMsgByUdp(int nFile, void *pData, int *pnSize)
{
intnSize;
/***接收数据,并不关心发送方协议地址****/
VERIFY((*pnSize= recvfrom(nFile, pData, *pnSize, 0, NULL, NULL));
return0;
}
相关文章推荐
- 专题 16 基于UDP的通信程序设计
- Linux学习笔记之---基于UDP的通信程序设计
- linux下unix socket通信--基于udp
- 基于嵌入式操作系统VxWorks的多任务并发程序设计(4)――任务间通信A
- RDP(Reliable--UDP)Library 一个基于UDP/IP协议的可靠网络通信库
- 基于LINUX系统的SOCKET通信,使用UDP协议.
- 基于VC++的USB2.0接口通信程序设计
- linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)
- 【Android Socket专题】:UDP通信客户端app的demo的实现
- 基于UDP的多线程网络通信程序
- 基于STM32的无协议栈实现UDP通信
- 基于UDP协议的双端通信
- 基于嵌入式操作系统VxWorks的多任务并发程序设计(4)――任务间通信B
- Node.js实现基于TCP与UDP的数据通信
- C#基于TCP&UDP实现服务器与多个客户端之间的通信(客户端之间直接通信,不靠服务器端转发消息)
- 基于visual c++之windows核心编程代码分析(16)使用邮槽进行进程通信
- 基于winsocket的UDP的数据单向通信过程
- 基于TCP的通信程序设计
- 基于UDP的服务器和客户端之间的通信
- vs2015基于UDP协议的简单通信例程