针对UDP客户端程序的创建、发送、接受直接可以通用。
UDP客户端创建:
intst_sockfd;
st_sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(st_sockfd == -1)
{
return FALSE;
}
bzero(&st_addrser,sizeof(st_addrser));
st_addrser.sin_family=AF_INET;
st_addrser.sin_addr.s_addr=inet_addr("127.0.0.1");//暂时定义为127.0.0.1
st_addrser.sin_port=htons(8080);//端口号
st_addrlen=sizeof(st_addrser);
UDP发送接口:
int SendUDPTo(char *pBuf, int iLen, struct sockaddr_in sin_to)
{
int iRet = 0;
int itry = 0;
BOOL bFlag = FALSE;
do
{
iRet = sendto(st_sockfd, pBuf, iLen, 0, (struct sockaddr*)&sin_to, sizeof(sin_to));
Sleep(500);
} while (itry --);
return iRet;
}
UDP接受数据接口:
int WaitFiledReadable(int fd, int imsTimeOut)/* milliseconds*/
{
fd_set fdset, fderr;
struct timeval tv;
int rv = WAIT_DATA_TIMEOUT;
while(imsTimeOut > 0)
{
if(imsTimeOut < (MAX_WAIT_INTERVAL*1000))
{
tv.tv_usec = imsTimeOut%1000*1000; /* usec */
tv.tv_sec = imsTimeOut/1000; /* seconds */
imsTimeOut = 0;
}
else
{
tv.tv_usec = 0; /* usec */
tv.tv_sec = MAX_WAIT_INTERVAL; /* seconds */
imsTimeOut -= (MAX_WAIT_INTERVAL*1000);
}
FD_ZERO(&fdset); /* Initializes the set to the NULL set. */
FD_SET(fd, &fdset); /* Adds descriptor s to set. */
fderr = fdset;
rv = select(fd+1, &fdset, NULL, &fderr, &tv);
if (rv > 0) // data ready or error.
{
rv = (FD_ISSET(fd, &fdset)) ? WAIT_DATA_READY// OK
: (FD_ISSET(fd, &fderr)) ? WAIT_DATA_EXCEPT// except
: WAIT_DATA_ERROR; // error??
break;
}
else if (rv < 0)
{
rv = WAIT_DATA_ERROR; // error??
break;
}
}
return rv;
}
int WaitForRecvEvent(DWORD dwMs, char *pRevBuf) //读取收到的回复 如果失败重试3次
{
DWORD dwRet = 0;
int iRet = 0;
int iSinLen = 0;
int iErrs = 0;
struct sockaddr_in sin;
iRet = WaitFiledReadable(g_stSocket.st_sockfd, dwMs);
if(iRet == WAIT_DATA_READY)
{
iSinLen = sizeof(struct sockaddr_in);
iRet = recvfrom(
g_stSocket.st_sockfd,
pRevBuf,
MAX_UDP_RECV_LENGTH,
0,
(struct sockaddr*)&sin,
(socklen_t*)&iSinLen
);
}
return iRet;
}