// 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 <定长接收长度>"); 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; }