正在加载图片...
An example singly-threaded An example Singly-threaded ECHO server ECHO server TCPmechd, cpp-main, echo*/ #include winsock ha main-Concurrent TCP server for ECHO service #include <string. h pid main(int argc, char *argv[D #define QLEN 5 maximum connection queue length * har *service ="echo" / service name or port number * struct ockaddr in fsin / the from address of a client BUFSIZE SOCKET mock: / #define AKEWORD(2. 0) rfds: /*read file descriptor set fo_set afds: /active file descriptor set * void errexit(const char*..E: from-address length SOCKET ssive TCP(const char * int): WSADATA wsdata int echo(soCKET) unsigned int fdndx An example Singly-threaded An example singly -threaded ECHO server ECHO server switch(argc)t while (I)i emcp(&rfds, dads, sizeof(rfds)): (select(FD_ SETSIZE, &rfds, (fd set *)o, (fd set")o (struct timeval *)0)== SOCKET ERROR) service= argv[1B: if(FD_ ISSET(mock, &rfds))( errexitc"usage: TCPmechod [port]\n") clen s sizeof(fsin): sock z accept(sock, (struct sockaddr *fsin. if (wsAStartup(WSVERS, &wsdata)E O) t(WSAStartup failed\"E if(sock == INVALID_ SOCKET errexit("accept: error Ad\n FD- ZERO(afds): tLastError o: FD_SET(sock, &afds): FD_ SET(sock, &afds): 1 An example Singly-threaded .I An example Singly-threaded ECHO server ECHO server for (fandx=0: fandxerfds, fd count:++fdndx( echo-echo one buffer of data, returning byte count if (fd l mock & FD_IsSET(fd, &rfds)) char buf[BUFSIZE] FD CLR(fd, &afds recv(fd, buf, sizeof buf, O): if (cc = SOCKET ERROR) if(cc &d send(fd, buf, cc, O)== 5OCKET-ERROR) errexit(echo send error Zd\n9 哈工大计算机学院 李全龙 Network Application Development Server Software Design 49 An example Singly-threaded ECHO server /* TCPmechd.cpp - main, echo */ #include <winsock.h> #include <string.h> #define QLEN 5 /* maximum connection queue length */ #define BUFSIZE 4096 #define WSVERS MAKEWORD(2, 0) void errexit(const char *, ...); SOCKET passiveTCP(const char *, int); int echo(SOCKET); 哈工大计算机学院 李全龙 Network Application Development Server Software Design 50 An example Singly-threaded ECHO server /*------------------------------------------------------------------------ * main - Concurrent TCP server for ECHO service *------------------------------------------------------------------------ */ void main(int argc, char *argv[]) { char *service = "echo";/* service name or port number */ struct sockaddr_in fsin;/* the from address of a client*/ SOCKET msock; /* master server socket */ fd_set rfds; /* read file descriptor set */ fd_set afds; /* active file descriptor set */ int alen; /* from-address length */ WSADATA wsdata; unsigned int fdndx; 哈工大计算机学院 李全龙 Network Application Development Server Software Design 51 An example Singly-threaded ECHO server switch (argc) { case 1: break; case 2: service = argv[1]; break; default: errexit("usage: TCPmechod [port]\n"); } if (WSAStartup(WSVERS, &wsdata) != 0) errexit("WSAStartup failed\n"); msock = passiveTCP(service, QLEN); FD_ZERO(&afds); FD_SET(msock, &afds); 哈工大计算机学院 李全龙 Network Application Development Server Software Design 52 An example Singly-threaded ECHO server while (1) { memcpy(&rfds, &afds, sizeof(rfds)); if (select(FD_SETSIZE, &rfds, (fd_set *)0, (fd_set *)0, (struct timeval *)0) == SOCKET_ERROR) errexit("select error: %d\n", GetLastError()); if (FD_ISSET(msock, &rfds)) { SOCKET ssock; alen = sizeof(fsin); ssock = accept(msock, (struct sockaddr *)&fsin, &alen); if (ssock == INVALID_SOCKET) errexit("accept: error %d\n", GetLastError()); FD_SET(ssock, &afds);} 哈工大计算机学院 李全龙 Network Application Development Server Software Design 53 An example Singly-threaded ECHO server for (fdndx=0; fdndx<rfds.fd_count; ++fdndx){ SOCKET fd = rfds.fd_array[fdndx]; if (fd != msock && FD_ISSET(fd, &rfds)) if (echo(fd) == 0) { (void) closesocket(fd); FD_CLR(fd, &afds); } } } } 哈工大计算机学院 李全龙 Network Application Development Server Software Design 54 An example Singly-threaded ECHO server /*------------------------------------------------------------------------ * echo - echo one buffer of data, returning byte count *------------------------------------------------------------------------ */ int echo(SOCKET fd) { char buf[BUFSIZE]; int cc; cc = recv(fd, buf, sizeof buf, 0); if (cc == SOCKET_ERROR) errexit("echo recv error %d\n", GetLastError()); if (cc && send(fd, buf, cc, 0) == SOCKET_ERROR) errexit("echo send error %d\n", GetLastError()); return cc; }
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有