[완료]리눅스 C소켓 프로그래밍 좀 도와주세요~
글쓴이: damedykim / 작성시간: 화, 2012/06/12 - 1:37오후
리눅스 RAW소켓프로그래밍 질문인데요. 리눅스 아파치? 서버에서 관리자권한으로 컴파일해서 실행시켰는데 protocol not suported라고 에러가 뜨더라구요. ㅜㅜ
소스코드는 제가 대충 이렇게 짜봣는데 소스코드에 이상이 있는 건가요? 어떤게 문제인지 좀 알려주세요. ㅜㅜ
#include <stdlib.h>
#include <string.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <arpa/inet.h>
#include <errno.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
int in_cksum(u_short *p, int n);
int main(int argc, char **argv)
{
int icmp_socket,ip_socket,i;
int ret;
struct icmp *p, *rp;
struct sockaddr_in addr, from;
struct ip *ip, *rip;
struct iphdr *iph;
char buffer[1024];
char buf[1024];
int sl;
int hlen;
ip_socket = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
if(ip_socket < 0)
{
perror("socket error : ");
exit(0);
}
memset(buf, 0x00, 1024);
const int on = 1;
if(setsockopt(ip_socket,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on))<0){
perror("socket error : ");
exit(0);
}
iph = (struct iphdr *)buf;
iph->saddr = inet_addr(argv[1]);
iph->daddr = inet_addr(argv[1]);
// ICMP에대응하는 RAW 소켓을 생성한다.
icmp_socket = ip_socket;
if(icmp_socket < 0)
{
perror("socket error : ");
exit(0);
}
memset(buffer, 0x00, 1024);
// icmp 패킷을 만든다.
p = (struct icmp *)buffer;
p->icmp_type = ICMP_ECHO;
p->icmp_code = 0;
p->icmp_cksum = 0;
p->icmp_seq = 15;
p->icmp_id = getpid();
p->icmp_cksum = in_cksum((u_short *)p, 1000);
memset(&addr, 0, sizeof(addr));
addr.sin_addr.s_addr = inet_addr(argv[1]);
//addr.sin_addr.d_addr = inet_addr(argv[1]);
addr.sin_family = AF_INET;
// icmp 패킷을 상대 호스트로 전송한다.
for(i=0; i<1000; i++) {
ret = sendto(icmp_socket,p,sizeof(*p), 0, (struct sockaddr *)&addr, sizeof(addr));
if (ret< 0)
{
perror("sendto error : ");
exit(0);
}
}
// 상대 호스트로 부터 icmp 응답을 기다린다.
sl = sizeof(from);
ret = recvfrom(icmp_socket,buffer, 1024, 0, (struct sockaddr *)&from, &sl);
if (ret < 0)
{
//printf("%d %d %d\n", ret, errno, EAGAIN);
perror("recvfrom error : ");
exit(0);
}
// 응답을 받았다면
// 해당 호스트의 IP정보와
// icmp 패킷 정보를 출력한다.
ip = (struct ip *)buffer;
hlen = ip->ip_hl*4;
rp = (struct icmp *)(buffer+hlen);
printf("reply from %s\n", inet_ntoa(from.sin_addr));
printf("Type : %d \n", rp->icmp_type);
printf("Code : %d \n", rp->icmp_code);
printf("Seq : %d \n", rp->icmp_seq);
printf("Iden : %d \n", rp->icmp_id);
return 1;
}
int in_cksum( u_short *p, int n )
{
register u_short answer;
register long sum = 0;
u_short odd_byte = 0;
while( n > 1 )
{
sum += *p++;
n -= 2;
}
if( n == 1 )
{
*( u_char* )( &odd_byte ) = *( u_char* )p;
sum += odd_byte;
}
sum = ( sum >> 16 ) + ( sum & 0xffff );
sum += ( sum >> 16 );
answer = ~sum;
return ( answer );
}Forums:


어느 함수에서 에러가 나는 건가요?
어느 함수에서 에러가 나는 건가요?
아 확인을 이제 했네요 해결했습니다~^^
답변해 주셔서 감사합니다. 이렇게 저렇게 하다 해결 했네요^__^
댓글 달기