linux下基于udp的简单的接收与发送程序,开发板与本机接收与发送信息

UDP接受与发送程序的源码!

 

#include <sys/socket.h> 

#include <sys/types.h> 

#include <netinet/in.h>

#include <sys/socket.h> 
 
#include <sys/types.h> 
 
#include <netinet/in.h> 
 
#include <unistd.h> 
 
#include <fcntl.h> 
#include <string.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <assert.h>//设定插入点
#include <ctype.h>//字符处理
#include <errno.h>//定义错误码
#include <float.h>//浮点数处理
#include <limits.h>//定义各种数据类型最值常量
#include <locale.h>//定义本地化函数
#include <math.h>//定义数学函数
#include <stdio.h>//定义输入/输出函数
#include <stdlib.h>//定义杂项函数及内存分配函数
#include <time.h>//定义关于时间的函数
#include <wchar.h>//宽字符处理及输入/输出
#include <wctype.h>

#include <libxml/parser.h>

#include <libxml/tree.h>           
 
 
 
int create_udp_socket(char *ip, int port){ 
 
    int onOff = 1; 
 
    struct sockaddr_in  addr;
 
 memset(&addr,0,sizeof(addr));
 
    addr.sin_family = AF_INET; 
 
    addr.sin_addr.s_addr = inet_addr(ip); 
 
    //addr.sin_addr.s_addr = htonl(INADDR_ANY); 
 
    addr.sin_port = htons(port); 
 
 
 
    int sockfd; 
 
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) { 
 
        return(-1); 
 
    } 
 
 
 
    //fcntl(sockfd, F_SETFD, FD_CLOEXEC); 
 
 
 
    //setsockopt(sockfd,SOL_SOCKET, SO_REUSEADDR, (const void *)&onOff, sizeof(onOff)); 
 
    if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) { 
 
        close(sockfd); 
 
        return(-1); 
 
    } 
 
    return sockfd; 
 

 
 
 
void listen_udp(int socket){ 
 
    socklen_t sin_len; 
 
    char msg_buffer[1024*512]; 
 
    struct sockaddr_in sin; 
 
    sin_len=sizeof(sin); 
 
    fd_set rfds; 
 
    struct timeval tv; 
 
    int retval; 
 
    int rlen = 0; 
 
    int socket_descriptor; 
 
    socket_descriptor = socket; 
 
 
 
    while(1){ 
 
        FD_ZERO(&rfds); 
 
        FD_SET(socket_descriptor, &rfds); 
 
        tv.tv_sec = 4; 
 
        tv.tv_usec = 0; 
  printf("before,select\n");
 
        retval = select(socket_descriptor+1, &rfds, NULL, NULL, &tv); 
 
 
 
        if (retval == -1){ 
 
            printf("select error %d %s\n",socket_descriptor,strerror(errno)); 
 
            break; 
 
        } 
 
        else if (retval){ 
 
            memset(msg_buffer, 0, 1024*512); 
 
            if(FD_ISSET(socket_descriptor, &rfds)){ 
    printf("!!!!!!\n");
 
            rlen = recvfrom(socket_descriptor, msg_buffer, 1024*512, 0, (struct sockaddr *)&sin, &sin_len); 
 
                if(rlen > 0){ 
 
                    printf("recv %s \n", msg_buffer); 
 
                } 
 
                else{ 
 
                    printf("rlen : %d\n", rlen); 
 
                } 
 
            } 
 
        } 
 
    } 
 
    close(socket_descriptor);    
 

int send_message_to_player(  const char* ip_address, const unsigned int port, char *info ) 


 
    struct sockaddr_in servaddr; 
 
    int sockfd; 
 
 printf("send_message_to_player 1: %s\n",ip_address);
 
    if (!ip_address) { 
  
        return 1; 
  
    } 
 
 
 
 printf("send_message_to_player 2\n");
    sockfd = socket(AF_INET,SOCK_DGRAM, 0); 
 
    if (sockfd < 0) { 
  
        printf("error opening socket"); 
  
        return 1; 
  
    } 
 
 
 printf("send_message_to_player 3\n");
 
    memset(&servaddr, 0, sizeof(servaddr)); 
 
    servaddr.sin_family = AF_INET; 
 
    servaddr.sin_addr.s_addr = inet_addr(ip_address); 
 
    servaddr.sin_port=htons(port); 
 
 printf("send_message_to_player 4\n");
    sendto(sockfd, info, strlen(info), 0, 
  
  (struct sockaddr *)&servaddr, sizeof(servaddr)); 
 
    sendto(sockfd, info, strlen(info), 0, 
  
  (struct sockaddr *)&servaddr, sizeof(servaddr)); 
 
    sendto(sockfd, info, strlen(info), 0, 
  
  (struct sockaddr *)&servaddr, sizeof(servaddr)); 
    sendto(sockfd, info, strlen(info), 0, 
  
  (struct sockaddr *)&servaddr, sizeof(servaddr)); 
 printf("send_message_to_player 5\n");
 
    close(sockfd);
    
  return 0; 
 

 

int main(int argc,char *argv[])

{
 int socket;

 const char* ip_address;

 printf("before create_udp_socket\n");

 socket = create_udp_socket("0.0.0.0",1000);

 printf("after create_udp_socket\n");

 if (argc<=1)
 {
  listen_udp(socket);
 }
 

 printf("after listen_udp\n");
 
 if(argc=2)
 {
  char buf[]="<info title=\"test\"><status>1</status><message>12345</message><info>"; 
  
  
  printf("to 172.168.110.34\n");

  printf("%s\n",argv[0]);

  printf("%s\n",argv[1]);

  ip_address=argv[1];
  
        send_message_to_player(ip_address,1000,buf);
 }
 
 return 0;
 
}
在建立makefile文件

makefile-x86

CXX =g++
LIN-DIR=/root/czy/test-c2/test-x86/libxml/libxml2-2.9.0/include
test-x86:receive.cpp
 $(CXX) -I$(LIN-DIR) receive.cpp -o test-x86

makefile-c2

CXX = c2-linux-g++
LIN-DIR=/root/czy/test-c2/test-x86/libxml/libxml2-2.9.0/include
test-c2:receive.cpp
 $(CXX) -I$(LIN-DIR) receive.cpp -o test-c2

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值