hello, I'm using recvfrom, and upon return it should fill in from argument with sockaddr_in data structure. from ip(7) man page I get that it has format of : struct sockaddr_in { sa_family_t sin_family; /* address family: AF_INET */ u_int16_t sin_port; /* port in network byte order*/ struct in_addr sin_addr; /* internet address */ }; for PF_INET type of socket. Now if I run the program the, data in the from field comes out as: 2 0 0 0 192 168 1 4 61 63 140 200 85 214 2 | | | AF_INET :2 IP :192.168.1.4 and as show in above example and other repeated test, the port part is always set to 0. Shouldn't that be set to port number? on similar token the "padding" part after the IP is always set to the same pattern. Shouldn't it rather be zeroed, or be some random data? I have attached a simple program I used for generating those results. -- Adam http://www.eax.com The Supreme Headquarters of the 32 bit registers
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <stdlib.h> #include <ctype.h> int main (int argc, char **argv) { size_t buflen = 1024; char buf[buflen]; struct sockaddr_in from; socklen_t fromlen = sizeof(struct sockaddr_in); int flags; int rawsock; int bytesread; int i; unsigned char * ptr; rawsock = socket(PF_INET,SOCK_RAW,IPPROTO_TCP); if (rawsock == -1) perror("socket():"); flags = MSG_WAITALL; memset(&from,0,fromlen); bytesread = recvfrom(rawsock,&buf,buflen,flags, (struct sockaddr*)(&from),&fromlen); ptr = (unsigned char*)&from; for(i=0;i<fromlen;i++) { printf("%i ",*ptr); ptr++; } printf("\n"); if (bytesread == -1) { printf("err # : %i \n",errno); perror("recvfrom():"); return -1; } if (argc ==2) { struct hostent *host; printf("msg len: %i \n",bytesread); printf("frm len: %i \n",fromlen); printf("IPv4 : type:%i port:%X addr:%X \n", from.sin_family, ntohs(from.sin_port), from.sin_addr.s_addr); host=gethostbyaddr(&(from.sin_addr.s_addr), fromlen,from.sin_family); if (host == NULL ) { printf("err # : %i \n",h_errno); herror("gethostbyaddr():"); } printf("host: ("); ptr = (unsigned char*)(&(from.sin_addr.s_addr)); for(i=0;i<4;i++) { printf("%i",*(ptr++)); if (i<3) printf("."); } if (host == NULL) printf(") \n"); else printf(") %s \n",host->h_name); } return 0; }