-
- // EchoTCPClient.cpp : 定义控制台应用程序的入口点。
- //
-
- #include "stdafx.h"
-
- #include "SocketFrame.h"
- int tcp_client_fun_recvn(FILE *fp,SOCKET s);
- UINT tcp_client_fun_recvn_receive( LPVOID pParam );
- #define ECHOPORT "7210"
- #include "winsock2.h"
- // 唯一的应用程序对象
-
- CWinApp theApp;
-
- using namespace std;
- CSocketFrame frame;
- int flen;
- int main(int argc, char* argv[])
- {
- CSocketFrame frame;
- int iResult;
- SOCKET ClientSocket;
- CWinThread *pThread= NULL;
- //输入参数合法性检查
- if (argc != 3)
- {
- printf("usage: EchoTCPClient-recvn <IPaddress> <定长接收长度>");
- return -1;
- }
-
- //Windows Sockets Dll初始化
- frame.start_up();
-
- //创建客户端的流式套接字,并与服务器建立连接
- printf("连接建立成功,请输入回射字符串。。。\n");
- ClientSocket = frame.tcp_client( ( char *)argv[1], ECHOPORT );
- if ( ClientSocket == -1 )
- return -1;
-
- flen = atoi(argv[2]);
- pThread = AfxBeginThread( tcp_client_fun_recvn_receive, &ClientSocket );
- //开始回射请求的发送与接收
- iResult = tcp_client_fun_recvn(stdin,ClientSocket);
- WaitForSingleObject(pThread,INFINITE);
- frame.quit( ClientSocket );
- return iResult;
- return 0;
- }
-
- /********************************************************
- 函数名:tcp_client_fun_recvn
- 输入参数:FILE *fp:指向FILE类型的对象
- SOCKET s:服务器的连接套接字
- 输出参数:0:成功,-1:失败
- 功能:测试服务器定长接收能力,根据用户输入,持续向服务器发送数据
- *********************************************************/
- int tcp_client_fun_recvn(FILE *fp,SOCKET s)
- {
- int iResult;
- char sendline[MAXLINE];
- memset(sendline,0,MAXLINE);
-
- //循环发送用户的输入数据,并接收服务器返回的应答,直到用户输入"Q"结束
- while(fgets(sendline,MAXLINE,fp)!=NULL)
- {
- if( *sendline == 'Q'){
- printf("input end!\n");
- // 数据发送结束,调用shutdown()函数声明不再发送数据,此时客户端仍可以接收数据
- iResult = shutdown(s, SD_SEND);
- if (iResult == SOCKET_ERROR) {
- printf("shutdown failed with error: %d\n", WSAGetLastError());
- }
- return 0;
- }
- iResult = send(s,sendline,strlen(sendline),0);
- if(iResult == SOCKET_ERROR)
- {
- printf("send 函数调用错误,错误号: %ld\n", WSAGetLastError());
- return -1;
- }
- printf("\r\n客户端发送数据:%s\r\n", sendline);
-
- memset(sendline,0,MAXLINE);
- }
- return iResult;
- }
-
- UINT tcp_client_fun_recvn_receive( LPVOID pParam )
- {
- int iResult = 0;
- char recvline[MAXLINE];
-
- //将输入参数转换为连接套接字
- SOCKET s =*( (SOCKET *)pParam);
-
- do {
- memset( recvline, 0, MAXLINE );
- //接收数据
- iResult = frame.recvn( s, recvline, flen);
- if (iResult > 0)
- printf("服务器端接收到数据%s\n", recvline);
- else{
- if (iResult == 0)
- printf("对方连接关闭,退出\n");
- else{
- printf("recv 函数调用错误,错误号: %d\n", WSAGetLastError());
- iResult = -1;
- }
- }
- } while (iResult > 0);
- printf("THREAD BEGIN TO END");
- return iResult;
- }
-