- 论坛徽章:
- 1
|
本帖最后由 jonas_mao 于 2013-07-18 16:58 编辑
代码是测试管理口eth0环回收发包的,
设置eth0为环回模式后, 然后通过sendto发1000个报文, 查看收到的结果,
根据代码收到的结果是第一个报文始终收不到, 后续还会丢一两个.
PS:请问这个是什么, (UDP是不可靠传输, 但有些设备上试过是可以全部接收到的)-
- if(-1 == fcntl(fd, F_SETFL, O_NONBLOCK))
- {
- close(fd);
- printf("fcntl socket set error!\n");
- return ETHER_PHYLOOPBACK_ERROR;
- }
- memset(&addr, 0, sizeof(addr));
- addr.sll_family = AF_PACKET;
- addr.sll_ifindex = if_index;
- addr.sll_protocol = htons(ETH_P_IP);
- addr.sll_halen = 6;
- memcpy( addr.sll_addr, sa_mac, addr.sll_halen ); //sa_mac是一个两层广播地址
- for(i = 0; i < packetnum; i++) {
-
- if (sendto(fd, buf, sizeof(buf), 0, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
- close(fd);
- return ETHER_PHYLOOPBACK_ERROR;
- }
- usleep(10000);
- /*receive packet*/
- while(k--){
- FD_ZERO(&fdset);
- FD_SET(fd, &fdset);
- tm.tv_sec = 4;
- tm.tv_usec = 0;
- if (select(fd + 1, &fdset, (fd_set *) NULL, (fd_set *) NULL, &tm) <= 0) {
- close(fd);
- printf("select failed\n");
- return ETHER_PHYLOOPBACK_ERROR;
- }
- else if (FD_ISSET(fd, &fdset)) {
- memset(recv_buf, 0, sizeof(recv_buf));
-
- if ((ret = recvfrom(fd, recv_buf, sizeof(recv_buf), 0, NULL, NULL)) < 0) {
- close(fd);
- printf("recv failed, ret = %d\n", ret);
- return ETHER_PHYLOOPBACK_ERROR;
- }
-
- if (strcmp(buf, recv_buf) == 0) {
- break;
- }
- }
- }
-
- if(k < 0)
- {
- printf("recv a unexcept packet %d\n", i+1);
- fflush(stdout);
- }
- k = 200;
- usleep(10000);
- }
复制代码 |
|