Chinaunix首页 | 论坛 | 博客
  • 博客访问: 312852
  • 博文数量: 172
  • 博客积分: 25
  • 博客等级: 民兵
  • 技术积分: 895
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-09 16:57
文章分类

全部博文(172)

文章存档

2012年(86)

2011年(86)

分类:

2011-11-11 16:46:49

转自:http://blog.chinaunix.net/u4/123043/showart_2423724.html

前几天写了一个TCP的通信例子,但是有些问题还没有解决,像一建立连接之后,单方中断连接另一方容易陷入无限等待,还有一些缓冲区无法清除造成一端连续发送的现象,这些不是什么大问题,只是TCP本来复杂我不想深入研究了。
今天试着写了UDP的例子,UDP用起来就好得多了。一共两个源文件UDP_sever.c、UDP_client.c。也没有什么特殊功能,就是一个UDP的例子。
1.首先是UDP_server.c里面,用socket()建立一个套接字,然后用bind()把地址端口绑定到这个套接字上面,接着就是开始侦听这个端口。有发送函数、也有接收函数,可以很方便的收发数据。接收到的数据我把ip、端口和信息提取出来了,在终端上显示。
2.UDP_client.c里面,同样建立一个套接字,不用侦听,可以直接向指定IP的端口上发数据,我用了一个while(1)来一直发送,发送内容、ip和端口用参数输入。

代码用gcc编译,测试运行正常。还有一点值得高兴,这些源码用arm-linux-gcc编译了一遍,放在到arm板子上运行正常,和电脑没有一点区别。

附上例子源码,代码简单我就不注解了:

//UDP_server.c
#include
#include
#include
#include
#include

#define PORT_SERV 8889

#define BUFF_LEN 1024
static void UDP_server_process(int s,struct sockaddr * client)
{
    int n,len,PORT_INT,count = 0;
    char buff[BUFF_LEN];
    char *IP_STR;
    struct sockaddr_in *ip;
    ip = (struct sockaddr_in *)client;
    len = sizeof(*client);
    while(1){
        n = recvfrom(s,buff,BUFF_LEN,0,client,&len);
        IP_STR = (char *)inet_ntoa(ip->sin_addr);
        PORT_INT = ntohs(ip->sin_port);
        printf("%d Received Address:%s:%d\n",count,IP_STR,PORT_INT);
        printf("%d Received Message:%s\n",count++,buff);
        printf("\n");
        sendto(s,buff,n,0,client,len);
    }
}

int main(int argc,char **argv)
{
    int s;
    struct sockaddr_in addr_serv,addr_clie;

    s = socket(AF_INET,SOCK_DGRAM,0);

    memset(&addr_serv,0,sizeof(addr_serv));
    addr_serv.sin_family = AF_INET;
    addr_serv.sin_addr.s_addr = htonl(INADDR_ANY);
    addr_serv.sin_port = htons(PORT_SERV);
    bind(s,(struct sockaddr *)&addr_serv,sizeof(addr_serv));

    UDP_server_process(s,(struct sockaddr*)&addr_clie);

    return 0;
}

//UDP_client.c
#include
#include
#include
#include
#include
#define PORT_SERV 8889

#define BUFF_LEN 1024
#define SERV_IP "192.168.31.34"
static void UDP_client_process(int s,struct sockaddr *to)
{
    char RecBuff[BUFF_LEN]="\n",SendBuff[BUFF_LEN];
    int n;
    struct sockaddr_in from;
    int len = sizeof(*to);
    printf("please input message!\n");
    while(1){
        n = read(0,SendBuff,BUFF_LEN);
        SendBuff[n++] = '\0';
        sendto(s,SendBuff,n,0,to,len);
    //    recvfrom(s,RecBuff,BUFF_LEN,0,(struct sockaddr*)&from,&len);
    //    printf("recved:%s\n",RecBuff);
    }
}

int main(int argc,char **argv)
{
    int s;
    struct sockaddr_in addr_serv,addr_clie;
    char *msg;
    if(argc != 3){
        printf("parameter is error!\n");
        printf("format:ip port\n");
        return -1;
    }
   
    s = socket(AF_INET,SOCK_DGRAM,0);
    memset(&addr_serv,0,sizeof(addr_clie));
    addr_serv.sin_family = AF_INET;
   
    /*inet_addr(SERV_IP);htonl(INADDR_ANY);*/   
    addr_serv.sin_addr.s_addr = inet_addr(argv[1]);
   
    /*htons(PORT_SERV);*/
    addr_serv.sin_port = htons(atoi(argv[2]));

    UDP_client_process(s,(struct sockaddr*)&addr_serv);

    close(s);
    return 0;
}
阅读(604) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~