Problem in doing RAW SOCKET Programming
The
HyperNews
Linux KHG
Discussion Pages
Problem in doing RAW SOCKET ProgrammingForum: The Linux Kernel Hackers' GuideKeywords: Client server program using Raw sockets.Date: Wed, 30 Apr 1997 15:39:27 GMTFrom: anjali sharma <asharm@acadcomp.cmp.ilstu.edu>I have to write a client server program using raw socket. I have written the code for client as well as server but when ever I run it my server hangs up. So I have to reboot the server. I think there is problem with my send and receive. I am sending the code for server. Hope you would be able to help me.@@@@@@@@@@@@@@@@@@@@@@@ code @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#include <stdio.h>#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>#include <netinet/ip.h>
#include <netinet/ip_icmp.h>u_short portbase = 0;
long time();#define qlen 6
#define protocol "raw"
#ifdef REALLY_RAW
#define FIX(x) htons(x)
#else
#define FIX(x) (x)
#endifmain(int argc, char **argv)
{
int msock, ssock;
int alen;
char buf[] = "asdfgh";
char recv_buffer[20];
struct servent *pse;
struct protoent *ppe;
struct sockaddr_in dst;
struct hostent *hp;
struct ip *ip = (struct ip *)buf;
struct icmp *icmp = (struct icmp *)(ip +1); int s, type, dstL;
int q, bind1, lis;
int sockopt;
int on = 1, address;
int offset;
int sendbuff;
int n;
bzero((char *)&dst, sizeof(dst));
dst.sin_family = AF_INET; dst.sin_port = 6000;
ppe = getprotobyname("raw"); setbuf(stdout,NULL);
s = socket(AF_INET, SOCK_RAW, 0);
printf("\n%d value of s in servsock",s);
if (s < 0)
printf("\nCann't creat socket"); setbuf(stdout,NULL); sockopt = setsockopt(s, 0, IP_HDRINCL, &on, sizeof(on));
printf("\n%d value of sockopt", sockopt);
if (sockopt < 0)
exit(0); if(( hp = gethostbyname(argv[1])) == NULL){
if(ip->ip_dst.s_addr = inet_addr(argv[1]) == -1)
printf("\nERROR: UNKNOWN HOST");
}
else
bcopy(hp->h_addr_list[0], &ip->ip_dst.s_addr, hp->h_length);
printf("\nSending to %s\n", inet_ntoa(ip->ip_dst)); ip->ip_v = 4;
fflush(stdin);
ip->ip_hl = sizeof *ip >> 2;
ip>ip_tos = 0;
ip->ip_len = sizeof buf;
ip->ip_id = htons(4321);
ip->ip_off = 0;
ip->ip_ttl = 255;
ip->ip_p = 1;
ip->ip_sum = 0;
ip->ip_src.s_addr = 0;
dst.sin_addr = ip->ip_dst;
dst.sin_family = AF_INET; icmp->icmp_type = ICMP_ECHO;
icmp->icmp_code = 0;
sendbuff = sendto(s, buf, sizeof buf, 0, (struct sockaddr *) &dst, sizeof dst);
if(sendbuff < 0)
printf(" ERROR sending ");
if ( sendbuff != sizeof buf)
printf("ERROR packet size");
printf("\n buf is %s value of send is %d ", buf, sendbuff); dstL = sizeof dst;
n = recvfrom(s, recv_buffer, sizeof(recv_buffer), 0,
(struct sockaddr *) &dst,&dstL);printf("recv buffer is%s value of n is %d\n", recv_buffer,n);
close(s);
exit(0);
}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
to: "Problem in doing RAW SOCKET Programming"
Wyszukiwarka
Podobne podstrony:
p (61) action=produkty wyswietl&todo=koszyk&produkt=61&key=618Dz U 03 61 552 sposób oznakowania miejsc służących do przechowywania lub zawierających substancjlistscript fcgi id=61IZ IP 61 cmd=kom jedno,61&serwis=6Finanse Rynek finansowy publiczny obrót papierami wartościowymi (str 61)61 (19)Mazowieckie Studia Humanistyczne r2001 t7 n2 s51 61więcej podobnych podstron