嵌入式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不是面向连接的,服务器在不在,都一样可以发送出去,但是,只有端口正确,才能正确的接收到并返回。