i just got into winsock learning and i found this example but problem it doesnt compile using msv6
i get this errorsCode:/* * whois.c * * (c) Feb 2000 by Gandalf * */ #include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> #include <winsock.h> #define WIN32_LEAN_AND_MEAN /* define win 32 only */ void handle_error(void); /* Error handler routine */ void write_file(char *buf); /* Write details to log file */ int main (int argc, char **argv) { WORD wVersionRequested; /* socket dll version info */ WSADATA wsaData; /* data for socket lib initialisation */ SOCKET sock; /* socket details */ const int BUF_LEN=10000; /* Buffer size for transfers */ struct sockaddr_in address; /* socket address stuff */ struct hostent * host; /* host stuff */ int err; /* error trapping */ float socklib_ver; /* socket dll version */ char File_Buf[BUF_LEN]; /* file buffer */ char DomainName[100]; /* domain name from user */ char HostName[100]; /* host name from user */ time_t now; /* for date and time */ if (argc < 2) /* check we have command line options */ { printf("\nUseage: whois domainname [whois.server]\n"); exit(0); } strcat(DomainName, argv[1]); /* get domain name from command line */ strcat(DomainName, "\r\n"); /* add crlf as whois servers expect it */ if (argc == 3) strcat(HostName, argv[2]); /* get host name from command line */ else strcat(HostName, "whois.internic.net"); wVersionRequested = MAKEWORD( 1, 1 ); /* * We need to call the WSAStartup routine BEFORE we try to use any of * the Winsock dll calls. */ if ( WSAStartup( wVersionRequested, &wsaData ) != 0 ) handle_error(); /* Check socket DLL supports 1.1 or higher */ socklib_ver = HIBYTE( wsaData.wVersion ) / 10.0; socklib_ver += LOBYTE( wsaData.wVersion ); if ( socklib_ver < 1.1 ) { printf ("\nError: socket library must support 1.1 or greater.\n"); WSACleanup(); /* clean up before exit */ exit(0); } /* write current date and time to log file and screen */ time(&now); sprintf(File_Buf, "Whois Session Started %.24s.\n\n", ctime(&now)); write_file(File_Buf); /* * Open a socket. The AF_INET parameter tells windows we want to use the * internet. Other parameters for different networking can be chosen e.g. * for netbios, IPX etc. The SOCK_STREAM parameter lets windows know we want * to use TCP rather than UDP, and the final parameter will always be * zero for what we want to do and tells windows to use whatever * default communication protocol has been established (eg PPP and IP) */ if ( (sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET ) handle_error(); /* We now need to initialise a couple of variables in the address * structure. Once again, to tell windows we are using the internet, * and also what port we want to use when connecting to a remote * computer. In this case it is port 43 which is the standard port for * whois. The htons routine is used to convert the way Intel chips * store data in memory, which is different compared to many other computers. * The standard is based on Motorola format. */ address.sin_family=AF_INET; /* internet */ address.sin_port = htons(43); /* port 43 for whois */ /* write to the log file and screen */ sprintf(File_Buf,"Connecting to %s\n", HostName); write_file(File_Buf); /* * host is a pointer to a structure of the predefined type hostent. We * need to call gethostbyname with the DNS name we want to use to return * a pointer to a hostent structure. This is so we can resolve an IP * address from our ISP's nameserver. */ if ( (host=gethostbyname(HostName)) == NULL ) handle_error(); /* we then initialise the address structure with the resolved IP address */ address.sin_addr.s_addr=*((unsigned long *) host->h_addr); /* Now we're ready to actually connect to the whois server itself */ if ( (connect(sock,(struct sockaddr *) &address, sizeof(address))) != 0) handle_error(); /* * We should be connected to the whois server at this point * so we need to send the domain name and wait for the response. The send * and recv routines are always used with TCP. These enable handshaking * compared to the sendto and recvfrom routines which are used for UDP * protocol, ie without handshaking. */ strcpy(File_Buf, DomainName); err=send(sock,File_Buf,strlen(File_Buf),0); /* send domain name */ err=recv(sock,File_Buf,BUF_LEN,0); /* discard first response */ err=recv(sock,File_Buf,BUF_LEN,0); /* get query results back */ write_file(File_Buf); /* Always call WSACleanup before exiting */ WSACleanup(); /* clean up before exit */ exit(0); } void handle_error(void) { /* * Errors are handled by calling the WSAGetLastError routine which * will return the last error as one of the following. As we develop * this tutorial, we will go into much more detail on what they mean * and what caused them. */ switch ( WSAGetLastError() ) { case WSANOTINITIALISED : printf("Unable to initialise socket.\n"); break; case WSAEAFNOSUPPORT : printf("The specified address family is not supported.\n"); break; case WSAEADDRNOTAVAIL : printf("Specified address is not available from the local machine.\n"); break; case WSAECONNREFUSED : printf("The attempt to connect was forcefully rejected.\n"); break; case WSAEDESTADDRREQ : printf("address destination address is required.\n"); break; case WSAEFAULT : printf("The namelen argument is incorrect.\n"); break; case WSAEINVAL : printf("The socket is not already bound to an address.\n"); break; case WSAEISCONN : printf("The socket is already connected.\n"); break; case WSAEADDRINUSE : printf("The specified address is already in use.\n"); break; case WSAEMFILE : printf("No more file descriptors are available.\n"); break; case WSAENOBUFS : printf("No buffer space available. The socket cannot be created.\n"); break; case WSAEPROTONOSUPPORT : printf("The specified protocol is not supported.\n"); break; case WSAEPROTOTYPE : printf("The specified protocol is the wrong type for this socket.\n"); break; case WSAENETUNREACH : printf("The network can't be reached from this host at this time.\n"); break; case WSAENOTSOCK : printf("The descriptor is not a socket.\n"); break; case WSAETIMEDOUT : printf("Attempt timed out without establishing a connection.\n"); break; case WSAESOCKTNOSUPPORT : printf("Socket type is not supported in this address family.\n"); break; case WSAENETDOWN : printf("Network subsystem failure.\n"); break; case WSAHOST_NOT_FOUND : printf("Authoritative Answer Host not found.\n"); break; case WSATRY_AGAIN : printf("Non-Authoritative Host not found or SERVERFAIL.\n"); break; case WSANO_RECOVERY : printf("Non recoverable errors, FORMERR, REFUSED, NOTIMP.\n"); break; case WSANO_DATA : printf("Valid name, no data record of requested type.\n"); break; case WSAEINPROGRESS : printf("address blocking Windows Sockets operation is in progress.\n"); break; case WSAEINTR : printf("The (blocking) call was canceled via WSACancelBlockingCall().\n"); break; default : printf("Unknown error.\n"); break; } WSACleanup(); exit(0); } void write_file(char *buf) { /* writes results to a log file and also to the screen */ FILE *fp=fopen("whoislog.txt","a+"); fprintf(fp,"%s\n",buf); fclose(fp); printf("%s\n",buf); }
d:\all pro program you did\network learning\winsock part1\main.c(31) : error C2057: expected constant expression
d:\all pro program you did\network learning\winsock part1\main.c(31) : error C2466: cannot allocate an array of constant size 0
d:\all pro program you did\network learning\winsock part1\main.c(31) : error C2133: 'File_Buf' : unknown size
even though the size
is specified here const int BUF_LEN=10000;



LinkBack URL
About LinkBacks



