两种方式,阻塞式和非阻塞式。如下代码片段注释掉的部分为阻塞式,打开不部分为非阻塞式。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> /* netbd.h is needed for struct hostent */
#define MAXDATASIZE 100 /* Max number of bytes of data */
int CheckSvrAlive(char* pstrSvrIP, int nPotr)
{
int iter = 0, nRecvNum = 0, nReturn = 0;
int sockfd; /* socket descriptors */
char recvbuf[MAXDATASIZE]; /* buf will store received text */
char sendbuf[MAXDATASIZE];
struct hostent *pHostent; /* structure that will get information about remote host */
struct sockaddr_in sockAddrInfo; /* sockAddrInfo's address information */
socklen_t nSocketLen;
if ((pHostent=gethostbyname(pstrSvrIP))==NULL){ /* calls gethostbyname() */
printf("gethostbyname() error\n");
exit(1);
}
if ((sockfd=socket(AF_INET, SOCK_DGRAM, 0))==-1){ /* calls socket() */
printf("socket() error\n");
exit(1);
}
bzero(&sockAddrInfo,sizeof(sockAddrInfo));
sockAddrInfo.sin_family = AF_INET;
sockAddrInfo.sin_port = htons(nPotr); /* htons() is needed again */
sockAddrInfo.sin_addr = *((struct in_addr *)pHostent->h_addr); /*pHostent->h_addr passes "*pHostent"'s info to "h_addr" */
struct timeval tv;
fd_set readfds;
tv.tv_sec = 1;
tv.tv_usec = 0;
FD_ZERO(&readfds);
FD_SET(sockfd, &readfds);
nSocketLen = sizeof(struct sockaddr_in);
for (iter=0; iter<=3; iter++)
{
sprintf(sendbuf,"data packet with ID %d\n",iter);
sendto(sockfd, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&sockAddrInfo, nSocketLen);
/*
if ((nRecvNum=recvfrom(sockfd,recvbuf, MAXDATASIZE, 0, (struct sockaddr *)&sockAddrInfo,&nSocketLen)) == -1){
printf("recvfrom() error\n");
nReturn = 0;
break;
}
*/
if (select(sockfd+1,&readfds,NULL, NULL, &tv) > 0)
{
if ((nRecvNum = recvfrom(sockfd,(void *)recvbuf, MAXDATASIZE, 0, (struct sockaddr *)&sockAddrInfo, &nSocketLen)) == -1)
{
printf("recvfrom() error\n");
nReturn = 0;
break;
}
}
else
{
printf("timeout! there is no data arrived!\n");
nReturn=0;
break;
}
recvbuf[nRecvNum]='\0';
printf("sockAddrInfo Return Reverse Message: %s\n",recvbuf); /* it prints sockAddrInfo's welcome message */
if(strcmp(sendbuf, recvbuf)==0)
{
nReturn = 1;
break;
}
}
close(sockfd);
return nReturn;
}
参考:http://blog.youkuaiyun.com/tjssehaige/article/details/8546849
本文介绍了一种使用非阻塞式socket API进行远程主机可达性检查的方法,通过发送数据包并接收响应来验证目标主机是否在线。
1374

被折叠的 条评论
为什么被折叠?



