我试图用C编写ICMP ping代码。
以下代码效果很好:
server {
listen 80;
server_name wagtaildev.wesgarlock.com;
client_max_body_size 10000M;
location = /favicon.ico { access_log off; log_not_found off; }
location / {
include proxy_params;
proxy_pass http://unix:/home/wesgarlock/run/wagtaildev.sock;
}
}
但是当我如下删除函数ping的参数时,编译失败。
int main(){
struct sockaddr_in addr;
hname = gethostbyname("192.168.1.5");
bzero(&addr, sizeof(addr));
addr.sin_addr.s_addr = *(long*)hname->h_addr;
ping(&addr);
}
void ping(struct sockaddr_in *addr){
sendto(sd,&pckt,sizeof(pckt),0,(struct sockaddr*)addr,sizeof(*addr))
}
错误是:int main(){
ping();
}
void ping(){
struct sockaddr_in addr;
hname = gethostbyname("192.168.1.5");
bzero(&addr, sizeof(addr));
addr.sin_addr.s_addr = *(long*)hname->h_addr;
sendto(sd,&pckt,sizeof(pckt),0,(struct sockaddr*)addr,sizeof(*addr))
}
当我在sendto()函数中删除*时,它仍然编译为错误:
error: invalid type argument of unary ‘*’ (have ‘struct sockaddr_in’)
btw,我在ping()函数中创建了struct sockaddr_in,因为我需要执行多个过程,并且需要避免多个进程共享同一结构。
答案 0 :(得分:1)
为什么拥有
struct sockaddr_in *addr
在上方的一个作为参数
但是
struct sockaddr_in addr
失败了吗?
为什么不将addr定义为结构指针?
答案 1 :(得分:1)
指向“ struct sockaddr_in addr”的指针中存在错误。我做了其他一些修复。您必须是root用户才能运行此代码。
#include <string.h>
#include <stdio.h>
#include <netdb.h>
#include <unistd.h>
void ping(char *, int);
int main(){
ping("data", 4);
}
void ping(char * pckt, int size){
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
struct hostent * hname = gethostbyname("localhost");
memcpy(&addr.sin_addr, hname->h_addr, hname->h_length);
int sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (sd >= 0) {
if (sendto(sd,&pckt,size,0,(struct sockaddr*)&addr,sizeof(addr)) > 0) {
printf("send ok\n");
} else {
printf("send error\n");
}
} else {
printf("socket error\n");
}
}