【发布时间】:2013-01-28 01:10:18
【问题描述】:
我正在学习 RAW 套接字。在下面的代码中,我试图打印所有 ICMP 数据包头信息。看起来代码中有一些错误。任何人都可以请帮助我哪里错了。
# include <unistd.h>
# include <sys/socket.h>
# include <sys/types.h>
# include <string.h>
# include <netinet/in.h>
# include <stdio.h>
# include<stdlib.h>
main(){
int sockfd,retval,n;
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr;
char buf[10000];
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (sockfd < 0){
perror("sock:");
exit(1);
}
clilen = sizeof(struct sockaddr_in);
while(1){
printf(" before recvfrom\n");
n=recvfrom(sockfd,buf,10000,0,(struct sockaddr *)&cliaddr,&clilen);
printf(" rec'd %d bytes\n",n);
buf[n]='\0';
printf(" msg from client = %s\n",buf);
}
}
o/p
before recvfrom
rec'd 60 bytes
msg from client = E
before recvfrom
rec'd 52 bytes
【问题讨论】:
-
您正在打印
buf和%s可能是您在 60 个字节内得到一些空字符串。你从客户那里寄来了什么?我可以在这里找到错误 -
@GrijeshChauhan 我只是通过 ping 到 eth0 来生成一些 ICMP 消息。
标签: c linux sockets raw-sockets