spacepaste

  1.  
  2. // EchoTCPClient.cpp : 定义控制台应用程序的入口点。
  3. //
  4. #include "stdafx.h"
  5. #include "SocketFrame.h"
  6. int tcp_client_fun_recvn(FILE *fp,SOCKET s);
  7. UINT tcp_client_fun_recvn_receive( LPVOID pParam );
  8. #define ECHOPORT "7210"
  9. #include "winsock2.h"
  10. // 唯一的应用程序对象
  11. CWinApp theApp;
  12. using namespace std;
  13. CSocketFrame frame;
  14. int flen;
  15. int main(int argc, char* argv[])
  16. {
  17. CSocketFrame frame;
  18. int iResult;
  19. SOCKET ClientSocket;
  20. CWinThread *pThread= NULL;
  21. //输入参数合法性检查
  22. if (argc != 3)
  23. {
  24. printf("usage: EchoTCPClient-recvn <IPaddress> <定长接收长度>");
  25. return -1;
  26. }
  27. //Windows Sockets Dll初始化
  28. frame.start_up();
  29. //创建客户端的流式套接字,并与服务器建立连接
  30. printf("连接建立成功,请输入回射字符串。。。\n");
  31. ClientSocket = frame.tcp_client( ( char *)argv[1], ECHOPORT );
  32. if ( ClientSocket == -1 )
  33. return -1;
  34. flen = atoi(argv[2]);
  35. pThread = AfxBeginThread( tcp_client_fun_recvn_receive, &ClientSocket );
  36. //开始回射请求的发送与接收
  37. iResult = tcp_client_fun_recvn(stdin,ClientSocket);
  38. WaitForSingleObject(pThread,INFINITE);
  39. frame.quit( ClientSocket );
  40. return iResult;
  41. return 0;
  42. }
  43. /********************************************************
  44. 函数名:tcp_client_fun_recvn
  45. 输入参数:FILE *fp:指向FILE类型的对象
  46. SOCKET s:服务器的连接套接字
  47. 输出参数:0:成功,-1:失败
  48. 功能:测试服务器定长接收能力,根据用户输入,持续向服务器发送数据
  49. *********************************************************/
  50. int tcp_client_fun_recvn(FILE *fp,SOCKET s)
  51. {
  52. int iResult;
  53. char sendline[MAXLINE];
  54. memset(sendline,0,MAXLINE);
  55. //循环发送用户的输入数据,并接收服务器返回的应答,直到用户输入"Q"结束
  56. while(fgets(sendline,MAXLINE,fp)!=NULL)
  57. {
  58. if( *sendline == 'Q'){
  59. printf("input end!\n");
  60. // 数据发送结束,调用shutdown()函数声明不再发送数据,此时客户端仍可以接收数据
  61. iResult = shutdown(s, SD_SEND);
  62. if (iResult == SOCKET_ERROR) {
  63. printf("shutdown failed with error: %d\n", WSAGetLastError());
  64. }
  65. return 0;
  66. }
  67. iResult = send(s,sendline,strlen(sendline),0);
  68. if(iResult == SOCKET_ERROR)
  69. {
  70. printf("send 函数调用错误,错误号: %ld\n", WSAGetLastError());
  71. return -1;
  72. }
  73. printf("\r\n客户端发送数据:%s\r\n", sendline);
  74. memset(sendline,0,MAXLINE);
  75. }
  76. return iResult;
  77. }
  78. UINT tcp_client_fun_recvn_receive( LPVOID pParam )
  79. {
  80. int iResult = 0;
  81. char recvline[MAXLINE];
  82. //将输入参数转换为连接套接字
  83. SOCKET s =*( (SOCKET *)pParam);
  84. do {
  85. memset( recvline, 0, MAXLINE );
  86. //接收数据
  87. iResult = frame.recvn( s, recvline, flen);
  88. if (iResult > 0)
  89. printf("服务器端接收到数据%s\n", recvline);
  90. else{
  91. if (iResult == 0)
  92. printf("对方连接关闭,退出\n");
  93. else{
  94. printf("recv 函数调用错误,错误号: %d\n", WSAGetLastError());
  95. iResult = -1;
  96. }
  97. }
  98. } while (iResult > 0);
  99. printf("THREAD BEGIN TO END");
  100. return iResult;
  101. }
  102.