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

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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangsz_sh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值