Linux C语言实现 UDP Socket

本文介绍了一种使用非阻塞式socket API进行远程主机可达性检查的方法,通过发送数据包并接收响应来验证目标主机是否在线。

两种方式,阻塞式和非阻塞式。如下代码片段注释掉的部分为阻塞式,打开不部分为非阻塞式。

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值