IOCTL.C
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:7k
源码类别:
Windows编程
开发平台:
Visual C++
- /******************************************************************************
- * ioctl.c - TCP server
- *
- * This is a part of the Microsoft Source Code Samples.
- * Copyright 1996-1997 Microsoft Corporation.
- * All rights reserved.
- * This source code is only intended as a supplement to
- * Microsoft Development Tools and/or WinHelp documentation.
- * See these sources for detailed information regarding the
- * Microsoft samples programs.
- ******************************************************************************/
- #define WIN32_LEAN_AND_MEAN
- #include <winsock2.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #define DEFAULT_PORT 5001
- int ReadAndEcho(SOCKET , char *,int ) ;
- int WriteMessage(SOCKET , char *,int ) ;
- void Usage(char *progname) {
- fprintf(stderr,"Usagen%s -e [endpoint] -i [interface]n",
- progname);
- fprintf(stderr,"Where:n");
- fprintf(stderr,"tendpoint is the port to listen onn");
- fprintf(stderr,"tinterface is the ipaddr (in dotted decimal notation)");
- fprintf(stderr," to bind ton");
- fprintf(stderr,"Defaults are 5001 and INADDR_ANYn");
- WSACleanup();
- exit(1);
- }
- int main(int argc, char **argv) {
- char Buffer[128];
- char *interface= NULL;
- unsigned short port=DEFAULT_PORT;
- int fromlen;
- int i, ioctl_opt =1;
- struct sockaddr_in local, from;
- WSADATA wsaData;
- SOCKET listen_socket, msgsock;
- fd_set readfds, writefds, exceptfds;
- /* Parse arguments */
- if (argc >1) {
- for(i=1;i <argc;i++) {
- if ( (argv[i][0] == '-') || (argv[i][0] == '/') ) {
- switch(tolower(argv[i][1])) {
- case 'i':
- interface = argv[++i];
- break;
- case 'e':
- port = atoi(argv[++i]);
- break;
- default:
- Usage(argv[0]);
- break;
- }
- }
- else
- Usage(argv[0]);
- }
- }
- if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) {
- fprintf(stderr,"WSAStartup failed with error %dn",WSAGetLastError());
- WSACleanup();
- return -1;
- }
- if (port == 0){
- Usage(argv[0]);
- }
- //
- // The fd sets should be zeroed out before using them to prevent errors.
- FD_ZERO(&readfds);
- FD_ZERO(&writefds);
- FD_ZERO(&exceptfds);
- memset(Buffer,0,sizeof(Buffer));
- local.sin_family = AF_INET;
- //
- // bind to specific interface if desired.
- local.sin_addr.s_addr = (!interface)?INADDR_ANY:inet_addr(interface);
- /*
- * Port MUST be in Network Byte Order
- */
- local.sin_port = htons(port);
- listen_socket = socket(AF_INET, SOCK_STREAM,0); // TCP socket
- if (listen_socket == INVALID_SOCKET){
- fprintf(stderr,"socket() failed with error %dn",WSAGetLastError());
- WSACleanup();
- return -1;
- }
- //
- // bind() associates a local address and port combination with the
- // socket just created.
- if (bind(listen_socket,(struct sockaddr*)&local,sizeof(local) )
- == SOCKET_ERROR) {
- fprintf(stderr,"bind() failed with error %dn",WSAGetLastError());
- WSACleanup();
- return -1;
- }
- //
- // start listening on the socket for incoming connections
- //
- if (listen(listen_socket,5) == SOCKET_ERROR) {
- fprintf(stderr,"listen() failed with error %dn",WSAGetLastError());
- WSACleanup();
- return -1;
- }
- printf("%s: Listening on port %dn",argv[0],port);
- //
- // Set the socket to non-blocking mode.
- //
- if (ioctlsocket(listen_socket,FIONBIO,&ioctl_opt) == SOCKET_ERROR) {
- fprintf(stderr,"ioctlsocket failed %dn",WSAGetLastError());
- WSACleanup();
- return -1;
- }
- //
- // The structure of the loop below is very simple. We only accept one
- // connection at a time. As soon as another client connects, we
- // disconnect the first one, and start talking to the new client.
- // All this server does is to echo the data received on the socket
- // back to the client.
- //
- // This is not a very realistic server, but it does serve to show that
- // select() does not scale very well on win32. If we were dealing
- // with more than one client, we would have to have a list of sockets
- // that are in each fdset to be able to check them when select()
- // returns.
- //
- while(1) {
- //
- // A socket in the listen() state becomes ready to read when a
- // client connects to it. An accept() will complete without
- // blocking.
- // Since select sets the sockets that are ready to be read from or
- // written to, we have to include listen_socket in the fdset each time
- // through the loop.
- //
- FD_SET(listen_socket,&readfds);
- i = select(0,&readfds,&writefds,&exceptfds,NULL);
- if (i == SOCKET_ERROR) {
- fprintf(stderr,"select failed %dn",WSAGetLastError());
- }
- if (i==0){
- fprintf(stderr,"Select returned no fds readyn");
- }
- if (FD_ISSET(listen_socket, &readfds)){
- //
- // close the previous client socket.
- // We must also clear it from the fdset to prevent select()
- // from failing.
- //
- closesocket(msgsock);
- FD_CLR(msgsock,&readfds);
- FD_CLR(msgsock,&writefds);
- fromlen = sizeof(from);
- msgsock= accept(listen_socket,(struct sockaddr*)&from,&fromlen);
- if (msgsock == INVALID_SOCKET) {
- fprintf(stderr,"accept failed %dn",WSAGetLastError());
- WSACleanup();
- return -1;
- }
- FD_SET(msgsock,&writefds);
- FD_SET(msgsock,&readfds);
- continue;
- }
- if (FD_ISSET(msgsock,&readfds) ) {
- //
- // socket is ready to read, i.e., there is data on the socket.
- //
- if (ReadAndEcho(msgsock,Buffer,sizeof(Buffer))<0) {
- fprintf(stderr,"terminating connectionn");
- FD_CLR(msgsock,&readfds);
- FD_CLR(msgsock,&writefds);
- closesocket(msgsock);
- continue;
- }
- }
- if (FD_ISSET(msgsock,&writefds) ){
- if (WriteMessage(msgsock,Buffer,sizeof(Buffer)) <=0) {
- fprintf(stderr,"terminating connectionn");
- FD_CLR(msgsock,&readfds);
- FD_CLR(msgsock,&writefds);
- closesocket(msgsock);
- continue;
- }
- }
- FD_SET(msgsock,&writefds);
- FD_SET(msgsock,&readfds);
- }
- }
- int ReadAndEcho(SOCKET insock, char *Buffer,int size) {
- int rc;
- rc = recv(insock,Buffer,size,0);
- if (rc == SOCKET_ERROR) {
- fprintf(stderr,"recv() failed with error %dn",WSAGetLastError());
- return -1;
- }
- if (rc ==0) {
- fprintf(stderr,"Connection closed by clientn");
- return 0;
- }
- printf("Received [%s] from clientn",Buffer);
- return rc;
- }
- int WriteMessage(SOCKET outsock, char *Buffer,int size) {
- int rc;
- int lasterr;
- printf("Sending [%s] to clientn",Buffer);
- rc = send(outsock,Buffer,size, 0);
- if (rc == SOCKET_ERROR) {
- lasterr = WSAGetLastError();
- if (lasterr == WSAEWOULDBLOCK)
- return 0;
- else {
- fprintf(stderr,"send() failed with error %dn",lasterr);
- return -1;
- }
- }
- if (rc ==0) {
- fprintf(stderr,"Connection closed by clientn");
- }
- return rc;
- }