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

Windows编程

开发平台:

Visual C++

  1. /******************************************************************************
  2. * simplec.c - Simple TCP/UDP client 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] -n [server] -e [endpoint] 
  20. -l [iterations]n",
  21. progname);
  22. fprintf(stderr,"Where:ntprotocol is one of TCP or UDPn");
  23. fprintf(stderr,"tserver is the IP address or name of servern");
  24. fprintf(stderr,"tendpoint is the port to listen onn");
  25. fprintf(stderr,"titerations is the number of loops to executen");
  26. fprintf(stderr,"t(-l by itself makes client run in an infinite loop,");
  27. fprintf(stderr," Hit Ctrl-C to terminate it)n");
  28. fprintf(stderr,"Defaults are TCP , localhost and 5001n");
  29. WSACleanup();
  30. exit(1);
  31. }
  32. int main(int argc, char **argv) {
  33. char Buffer[128];
  34. char *server_name= "localhost";
  35. unsigned short port = DEFAULT_PORT;
  36. int retval, loopflag=0;
  37. int i, loopcount,maxloop=-1;
  38. unsigned int addr;
  39. int socket_type = DEFAULT_PROTO;
  40. struct sockaddr_in server;
  41. struct hostent *hp;
  42. WSADATA wsaData;
  43. SOCKET  conn_socket;
  44. if (argc >1) {
  45. for(i=1;i <argc;i++) {
  46. if ( (argv[i][0] == '-') || (argv[i][0] == '/') ) {
  47. switch(tolower(argv[i][1])) {
  48. case 'p':
  49. if (!stricmp(argv[i+1], "TCP") )
  50. socket_type = SOCK_STREAM;
  51. else if (!stricmp(argv[i+1], "UDP") )
  52. socket_type = SOCK_DGRAM;
  53. else
  54. Usage(argv[0]);
  55. i++;
  56. break;
  57. case 'n':
  58. server_name = argv[++i];
  59. break;
  60. case 'e':
  61. port = atoi(argv[++i]);
  62. break;
  63. case 'l':
  64. loopflag =1;
  65. if (argv[i+1]) {
  66. if (argv[i+1][0] != '-') 
  67. maxloop = atoi(argv[i+1]);
  68. }
  69. else
  70. maxloop = -1;
  71. i++;
  72. break;
  73. default:
  74. Usage(argv[0]);
  75. break;
  76. }
  77. }
  78. else
  79. Usage(argv[0]);
  80. }
  81. }
  82. if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) {
  83. fprintf(stderr,"WSAStartup failed with error %dn",WSAGetLastError());
  84. WSACleanup();
  85. return -1;
  86. }
  87. if (port == 0){
  88. Usage(argv[0]);
  89. }
  90. //
  91. // Attempt to detect if we should call gethostbyname() or
  92. // gethostbyaddr()
  93. if (isalpha(server_name[0])) {   /* server address is a name */
  94. hp = gethostbyname(server_name);
  95. }
  96. else  { /* Convert nnn.nnn address to a usable one */
  97. addr = inet_addr(server_name);
  98. hp = gethostbyaddr((char *)&addr,4,AF_INET);
  99. }
  100. if (hp == NULL ) {
  101. fprintf(stderr,"Client: Cannot resolve address [%s]: Error %dn",
  102. server_name,WSAGetLastError());
  103. WSACleanup();
  104. exit(1);
  105. }
  106. //
  107. // Copy the resolved information into the sockaddr_in structure
  108. //
  109. memset(&server,0,sizeof(server));
  110. memcpy(&(server.sin_addr),hp->h_addr,hp->h_length);
  111. server.sin_family = hp->h_addrtype;
  112. server.sin_port = htons(port);
  113. conn_socket = socket(AF_INET,socket_type,0); /* Open a socket */
  114. if (conn_socket <0 ) {
  115. fprintf(stderr,"Client: Error Opening socket: Error %dn",
  116. WSAGetLastError());
  117. WSACleanup();
  118. return -1;
  119. }
  120. //
  121. // Notice that nothing in this code is specific to whether we 
  122. // are using UDP or TCP.
  123. // We achieve this by using a simple trick.
  124. //    When connect() is called on a datagram socket, it does not 
  125. //    actually establish the connection as a stream (TCP) socket
  126. //    would. Instead, TCP/IP establishes the remote half of the
  127. //    ( LocalIPAddress, LocalPort, RemoteIP, RemotePort) mapping.
  128. //    This enables us to use send() and recv() on datagram sockets,
  129. //    instead of recvfrom() and sendto()
  130. printf("Client connecting to: %sn",hp->h_name);
  131. if (connect(conn_socket,(struct sockaddr*)&server,sizeof(server))
  132. == SOCKET_ERROR) {
  133. fprintf(stderr,"connect() failed: %dn",WSAGetLastError());
  134. WSACleanup();
  135. return -1;
  136. }
  137. // cook up a string to send
  138. //
  139. loopcount =0;
  140. while(1) {
  141. wsprintf(Buffer,"This is a small test message [number %d]",loopcount++);
  142. retval = send(conn_socket,Buffer,sizeof(Buffer),0);
  143. if (retval == SOCKET_ERROR) {
  144. fprintf(stderr,"send() failed: error %dn",WSAGetLastError());
  145. WSACleanup();
  146. return -1;
  147. }
  148. printf("Sent Data [%s]n",Buffer);
  149. retval = recv(conn_socket,Buffer,sizeof (Buffer),0 );
  150. if (retval == SOCKET_ERROR) {
  151. fprintf(stderr,"recv() failed: error %dn",WSAGetLastError());
  152. closesocket(conn_socket);
  153. WSACleanup();
  154. return -1;
  155. }
  156. //
  157. // We are not likely to see this with UDP, since there is no
  158. // 'connection' established. 
  159. //
  160. if (retval == 0) {
  161. printf("Server closed connectionn");
  162. closesocket(conn_socket);
  163. WSACleanup();
  164. return -1;
  165. }
  166. printf("Received %d bytes, data [%s] from servern",retval,Buffer);
  167. if (!loopflag){
  168. printf("Terminating connectionn");
  169. break;
  170. }
  171. else {
  172. if ( (loopcount >= maxloop) && (maxloop >0) )
  173. break;
  174. }
  175. }
  176. closesocket(conn_socket);
  177. WSACleanup();
  178. }