Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int wait_snd(int sock)
- {
- fd_set RD, WR, EXP;
- struct timespec ts;
- int R;
- FD_ZERO(&RD);
- FD_ZERO(&WR);
- FD_ZERO(&EXP);
- FD_SET(sock, &WR);
- ts.tv_sec = 0;
- ts.tv_nsec = 100;
- reselect:
- R = select(sock+1, NULL, &WR, NULL, NULL);
- switch (R)
- {
- case 0:
- case 1:
- return R;
- case -1:
- default:
- switch(errno)
- {
- case EINTR:
- goto reselect;
- default:
- return -errno;
- }
- }
- }
- int main()
- {
- ...
- clock_gettime(CLOCK_MONOTONIC, &ts_a);
- _sendto:
- if (wait_snd(sockfd) != 1)
- goto _sendto;
- ret = sendto(sockfd, buf, fsize, 0, (struct sockaddr *)&sockaddr, sizeof(struct sockaddr_ll));
- if (ret < 0) {
- if (errno == ENOBUFS)
- {
- printf("ENOBUFS catched\n");
- printf("Retrrying a packet...\n");
- goto _sendto;
- }
- if (errno == EAGAIN)
- {
- printf("EAGAIN catched\n");
- printf("Retrrying a packet...\n");
- goto _sendto;
- }
- fprintf(stderr, "sendto %s (%d): %s (%d)\n", ifmac2name(sockaddr.sll_addr, mactable), fsize, strerror(errno), errno);
- goto _sendto;
- }
- clock_gettime(CLOCK_MONOTONIC, &ts_b);
- if (ret != fsize)
- printf("%d\n", ret), exit(0);
- snd_bytes += ret;
- snd_nsec += ((ts_b.tv_nsec < ts_a.tv_nsec) ? ((NSECS_IN_SEC - ts_a.tv_nsec) + ts_b.tv_nsec) : (ts_b.tv_nsec - ts_a.tv_nsec));
- ...
- }
Add Comment
Please, Sign In to add comment