1、客户端向服务器发送文件长度,4字节(定长数据)客户端向服务器文件容(变长数据)服务端接收完文件后,向客户端发送ok,以示成功接收客户端接收到OK后,关闭套接字服务器关闭套接字【实验环境】Dev c【实验作业】客户端:int tcp_client_fun_echo(FILE *fp,SOCKET s) int iResult; char sendlineMAXLINE,recvlineMAXLINE; char file20; char flong4; int i=0;/文件名发送控制 /初始化缓冲区 FILE *f;/写文件指针 char *buff;/读入文件容 uint32_t nFile
2、Len;/文件长度 printf(请输入文件名:n); scanf(%s,&file); f=fopen(file,rb if(f=NULL)打开文件失败或文件不存在! fseek(f,0,SEEK_END); nFileLen=ftell(f); rewind(f);/回到到文件头部 buff=(char *)malloc(nFileLen); iResult=fread(buff,1,nFileLen,f); if(iResult!=nFileLen) printf(读入文件错误! return 0; memset(sendline,0,MAXLINE); memset(recvline,
3、0,MAXLINE); while(i! recvlinei=*buff; i+; buff+; /文件名传输结束 sprintf(sendline,%s#%d%s,file,nFileLen,recvline); iResult=send(s,sendline,sizeof(sendline),0); if(iResult=SOCKET_ERROR) printf(send函数调用错误,错误号:%d,WSAGetLastError(); return -1; fclose(fp);文件发送完成! return iResult;服务器:int tcp_server_fun_echo(SOCKE
4、T s) FILE *fp; int iResult = 0; uint32_t nFileLen=1; char recvlineMAXLINE; char file10; memset(file,0,sizeof(file); memset(recvline,0,sizeof(recvline); for(;) iResult=recv(s,&filei,1,0);recv函数调用错误,错误号: if(filei=#) break; else filei=0 fp=fopen(file,w+ if(fp=NULL)文件打开失败! /接收文件长度 iResult=recv(s,flong,4
5、,0); sscanf(flong,nFileLen);iResult=recv(s,recvline,nFileLen,0); fputs(recvline,fp);文件接收成功!头文件(上次的实验报告中已经写过):#ifndef p_h/预处理指令,防止重复包含头文件 #includetime.hws2tcpip.hwinsock2.hwindows.h#pragma coment(lib,ws2_32.libusing namespace std;class CSocketFrame public: int start_up(); int clean_up(); int set_addr
6、ess(char *hname,char *sname,struct sockaddr_in *sap,char *protocol); int quit(SOCKET s); SOCKET tcp_server(ULONG uIP,USHORT uPort); SOCKET tcp_server(char *hname,char *sname); SOCKET tcp_client(char *hname,char *sname); SOCKET tcp_client(ULONG uIP,USHORT uPort);int CSocketFrame:start_up(void) WORD w
7、VersionRequested; WSADATA wsaData; wVersionRequested=MAKEWORD(2,2); iResult=WSAStartup(wVersionRequested,&wsaData);=0)WSAStartup 调用错误,错误号:%dn return -1; /* if(LOBYTE(wsaData.wVersion!=2|HIBYTE(wsaData.wVersion)!=2)无法找到可用的WSD版本n WSACleanup(); /告诉用户无法找到可用的WSD elseWS2.2初始化成功! */ return 0;clean_up(void)
8、 iResult=WSACleanup(); if(iResult=SOCKET_ERROR) /WSACleanup()调用失败 WSACleanup 调用错误,错误号:Winsocket dll释放成功!) ;set_address(char *hname,char *sname,struct sockaddr_in *sap,char *protocol) struct servent *sp; struct hostent *hp; char *endptr; unsigned short port; unsigned long ulAddr=INADDR_NONE; /将地址结构so
9、cketsddr_in初始化为0,并将地址族设为AF_INET memset(sap,0,sizeof(*sap); sap-sin_family=AF_INET; if(hname!=NULL) /如果hname不为空,转化地址格式 ulAddr=inet_addr(hname); if(ulAddr=INADDR_NONE|ulAddr=INADDR_ANY) /调用错误,调用gethostbyname获得主机地址 hp=gethostbyname(hname); if(hp=NULL) 未知的主机名,错误号: sap-sin_addr=*(struct in_addr *)hp-h_ad
10、dr;sin_addr.S_un.S_addr=ulAddr; /如果调用者没有指明一个主机名或地址,则设为通配地址 sap-sin_addr.s_addr=htonl(INADDR_ANY); /尝试转换sname为一个整数 port=(unsigned short)strtol(sname,&endptr,0); if(*endptr= /如果成功转化为网络字节序sin_port=htons(port); /如果失败,则假定是一个服务名称,通过getservbyname()函数获得端口号 sp=getservbyname(sname,protocol); if(sp=NULL)未知服务,错误号: sin_port=sp-s_port;quit(SOCKET s) int iResult=0; iResult=closesocket(s); printf(closesocket 调用
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1