嵌入式Linux UDP通信:服务端程序
2019-07-12 16:04发布
生成海报
其实嵌入式的Linux 与PC Linux共用一套内核,实现网络通信,只是编译器不一样,运行效果一样,因为测试也比较方便,可以在PC Linux下测试好,再用交叉编译器编译成嵌入式的运行程序,放到嵌入式板子上运行。以上为实现UDP服务器端的源码,很简单,当然,嵌入式的板子需要支持网络,配置好IP等。
/*******************************************************************************
* 文件名称: socket.c
* 描 述: UDP服务端测试程序
*******************************************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#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!
");
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!
");
if (bind (sock, (struct sockaddr *)&serverAddr, sockAddrSize)== -1) //bind socket to local address
{
printf ("bind failed, errno = %d
", errno);
perror(strerror(errno));
close (sock);
return;
exit (1);
}
printf ("UDP Server Bind OK!
");
printf("Server prot : %d
",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("
Client ip : %d.%d.%d.%d ",clientip&255,(clientip>>8)&255, (clientip>>16)&255,(clientip>>24)&255);
printf("
Client port : %d
",ntohs(clientAddr.sin_port));
iSndLength = iRevLength;
for(i=0;i
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不是面向连接的,服务器在不在,都一样可以发送出去,但是,只有端口正确,才能正确的接收到并返回。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮