分类: 嵌入式
2010-08-10 11:09:50
完成一个UDP协议通信的程序。
原理:
1 TCP/IP协议的体系结构
2 TCP和UDP的区别。(打电话和发短信)
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);
}