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);
}