Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带原始插座的recv_C_Sockets_Recv - Fatal编程技术网

带原始插座的recv

带原始插座的recv,c,sockets,recv,C,Sockets,Recv,我正在尝试从套接字接收原始数据包,但失败。消息仅在服务器站点上发送数据包时打印。当没有数据包被传输时——在recv中编程hungs(同步模式下的套接字) 问题是打印消息是“缓冲区”,但没有收到数据 #include <sys/socket.h> #include <linux/if_packet.h> #include <linux/if_ether.h> #include <linux/if_arp.h> #define ETH_FRAME_L

我正在尝试从套接字接收原始数据包,但失败。消息仅在服务器站点上发送数据包时打印。当没有数据包被传输时——在recv中编程hungs(同步模式下的套接字)

问题是打印消息是“缓冲区”,但没有收到数据

#include <sys/socket.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>
#include <linux/if_arp.h>

#define ETH_FRAME_LEN 1400

int main(){

    int s; /*socketdescriptor*/

    s = socket(PF_PACKET, SOCK_RAW, htons(0x88b5));
    if (s == -1) { perror("socket"); }

        struct sockaddr_ll socket_address;
    int r;
    char ifName[IFNAMSIZ] = "eth0";

    struct ifreq ifr;  
        strncpy((char *)ifr.ifr_name ,device , IFNAMSIZ); 

    /* Get the index of the interface to send on */
    memset(&if_idx, 0, sizeof(struct ifreq));
    strncpy(if_idx.ifr_name, ifName, IFNAMSIZ-1);
    if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0)
        perror("SIOCGIFINDEX");

    /* Get the MAC address of the interface to send on */   
    memset(&if_mac, 0, sizeof(struct ifreq));
    strncpy(if_mac.ifr_name, ifName, IFNAMSIZ-1);
    if (ioctl(sockfd, SIOCGIFHWADDR, &if_mac) < 0)
        perror("SIOCGIFHWADDR");

        memset(&socket_address, 0, sizeof(socket_address));
        socket_address.sll_ifindex = ifr.if_idx;
        socket_address.sll_protocol = htons(0x88b5);
        socket_address.sll_family = PF_PACKET;
        socket_address.sll_pkttype = PACKET_OUTGOING;

        r = bind(s, (struct sockaddr*)&socket_address,
                    sizeof(socket_address));
    if ( r < 0) { perror("bind")};

    void* buffer = (void*)malloc(ETH_FRAME_LEN); /*Buffer for ethernet frame*/
    int length = 0; /*length of the received frame*/ 

    length = recv(s, buffer, ETH_FRAME_LEN, 0,);
    if (length == -1) { perror("recvfrom"); }
    printf ("buffer %s\n", buffer);

}
#包括
#包括
#包括
#包括
#定义ETH_框架长度1400
int main(){
int s;/*socketdescriptor*/
s=插座(PF_数据包,插座原始,HTON(0x88b5));
如果(s==-1){perror(“socket”);}
结构sockaddr\u ll套接字地址;
INTR;
char ifName[IFNAMSIZ]=“eth0”;
结构ifreq-ifr;
strncpy((char*)ifr.ifr\u名称、设备、IFNAMSIZ);
/*获取要发送的接口的索引*/
memset(&if_idx,0,sizeof(struct ifreq));
strncpy(如果为idx.ifr\U名称、ifName、IFNAMSIZ-1);
if(ioctl(sockfd、SIOCGIFINDEX和if_idx)<0)
perror(“SIOCGIFINDEX”);
/*获取要发送的接口的MAC地址*/
memset(&if_mac,0,sizeof(struct ifreq));
strncpy(如果mac.ifr\U名称、ifName、IFNAMSIZ-1);
if(ioctl(sockfd、SIOCGIFHWADDR和if_mac)<0)
perror(“SIOCGIFHWADDR”);
memset(&socket_地址,0,sizeof(socket_地址));
socket\u address.sll\u ifindex=ifr.if\u idx;
socket_address.sll_协议=htons(0x88b5);
socket_address.sll_family=PF_数据包;
socket\u address.sll\u pkttype=数据包\u传出;
r=bind(s,(struct sockaddr*)和socket\u地址,
sizeof(套接字地址);
如果(r<0){perror(“bind”)};
void*buffer=(void*)malloc(ETH_FRAME_LEN);/*以太网帧的缓冲区*/
int length=0;/*接收帧的长度*/
长度=recv(s,缓冲器,ETH_帧长度,0,);
如果(长度==-1){perror(“recvfrom”);}
printf(“缓冲区%s\n”,缓冲区);
}

只能对C样式字符串使用
%s
格式说明符。不能将其用于任意二进制数据。它怎么知道要打印多少个字符?在名为
length
的变量中有长度。你需要打印那么多字符。例如:

for (int i = 0; i < length; ++i)
     putchar(((char *)buffer)[i]);
for(int i=0;i
这可能看起来像垃圾,因为您正在输出一堆不可打印的字符。也许你想要这样的东西:

void print(void *buf, int length)
{
      char *bp = (char *) buf;
      for (int i = 0; i < length; ++i)
          putchar( isprintf(bp[i]) ? bp[i] : '.' );
      putchar('\n');
}
void打印(void*buf,int-length)
{
char*bp=(char*)buf;
对于(int i=0;i

这将用点替换不可打印的字符。

你说得对,它无法输出不可打印的字符。非常感谢!