其实嵌入式的Linux 与PC Linux共用一套内核,实现网络通信,只是编译器不一样,运行效果一样,因为测试也比较方便,可以在PC Linux下测试好,再用交叉编译器编译成嵌入式的运行程序,放到嵌入式板子上运行。
以上为实现UDP服务器端的源码,很简单,当然,嵌入式的板子需要支持网络,配置好IP等。
-
/*******************************************************************************
-
* 文件名称: socket.c
-
* 描 述: UDP服务端测试程序
-
*******************************************************************************/
-
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <errno.h>
-
#include <string.h>
-
#include <netdb.h>
-
#include <sys/types.h>
-
#include <netinet/in.h>
-
#include <sys/socket.h>
-
-
-
#define UDP_SERVER_PORT 888
-
typedef unsigned char BYTE;
-
-
void UdpServer();
-
-
-
-
main(int argc,char *argv[]){
-
-
-
UdpServer();
-
-
}
-
-
-
-
/***************************************************************
-
* 函数名: UdpServer()
-
* 描述 : UDP 服务器程序:接收到客户端的UDP连接,
-
* 打印接收到的数据。
-
* 参数 : NO
-
* 返回 : NO
-
***************************************************************/
-
void UdpServer ()
-
{
-
unsigned int i=0;
-
int sock = 0; //socket fd's
-
struct sockaddr_in serverAddr; // server's address
-
struct sockaddr_in clientAddr; // client's address
-
int sockAddrSize=0;
-
-
char acRevBuf[512]; //接收数据缓冲区
-
int iRevLength = 0; //接收数据长度
-
char acSndBuf[512]; //接收数据缓冲区
-
int iSndLength = 0; //接收数据长度
-
-
for(;;)
-
{
-
//清空缓冲区
-
sockAddrSize = sizeof(struct sockaddr_in);
-
bzero ((char *)&serverAddr, sockAddrSize);
-
bzero ((char *)acRevBuf,sizeof(acRevBuf));
-
bzero ((char *)acSndBuf,sizeof(acSndBuf));
-
-
printf ("UDP Server Starting!\r\n");
-
-
serverAddr.sin_family = AF_INET;
-
serverAddr.sin_port = htons(UDP_SERVER_PORT /* UDP Server Port*/);
-
serverAddr.sin_addr.s_addr = INADDR_ANY;
-
-
//创建 UDP SOCKET
-
sock = socket (AF_INET, SOCK_DGRAM, 0);
-
if (sock == -1)
-
{
-
usleep(20); //创建socket出错!!
-
continue;
-
}
-
printf ("UDP Server Socket OK!\r\n");
-
-
if (bind (sock, (struct sockaddr *)&serverAddr, sockAddrSize)== -1) //bind socket to local address
-
{
-
printf ("bind failed, errno = %d\n", errno);
-
perror(strerror(errno));
-
close (sock);
-
return;
-
exit (1);
-
}
-
-
printf ("UDP Server Bind OK!\r\n");
-
printf("Server prot : %d\n",ntohs(serverAddr.sin_port));
-
-
for (;;)
-
{
-
iRevLength = 0;
-
iRevLength = recvfrom(sock,acRevBuf,sizeof(acRevBuf),0,(struct sockaddr *)&clientAddr,&sockAddrSize);
-
-
if (iRevLength == -1) //客户端退出
-
{
-
break;
-
}
-
if (iRevLength == 0)
-
{
-
continue;
-
}
-
-
int clientip = clientAddr.sin_addr.s_addr; //打印客户端IP地址与Port
-
printf("\nClient ip : %d.%d.%d.%d ",clientip&255,(clientip>>8)&255, (clientip>>16)&255,(clientip>>24)&255);
-
printf("\nClient port : %d\n",ntohs(clientAddr.sin_port));
-
-
-
iSndLength = iRevLength;
-
for(i=0;i<iRevLength;i++)
-
{
-
acSndBuf[i]=acRevBuf[i];
-
}
-
sendto(sock,acSndBuf,iSndLength,0,(struct sockaddr *)&clientAddr,sizeof(clientAddr));
-
for(i=0;i<iRevLength;i++)
-
{
-
printf("%02x ",(BYTE)acRevBuf[i]);
-
if(i%16==15)
-
printf("\r\n");
-
}
-
}
-
}
-
close (sock);
-
}
Makefile就比较容易了,因为只有一个文件。
-
all:
-
gcc UDP.c -o Server_UDP
-
clean:
-
rm -rf *.o Server_UDP
嵌入式端的makefile
-
all:
-
arm-none-linux-gnueabi-gcc UDP.c -o Server_UDP
-
clean:
-
rm -rf *.o Server_UDP
编译方法:直接# make
生所可执行程序,如果放到嵌入式的板子上运行,需要设置一下执行权限
# chmod 777 Server_UDP
# ./Server_UDP //即可运行。
然后就可以用网络助手连接板子,进行测试了,这里只是实现了数据收发,如果接收不成功,注意UDP的端口,要设置正确。因为UDP不是面向连接的,服务器在不在,都一样可以发送出去,但是,只有端口正确,才能正确的接收到并返回。
阅读(2845) | 评论(0) | 转发(0) |