Chinaunix首页 | 论坛 | 博客
  • 博客访问: 291378
  • 博文数量: 109
  • 博客积分: 2116
  • 博客等级: 大尉
  • 技术积分: 1062
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-22 15:38
文章分类

全部博文(109)

文章存档

2013年(2)

2011年(16)

2010年(90)

2009年(1)

我的朋友
UDP

分类: 嵌入式

2010-08-10 11:09:50

完成一个UDP协议通信的程序。

 

原理:

1 TCP/IP协议的体系结构

2 TCPUDP的区别。(打电话和发短信)

3 socket编程

  Socket是一种特殊的fd,常用于不同机器上的进程之间进行通信。

  三种类型:SOCK_STREAM(TCP), SOCK_DGRAM(UDP), SOCK_RAW(IP,ICMP)

socket编程函数:socket, bind, listen, accept, send, sendto, recv, recvfrom

4 UDP流程

UDP编程的服务器端一般步骤是:

1、创建一个socket,用函数socket()

2、设置socket属性,用函数setsockopt();* 可选

3、绑定IP地址、端口等信息到socket上,用函数bind();

4、循环接收数据,用函数recvfrom();

5、关闭网络连接;

UDP编程的客户端一般步骤是:

1、创建一个socket,用函数socket()

2、设置socket属性,用函数setsockopt();* 可选

3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选

4、设置对方的IP地址和端口等属性;

5、发送数据,用函数sendto();

6、关闭网络连接;

 

步骤:

1 在宿主机编程,调试,编译。

注意:talker在开发板上进行,所以源程序需要交叉编译。Listener端在主机上运行,所以源程序需要本地编译。

Talker Makefile

EXEC = talker

OBJS = talker.o

SRC  = talker.c

 

CC = arm-linux-gcc

#LD = arm-linux-ld

CFLAGS += -O2 -Wall

LDFLAGS +=

 

all:$(EXEC)

 

$(EXEC):$(OBJS)

    $(CC) $(LDFLAGS) -o $@ $(OBJS)

 

%.o:%.c

    $(CC) $(CFLAGS) -c $< -o $@

 

clean:

    @rm -vf $(EXEC) *.o *~

 

Listener Makefile

EXEC = listener

OBJS = listener.o

SRC  = listener.c

 

CC = gcc

#LD = arm-linux-ld

CFLAGS += -O2 -Wall

LDFLAGS +=

 

all:$(EXEC)

 

$(EXEC):$(OBJS)

    $(CC) $(LDFLAGS) -o $@ $(OBJS)

 

%.o:%.c

    $(CC) $(CFLAGS) -c $< -o $@

 

clean:

    @rm -vf $(EXEC) *.o *~

 

2 在主机端运行listener,在开发板运行talker。结果如下:

从上面的通信过程可以看出,开发板向主机发送数据成功。

 

源代码来自周立功:

Talker.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

 

#define PORT 5000

#define LENGTH 512

 

int main(int argc, char *argv[])

{

    int sockfd;

    int num;

    char sdbuf[LENGTH];

    struct sockaddr_in addr_remote;

    char sdstr[]={"MagicARM2410 UDP Experiment."};

 

    if(argc!=2)

    {

        printf("Usage:talker HOST IP(ex:./talker 192.168.0.94).\n");

        return(0);

    }

 

    if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1)

    {

        printf("ERROR:Failed to obtain Socket Descriptor!\n");

        return(0);

    }

 

    addr_remote.sin_family=AF_INET;

    addr_remote.sin_port=htons(PORT);

    inet_pton(AF_INET,argv[1],&addr_remote.sin_addr);

    bzero(&(addr_remote.sin_zero),8);

 

    bzero(sdbuf,LENGTH);

    num=sendto(sockfd,sdstr,strlen(sdstr),0,(struct sockaddr*)&addr_remote,sizeof(struct sockaddr_in));

    if(num<0){

        printf("ERROR:Failed to send your data!\n");

    }else{

        printf("OK:Send to %s total %d bytes!\n",argv[1],num);

    }

    close(sockfd);

    return(0);

}

Listener.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

 

#define PORT 5000

#define BACKLOG 10

#define LENGTH 512

 

int main()

{

    int sockfd;

    int nsockfd;

    int num;

    int sin_size;

    char revbuf[LENGTH];

    struct sockaddr_in addr_local;

    struct sockaddr_in addr_remote;

 

    if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1)

    {

        printf("ERROR:Failed to obtain Socket Despcritor.\n");

        return(0);

    }else{

        printf("OK:Obtain Socket Despcritor successfully.\n");

    }

 

    addr_local.sin_family=AF_INET;

    addr_local.sin_port=htons(PORT);

    addr_local.sin_addr.s_addr=INADDR_ANY;

    bzero(&(addr_local.sin_zero),8);

 

    if(bind(sockfd,(struct sockaddr*)&addr_local,sizeof(struct sockaddr))==-1){

        printf("ERROR:Failed to bind Port %d\n",PORT);

        return(0);

    }else{

        printf("OK:Bind the Port %d successfully.\n",PORT);

    }

 

    sin_size=sizeof(struct sockaddr);

 

    if(num=recvfrom(sockfd,revbuf,LENGTH,0,(struct sockaddr*)&addr_remote,&sin_size)==-1)

    {

        printf("ERROR!\n");

    }else{

        printf("OK:%s\n",revbuf);

    }

    close(sockfd);

    return(0);

}

 

阅读(418) | 评论(0) | 转发(0) |
0

上一篇:线程

下一篇:TCP

给主人留下些什么吧!~~