SIMPLES.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /******************************************************************************
  2. * simples.c - Simple TCP/UDP server using Winsock 1.1
  3. *       This is a part of the Microsoft Source Code Samples.
  4. *       Copyright 1996-1997 Microsoft Corporation.
  5. *       All rights reserved.
  6. *       This source code is only intended as a supplement to
  7. *       Microsoft Development Tools and/or WinHelp documentation.
  8. *       See these sources for detailed information regarding the
  9. *       Microsoft samples programs.
  10. ******************************************************************************/
  11. #define WIN32_LEAN_AND_MEAN
  12. #include <winsock2.h>
  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include <string.h>
  16. #define DEFAULT_PORT 5001
  17. #define DEFAULT_PROTO SOCK_STREAM // TCP
  18. void Usage(char *progname) {
  19. fprintf(stderr,"Usagen%s -p [protocol] -e [endpoint] -i [interface]n",
  20. progname);
  21. fprintf(stderr,"Where:ntprotocol is one of TCP or UDPn");
  22. fprintf(stderr,"tendpoint is the port to listen onn");
  23. fprintf(stderr,"tinterface is the ipaddr (in dotted decimal notation)");
  24. fprintf(stderr," to bind ton");
  25. fprintf(stderr,"Defaults are TCP,5001 and INADDR_ANYn");
  26. WSACleanup();
  27. exit(1);
  28. }
  29. int main(int argc, char **argv) {
  30. char Buffer[128];
  31. char *interface= NULL;
  32. unsigned short port=DEFAULT_PORT;
  33. int retval;
  34. int fromlen;
  35. int i;
  36. int socket_type = DEFAULT_PROTO;
  37. struct sockaddr_in local, from;
  38. WSADATA wsaData;
  39. SOCKET listen_socket, msgsock;
  40. /* Parse arguments */
  41. if (argc >1) {
  42. for(i=1;i <argc;i++) {
  43. if ( (argv[i][0] == '-') || (argv[i][0] == '/') ) {
  44. switch(tolower(argv[i][1])) {
  45. case 'p':
  46. if (!stricmp(argv[i+1], "TCP") )
  47. socket_type = SOCK_STREAM;
  48. else if (!stricmp(argv[i+1], "UDP") )
  49. socket_type = SOCK_DGRAM;
  50. else
  51. Usage(argv[0]);
  52. i++;
  53. break;
  54. case 'i':
  55. interface = argv[++i];
  56. break;
  57. case 'e':
  58. port = atoi(argv[++i]);
  59. break;
  60. default:
  61. Usage(argv[0]);
  62. break;
  63. }
  64. }
  65. else
  66. Usage(argv[0]);
  67. }
  68. }
  69. if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) {
  70. fprintf(stderr,"WSAStartup failed with error %dn",WSAGetLastError());
  71. WSACleanup();
  72. return -1;
  73. }
  74. if (port == 0){
  75. Usage(argv[0]);
  76. }
  77. local.sin_family = AF_INET;
  78. local.sin_addr.s_addr = (!interface)?INADDR_ANY:inet_addr(interface); 
  79. /* 
  80.  * Port MUST be in Network Byte Order
  81.  */
  82. local.sin_port = htons(port);
  83. listen_socket = socket(AF_INET, socket_type,0); // TCP socket
  84. if (listen_socket == INVALID_SOCKET){
  85. fprintf(stderr,"socket() failed with error %dn",WSAGetLastError());
  86. WSACleanup();
  87. return -1;
  88. }
  89. //
  90. // bind() associates a local address and port combination with the
  91. // socket just created. This is most useful when the application is a 
  92. // server that has a well-known port that clients know about in advance.
  93. //
  94. if (bind(listen_socket,(struct sockaddr*)&local,sizeof(local) ) 
  95. == SOCKET_ERROR) {
  96. fprintf(stderr,"bind() failed with error %dn",WSAGetLastError());
  97. WSACleanup();
  98. return -1;
  99. }
  100. //
  101. // So far, everything we did was applicable to TCP as well as UDP.
  102. // However, there are certain steps that do not work when the server is
  103. // using UDP.
  104. //
  105. // We cannot listen() on a UDP socket.
  106. if (socket_type != SOCK_DGRAM) {
  107. if (listen(listen_socket,5) == SOCKET_ERROR) {
  108. fprintf(stderr,"listen() failed with error %dn",WSAGetLastError());
  109. WSACleanup();
  110. return -1;
  111. }
  112. }
  113. printf("%s: 'Listening' on port %d, protocol %sn",argv[0],port,
  114. (socket_type == SOCK_STREAM)?"TCP":"UDP");
  115. while(1) {
  116. fromlen =sizeof(from);
  117. //
  118. // accept() doesn't make sense on UDP, since we do not listen()
  119. //
  120. if (socket_type != SOCK_DGRAM) {
  121. msgsock = accept(listen_socket,(struct sockaddr*)&from, &fromlen);
  122. if (msgsock == INVALID_SOCKET) {
  123. fprintf(stderr,"accept() error %dn",WSAGetLastError());
  124. WSACleanup();
  125. return -1;
  126. }
  127. printf("accepted connection from %s, port %dn", 
  128. inet_ntoa(from.sin_addr),
  129. htons(from.sin_port)) ;
  130. }
  131. else
  132. msgsock = listen_socket;
  133. //
  134. // In the case of SOCK_STREAM, the server can do recv() and 
  135. // send() on the accepted socket and then close it.
  136. // However, for SOCK_DGRAM (UDP), the server will do
  137. // recvfrom() and sendto()  in a loop.
  138. if (socket_type != SOCK_DGRAM)
  139. retval = recv(msgsock,Buffer,sizeof (Buffer),0 );
  140. else {
  141. retval = recvfrom(msgsock,Buffer,sizeof (Buffer),0,
  142. (struct sockaddr *)&from,&fromlen);
  143. printf("Received datagram from %sn",inet_ntoa(from.sin_addr));
  144. }
  145. if (retval == SOCKET_ERROR) {
  146. fprintf(stderr,"recv() failed: error %dn",WSAGetLastError());
  147. closesocket(msgsock);
  148. continue;
  149. }
  150. if (retval == 0) {
  151. printf("Client closed connectionn");
  152. closesocket(msgsock);
  153. continue;
  154. }
  155. printf("Received %d bytes, data [%s] from clientn",retval,Buffer);
  156. printf("Echoing same data back to clientn");
  157. if (socket_type != SOCK_DGRAM)
  158. retval = send(msgsock,Buffer,sizeof(Buffer),0);
  159. else
  160. retval = sendto(msgsock,Buffer,sizeof (Buffer),0,
  161. (struct sockaddr *)&from,fromlen);
  162. if (retval == SOCKET_ERROR) {
  163. fprintf(stderr,"send() failed: error %dn",WSAGetLastError());
  164. }
  165. if (socket_type != SOCK_DGRAM){
  166. printf("Terminating connectionn");
  167. closesocket(msgsock);
  168. }
  169. else 
  170. printf("UDP server looping back for more requestsn");
  171. continue;
  172. }
  173. }