Linux C语言实现 UDP Socket

来源:互联网 发布:matlab设有数组定义,x 编辑:程序博客网 时间:2024/04/29 14:21

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

#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.csdn.net/tjssehaige/article/details/8546849

0 0