linux网络编程-udp通信(二)

我们直接进入函数,由于网站编辑器不太好,所以会有点乱

这是一个udp server ,注意udpserver使用到的函数

/*******************************************************************************
* function name : main
* description   : main function for control_engine
* param[in]     : none
* param[out]    : none
* return        : 0-success,-1-fail
*******************************************************************************/
s32 main (int argc, char ** argv)
{

    int listenfd=-1;
    int connfd;
    s32 num_bytes = 0 ;
    u8 ret=0;
    u8 i;
    fd_set rfds;    
    u8 msg_buf[1024];
    u8  loca_id;
    struct timeval tm;//定义时间结构体,用于延时
    struct sockaddr_in servaddr;
    struct sockaddr_in client;
    struct sockaddr_in server;
    int socketfd_local = -1;
    socklen_t client_len = sizeof(struct sockaddr);

   socketfd_local= socket_init(&loca_id);
    printf("socketfd_local  value %d   loca_id : %d  \n",socketfd_local,loca_id);
    bzero (&server, sizeof (struct sockaddr));//清空socket的结构体
    server.sin_port = htons (5013);//这里用做服务器 监听5013这个端口
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;//使用任意网卡的ip地址,在这里如果有有线网卡和无线网卡 都可以配置 

    if (bind (socketfd_local, (struct sockaddr *) &server, sizeof (struct sockaddr_in)) == -1){//绑定上边设置的参数
         printf("fail  bind \n");
   }
   else { 
       printf("success  bind \n");
   }

while(1)
{

        tm.tv_sec  = 0;
        tm.tv_usec = 500000;
        FD_ZERO(&rfds);
        FD_SET(socketfd_local,&rfds);//使用select函数进行延时 500ms
     ret = select(socketfd_local+1,&rfds,NULL,NULL,&tm);//socketfd要加1 是因为 select的函数不识别0
        if(ret==0){
                printf( "ret:%d\n",ret) ;   
                continue;               

        }if(ret<0){
                printf( "select error") ;   

        }

            if(FD_ISSET(socketfd_local,&rfds)) {//检查是否存在

                printf( "FD_ISSET ok \n") ; 

                if (0 <  (num_bytes = recvfrom (socketfd_local, msg_buf, 1024, 0, \   // udp使用这个函数读取接收数据
                        (struct sockaddr *) &client, &client_len))){
                            printf("  recvfrom %d \n",num_bytes);
                    if (num_bytes < 0 && (errno == EINTR || errno == EWOULDBLOCK || errno == EINPROGRESS)){
                        printf("  recvfrom %d error  \n",num_bytes);
                        continue;
                    }
                    for(i=0;i<10;i++){

                    printf("msg_buf[%d]:%x  bind \n",i,msg_buf[i]);
                    }

                }

            }

}

}

u8   socket_init(u8 *loc_id )
{
 s32 socket_id = 0 ;
 s32 i = 0 ;
 u8 ret;
    int on = 1;
 int  opts = 0 ;

 printf("creat  socket_init    \n");
 if ((socket_id = socket (AF_INET, SOCK_DGRAM, 0)) == -1){//创建一个socket函数
  printf("creat  fail   socket \n");
 return (-1);
 }else {
  printf("creat  ok   socket \n");

 }
 opts = fcntl(socket_id,F_GETFL);
    if (opts < 0 ){
          printf("opts  value error     \n");
 return (-1);
    }else {

 printf("opts  value %d     \n",opts);
 }

    opts  =  opts | O_NONBLOCK;
    if (fcntl(socket_id,F_SETFL,opts) < 0 ){
        printf("fcntl set fl failed\n" );
 return (-1);
    }else {
 printf("fcntl set fl ok\n" );
 }

 unsigned char  service_type = 0xe0 | IPTOS_LOWDELAY|IPTOS_RELIABILITY;
 if(setsockopt(socket_id, SOL_IP/*IPPROTO_IP*/, IP_TOS, (void *)&service_type, sizeof(service_type)) < 0)
 perror("[app_task_spawn]setsockopt(IP_TOS) failed:");

 on = 1;
 *loc_id = socket_id;
 printf("socket_id  value %d     \n",socket_id);
 // *socket_idv =socket_id;
 ret = setsockopt( socket_id, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );
         return    socket_id;
 } 
        

头文件


/* OS Specific Headers */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <sys/stat.h>
/*Socket*/
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <linux/ip.h>
#include <sys/un.h>
#include <fcntl.h>


sitemap