网络编程实验报告-实验2 文件传输
- 格式:doc
- 大小:233.00 KB
- 文档页数:6
第3页 共6页
客户端: #include #include #include #include #include #include
<stdio.h> <stdlib.h> <string.h> <WinSock2.h> <winsock.h> <ws2tcpip.h>
#pragma comment(lib,"ws2_32.lib") #define MAXLINE 1024 //缓冲区大小 #define SERVERPORT 3333 //服务器端口号 #define SERVER "59.67.146.121"//服务器 IP 地址 int main(int argc, char * argv[]) { WSADATA wsaData; WORD socketVersion = MAKEWORD(2, 2); if(0 != WSAStartup(socketVersion, &wsaData)){ printf("init WSAStartup error!\n"); return 0; }; char recvbuff[MAXLINE + 1]; int sockfd, n; struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERVERPORT); servaddr.sin_addr.S_un.S_addr = inet_addr("59.67.146.121"); if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ printf("sockfd error!\n"); exit(0); }//初始化 socket if(connect(sockfd,(struct sockaddr *) & servaddr, sizeof(struct sockaddr)) < 0){ printf("connect error!\n"); exit(0); }//连接服务器 printf("输入要传输文件名称:\n"); char filename[256]; scanf("%s", filename); FILE * fp = (FILE *)NULL; fp = fopen(filename, "rb"); if((FILE *)NULL == fp){ printf("Can't open file %s\n", filename); return 0;
第2页 共6页
exit(0); }//版定到端口 if(listen(listenfd, QueueLen) < 0){ fprintf(stderr, "listen failed!\n"); exit(0); }//绑定失败 char filename[256]; while(1){ alen = sizeof(clientaddr); if((clientfd = accept(listenfd, (struct sockaddr*)&clientaddr, &alen)) < 0){ fprintf(stderr, "accept failed!\n"); exit(0); }//接受客户端的连接 n = recv(clientfd, filename, 255, 0);//接受客户端发送的信息 filename[n] = '\0'; printf("recv n = %d\n", n); FILE * fp = (FILE *)NULL; if((FILE *) NULL == (fp = fopen(filename, "wb"))){ printf("open file %s failed!\n", filename); return 0; } n = send(clientfd, "ok", strlen("ok"), 0); //发送 ok 到客户端,让客户端开始发送文件 printf("send n = %d\n", n); while(n = recv(clientfd, buffer, 1000, 0)){ printf("recv n = %d\n", n); fwrite(buffer, 1, n, fp); if(n != 1000) break; }//接受文件并保存 fclose(fp); closesocket(clientfd); //关闭文件,关闭网络描述符 } return 0; }
实验报告
学院(系)名称:计算机与通信工程学院 姓名 班级 课程名称 学号 实验名称 实验 2 文件传输 网络编程 课程代码 0662146 专业 信息安全
实验时间
2016- 11- 24
实验地点
7-219
批改意见
成绩
教师签字:
1. 实验目的 利用先前学过的 windows socket 通信编程知识和文件操作相关函数实现文件传输 2. 实验环境 搭载 Windows 7 操作系统的 PC 机 VC 6.0 编译器 3. 实验要求 1,有客户端和服务器的完整代码 2,实验结果截图 3,实现文件传输的流程图 4. 实验过程记录(源程序、测试用例、测试结果及心得体会等) 实现文件传输的流程图: 服务端 初始化 绑定并监 听端口 成功连接 客户端 初始化 连接 服务端 发送文件 发送完成 接收文件 接收完成 断开连接
第4页 共6页
};//打开要传送的文件 n = send(sockfd, filename, strlen(filename), 0); //发送文件名 printf("send n = %d\n", n); n = recv(sockfd, recvbuff, MAXLINE, 0); recvbuff[n] = '\0'; printf("recv n = %d\n", n); if(strcmp(recvbuff, "ok") == 0){//如果服务器返回 ok 则开始传送文件 memset(recvbuff, 0, sizeof(recvbuff)); while(!feof(fp)){ n = fread(recvbuff, 1, 1000, fp); printf("%d\n", n); n = send(sockfd, recvbuff, n, 0); printf("send n = %d\n", n); }//传送文件 fclose(fp);//关闭文件 } closesocket(sockfd); //关闭网络描述符 return 0; }
第1页 共6页
服务器: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<WinSock2.h> #define PORTNUMBER 3333 //定义端口号 #define MAXLINE 1024 //缓存大小 #pragma comment(lib,"ws2_32.lib") #define QueueLen 1 char buffer[MAXLINE+1]; int n; int main(int argc, char * argv[]) { WORD version; version = MAKEWORD(1, 1); WSADATA wsa; if(0 != WSAStartup(version, &wsa)){ printf("WSAStartup error!\n"); exit(0); }//初始化 socket struct sockaddr_in servaddr; //服务器 IP 地址 struct sockaddr_in clientaddr;//客户端 IP 地址 int listenfd;//监听的网络描述符 int clientfd;//客户端网络描述符 int alen; memset(&servaddr, 0, sizeof(servaddr)); //初始化 servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = INADDR_ANY; servaddr.sin_port = htons((unsigned short) PORTNUMBER); //初始化服务器 listenfd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP ); //初始化监听的网络描述符 if(listenfd< 0){ fprintf(stderr, "socket createion failed!\n"); exit(0); }//失败 if(bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0){ fprintf(stderr, "bind failed!\n");
第5页 共6页
第6页 共6页