嵌入式Linux UDP通信:服务端程序

来源:互联网 发布:礼品定制 知乎 编辑:程序博客网 时间:2024/05/29 16:37
        其实嵌入式的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_PORT888typedef unsigned char BYTE;void UdpServer();main(int argc,char *argv[]){UdpServer();}/*************************************************************** * 函数名: UdpServer() * 描述  : UDP 服务器程序:接收到客户端的UDP连接, *打印接收到的数据。 * 参数  : NO * 返回  : NO ***************************************************************/void UdpServer (){unsigned int i=0;intsock = 0;          //socket fd'sstruct sockaddr_inserverAddr;       // server's addressstruct sockaddr_in clientAddr;      // client's addressintsockAddrSize=0;characRevBuf[512];      //接收数据缓冲区intiRevLength = 0;          //接收数据长度characSndBuf[512];      //接收数据缓冲区intiSndLength = 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_UDPclean:rm -rf *.o Server_UDP



嵌入式的Makefile:


all:arm-none-linux-gnueabi-gcc UDP.c -o Server_UDPclean:rm -rf *.o Server_UDP


        编译方法:直接# make
生所可执行程序,如果放到嵌入式的板子上运行,需要设置一下执行权限
# chmod 777 Server_UDP
# ./Server_UDP    //即可运行。

        然后就可以用网络助手连接板子,进行测试了,这里只是实现了数据收发,如果接收不成功,注意UDP的端口,要设置正确。因为UDP不是面向连接的,服务器在不在,都一样可以发送出去,但是,只有端口正确,才能正确的接收到并返回。






0 0
原创粉丝点击