PF_PACKET的数据包传递限制与定时器使用

1. sock = socket(PF_PACKET, SOCK_RAW, MYTYPE);

 MsgLen = recvfrom(sock, pszBuffer, sizeof(pszBuffer), 0, (struct sockaddr *)(0), (socklen_t *)(0));

 sendto(sock, (void *)packet, sendlen, 0, (struct sockaddr *)(0), (socklen_t) (0));

 通过此socket收发时,由于是直接往链路层的发送队列传递数据包,所以不会对原数据包进行分片,发送的最大长度不能超过MTU值。

 调试方法直接打印errno的值;

 通过添加头文件:netdb.h,调用gai_strerror(ret)和strerror(errno), 可以把具体错误打印出来。

 

2.超好用定时器timer_create与timer_settime(非阻塞)

 {

  struct sigevent evp;

  struct itimerspec ts;

  timer_t timer;

  int ret;

  evp.sigev_value.sival_ptr = &timer;

  evp.sigev_notify = SIGEV_SIGNAL;

  evp.sigev_signo = SIGUSR1;

  ret = timer_create(CLOCK_REALTIME, &evp, &timer);

  if(ret)

    perror("timer_create");

  ts.it_interval.tv_sec =1;

  ts.it_interval.tv_nsec = 0;

  ts.it_value.tv_sec = 3;

  ts.it_value.tv_nsec = 0;

  ret = timer_settime(time, 0, &ts, NULL);

  if(ret)

    perror("timer_settime");

  while(1);

 }

  

posted @ 2016-12-06 20:06  zgza123456  阅读(274)  评论(0)    收藏  举报