windows网络编程(四)——不同主机之间传送文件应用
2017-05-24 13:06
519 查看
客户端
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib") //加载 ws2_32.dll
int main(){
char fullname[200] = "C:\\Users\\Administrator\\Desktop\\";
//初始化DLL
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
//创建套接字
SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
//向服务器发起请求
sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节都用0填充
sockAddr.sin_family = PF_INET;
sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
sockAddr.sin_port = htons(1234);
if (connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)) == SOCKET_ERROR)
{
closesocket(sock);
printf("error connect! %d\n",WSAGetLastError());
WSACleanup();
// exit(1);
}
//接收服务器传回的数据
char szBuffer[MAXBYTE] = "";
//send(sock, szBuffer, MAXBYTE, NULL);
if (recv(sock, szBuffer, MAXBYTE, NULL) == SOCKET_ERROR)
{
printf("接受失败!\n"); closesocket(sock); WSACleanup(); return 0;
}
//输出接收到的数据
printf("Message form server: %s\n", szBuffer);
char YN[10];
scanf("%s", YN);//是否传输
if (send(sock, YN, 2, NULL) == SOCKET_ERROR)
{
printf("发送失败!\n"); closesocket(sock); WSACleanup(); return 0;
}
int len;
if ((len=recv(sock, szBuffer, MAXBYTE, NULL)) == SOCKET_ERROR)
{
printf("接受失败!\n"); closesocket(sock); WSACleanup(); return 0;
}
printf("Message form server: %s\n", szBuffer);
scanf("%s", YN);//发送类型
if (send(sock, YN, 5, NULL) == SOCKET_ERROR)
{
printf("发送失败!\n"); closesocket(sock); WSACleanup(); return 0;
}
if ((len = recv(sock, szBuffer, MAXBYTE, NULL)) == SOCKET_ERROR)
{
printf("接受失败!\n"); closesocket(sock); WSACleanup(); return 0;
}
printf("Message form server: %s\n", szBuffer);
char filename[50];
printf( "输入待发送的文件名:");
scanf("%s", filename);
strcat(fullname, filename);
FILE*p = fopen(fullname, "rb+");
if (!p)
{
printf("打开文件失败!\n"); closesocket(sock); WSACleanup(); return 0;
}
while ((len=fread(szBuffer, 1, 99, p))>0)
{
send(sock, szBuffer, len, NULL);
}
fclose(p);
//关闭套接字
shutdown(sock, SD_SEND);
closesocket(sock);
//终止使用 DLL
WSACleanup();
system("pause");
return 0;
}
服务器端
#include <stdio.h>
#include<iostream>
#include <winsock2.h>
#include<string>
#include<ctime>
using namespace std;
#pragma comment (lib, "ws2_32.lib") //加载 ws2_32.dll
int main(){
//初始化 DLL
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
//创建套接字
SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
//绑定套接字
sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节都用0填充
sockAddr.sin_family = PF_INET; //使用IPv4地址
sockAddr.sin_addr.s_addr = INADDR_ANY; //具体的IP地址
sockAddr.sin_port = htons(1234); //端口
bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
//进入监听状态
listen(servSock, 20);
//接收客户端请求
while (1)
{
FILE*p;
char type[100];
char baseicpath[200] = "C:\\Users\\Administrator\\Desktop\\receivefiles\\";
char *fullpath[200];
int len;
SOCKADDR clntAddr;
int nSize = sizeof(SOCKADDR);
SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);
//向客户端发送数据
char str[100] = "Are you sending a file?(sending Y/N)";
if (clntSock == INVALID_SOCKET)
{
printf("无效socket!\n");
continue;
}
if (send(clntSock, str, strlen(str) + sizeof(char), NULL) == SOCKET_ERROR)
{
printf("发送失败\n"); closesocket(clntSock); continue;
}
else
{
printf("已成功发送一条回复!\n");
}
if (recv(clntSock, str, 100, NULL) == SOCKET_ERROR)
{
printf("接受失败!\n"); closesocket(clntSock); continue;
}
switch (str[0])
{
case 'Y':
case 'y':
//传数据
{strcpy(str, "please note the type of your file(.txt/.pdf/.PNG——only three type can be supported)");
if (send(clntSock, str, strlen(str) + sizeof(char), NULL) == SOCKET_ERROR)//要求类型
{
printf("发送失败!\n"); closesocket(clntSock); continue;
}
if (recv(clntSock, type, 100, NULL) == SOCKET_ERROR)//收到类型
{
printf("接受失败!\n"); closesocket(clntSock); continue;
}
strcpy(str, "please send your file(s)!I'm ready!");
if (send(clntSock, str, strlen(str) + sizeof(char), NULL) == SOCKET_ERROR)//要求类型
{
printf("发送失败!\n"); closesocket(clntSock); continue;
}
char filename[50];//文件名
itoa(time(0), filename, 10);
strcat(filename, type);
strcat(baseicpath, filename);//完整名
p = fopen(baseicpath, "wb+");
if (!p){ printf("文件打开失败!\n"); closesocket(clntSock); continue; }
int len;
while ((len = recv(clntSock, str, 99, NULL)) >0)
{
fwrite(str, 1, len, p);
}
break;
}
case'N':
case'n':
{
break;
}
break;
}
shutdown(clntSock, SD_RECEIVE);
fclose(p);
//关闭套接字
closesocket(clntSock);
}
closesocket(servSock);
//终止 DLL 的使用
WSACleanup();
system("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib") //加载 ws2_32.dll
int main(){
char fullname[200] = "C:\\Users\\Administrator\\Desktop\\";
//初始化DLL
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
//创建套接字
SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
//向服务器发起请求
sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节都用0填充
sockAddr.sin_family = PF_INET;
sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
sockAddr.sin_port = htons(1234);
if (connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)) == SOCKET_ERROR)
{
closesocket(sock);
printf("error connect! %d\n",WSAGetLastError());
WSACleanup();
// exit(1);
}
//接收服务器传回的数据
char szBuffer[MAXBYTE] = "";
//send(sock, szBuffer, MAXBYTE, NULL);
if (recv(sock, szBuffer, MAXBYTE, NULL) == SOCKET_ERROR)
{
printf("接受失败!\n"); closesocket(sock); WSACleanup(); return 0;
}
//输出接收到的数据
printf("Message form server: %s\n", szBuffer);
char YN[10];
scanf("%s", YN);//是否传输
if (send(sock, YN, 2, NULL) == SOCKET_ERROR)
{
printf("发送失败!\n"); closesocket(sock); WSACleanup(); return 0;
}
int len;
if ((len=recv(sock, szBuffer, MAXBYTE, NULL)) == SOCKET_ERROR)
{
printf("接受失败!\n"); closesocket(sock); WSACleanup(); return 0;
}
printf("Message form server: %s\n", szBuffer);
scanf("%s", YN);//发送类型
if (send(sock, YN, 5, NULL) == SOCKET_ERROR)
{
printf("发送失败!\n"); closesocket(sock); WSACleanup(); return 0;
}
if ((len = recv(sock, szBuffer, MAXBYTE, NULL)) == SOCKET_ERROR)
{
printf("接受失败!\n"); closesocket(sock); WSACleanup(); return 0;
}
printf("Message form server: %s\n", szBuffer);
char filename[50];
printf( "输入待发送的文件名:");
scanf("%s", filename);
strcat(fullname, filename);
FILE*p = fopen(fullname, "rb+");
if (!p)
{
printf("打开文件失败!\n"); closesocket(sock); WSACleanup(); return 0;
}
while ((len=fread(szBuffer, 1, 99, p))>0)
{
send(sock, szBuffer, len, NULL);
}
fclose(p);
//关闭套接字
shutdown(sock, SD_SEND);
closesocket(sock);
//终止使用 DLL
WSACleanup();
system("pause");
return 0;
}
服务器端
#include <stdio.h>
#include<iostream>
#include <winsock2.h>
#include<string>
#include<ctime>
using namespace std;
#pragma comment (lib, "ws2_32.lib") //加载 ws2_32.dll
int main(){
//初始化 DLL
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
//创建套接字
SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
//绑定套接字
sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节都用0填充
sockAddr.sin_family = PF_INET; //使用IPv4地址
sockAddr.sin_addr.s_addr = INADDR_ANY; //具体的IP地址
sockAddr.sin_port = htons(1234); //端口
bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
//进入监听状态
listen(servSock, 20);
//接收客户端请求
while (1)
{
FILE*p;
char type[100];
char baseicpath[200] = "C:\\Users\\Administrator\\Desktop\\receivefiles\\";
char *fullpath[200];
int len;
SOCKADDR clntAddr;
int nSize = sizeof(SOCKADDR);
SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);
//向客户端发送数据
char str[100] = "Are you sending a file?(sending Y/N)";
if (clntSock == INVALID_SOCKET)
{
printf("无效socket!\n");
continue;
}
if (send(clntSock, str, strlen(str) + sizeof(char), NULL) == SOCKET_ERROR)
{
printf("发送失败\n"); closesocket(clntSock); continue;
}
else
{
printf("已成功发送一条回复!\n");
}
if (recv(clntSock, str, 100, NULL) == SOCKET_ERROR)
{
printf("接受失败!\n"); closesocket(clntSock); continue;
}
switch (str[0])
{
case 'Y':
case 'y':
//传数据
{strcpy(str, "please note the type of your file(.txt/.pdf/.PNG——only three type can be supported)");
if (send(clntSock, str, strlen(str) + sizeof(char), NULL) == SOCKET_ERROR)//要求类型
{
printf("发送失败!\n"); closesocket(clntSock); continue;
}
if (recv(clntSock, type, 100, NULL) == SOCKET_ERROR)//收到类型
{
printf("接受失败!\n"); closesocket(clntSock); continue;
}
strcpy(str, "please send your file(s)!I'm ready!");
if (send(clntSock, str, strlen(str) + sizeof(char), NULL) == SOCKET_ERROR)//要求类型
{
printf("发送失败!\n"); closesocket(clntSock); continue;
}
char filename[50];//文件名
itoa(time(0), filename, 10);
strcat(filename, type);
strcat(baseicpath, filename);//完整名
p = fopen(baseicpath, "wb+");
if (!p){ printf("文件打开失败!\n"); closesocket(clntSock); continue; }
int len;
while ((len = recv(clntSock, str, 99, NULL)) >0)
{
fwrite(str, 1, len, p);
}
break;
}
case'N':
case'n':
{
break;
}
break;
}
shutdown(clntSock, SD_RECEIVE);
fclose(p);
//关闭套接字
closesocket(clntSock);
}
closesocket(servSock);
//终止 DLL 的使用
WSACleanup();
system("pause");
return 0;
}
相关文章推荐
- 虚拟机和主机之间传送文件
- 【Linux命令】用 scp 命令在不同主机之间拷贝文件或目录
- 两台linux主机之间传送文件
- window主机和centos主机之间相互传送文件
- Python实现在不同Linux主机之间拷贝文件
- 通过串口在主机和开发板之间传送文件
- linux下不同主机之间的文件传输
- android文件读写以及不同应用之间的文件读写操作
- 在虚拟机Ubuntu和宿主机Windows之间传送文件
- 用ssh在虚拟机与宿主机之间传送文件的一些问题
- scp:不同的Linux之间copy文件
- 比较两个文件或两个文件集并显示它们之间的不同
- scp在Linux主机之间复制文件/目录不用输入密码
- Linux之间传送文件的SCP命令
- 委托与事件的简单应用(不同控件之间的控制及参数传递,C# VB)
- 使用scp在linux主机之间传输文件
- 文件在不同硬盘之间的复制
- 通过FTP实现vxsim和vxworks主机之间的文件传输
- 虚拟机LINUX和宿主机之间传输文件
- 不同Web主机上的Servlet之间数据对象的相互传输