Chinaunix首页 | 论坛 | 博客
  • 博客访问: 397960
  • 博文数量: 58
  • 博客积分: 1775
  • 博客等级: 上尉
  • 技术积分: 755
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-12 15:03
文章分类

全部博文(58)

文章存档

2012年(5)

2011年(43)

2010年(10)

分类: LINUX

2011-10-12 22:48:45

/*
 * *此程序打开UDP一段端口来接收检测数据
**如果数据正确原样返回,如查错误不应答
 */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define TAG    "[UDPServer]"
#define EN_DEBUG 1
#define DATA_LEN    5
void *UDP_Server(void *pmsg);

int main(int argc,char **argv)
{
    if(argc != 3){
        printf("USE:%s StartPort EndPort\n",argv[0]);
        return -1;
    }
    int start_port = atoi(argv[1]);
    int end_port = atoi(argv[2]);
    if(start_port <= 0 || start_port >= 65535)return -1;
    if(end_port <= 0 || end_port >= 65535)return -1;
    if(start_port >= end_port){
        printf("start port must > end port\n");
        return -1;
    }
    int i = 0;
    pthread_t pid;
    for(i = start_port;i <= end_port;i++){
        pthread_create(&pid,NULL,UDP_Server,&i);
        usleep(100);
    }
    pthread_join(pid,NULL);

}
//是否data[0]*data[1]=data[2];
int CheckData(char *data)
{
    int i,len = strlen(data);
    int s[3];
    if(len != 3 && len != 4 )return -1;
    for(i = 0;i < len;i++){
        s[i] = data[i] - '0';
        if(s[i]< 0|| s[i]>9)return -2;
    }
    if(len == 3 && s[0]*s[1] ==    s[2]) return 0;
    if(len == 4){
        int a = (s[2]*10+s[3]);
        int b = s[0]*s[1];
        if(a == b)
        return 0;
    }
    return -3;
}
//打开udp端口监听线程
void *UDP_Server(void *pmsg)
{
    int port = *((int *)pmsg);
    int s,len;
    struct sockaddr_in addr;
    char msg[DATA_LEN];
    int i = 0;
    if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        perror(TAG"UDP socket");
        return NULL;
    }
    len = sizeof(struct sockaddr_in);
    bzero(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0)
    {
        perror(TAG"UDP bind");
        return NULL;;
    }
    printf(TAG"UDP server start linsten@%d\n",port);

    while (1)
    {
        bzero(msg, sizeof(msg));
        len = sizeof(struct sockaddr_in);
        if ((i = recvfrom(s, msg, sizeof(msg), 0, (struct sockaddr *) &addr,&len)) == -1)
        {
            printf(TAG"[%d]Rec Error\n",port);
            continue;
        }
#if EN_DEBUG == 1
        printf(TAG"[%d]%s:%d:%s \n",port,(char*) inet_ntoa(addr.sin_addr),ntohs(addr.sin_port),msg);
#endif
        if(CheckData(msg) != 0)continue;
        sendto(s, msg, sizeof(msg), 0, (struct sockaddr *) &addr, len);//原样回发

    }

}

阅读(2235) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~