实现客户端向服务器传文件,socket连接已建立好,不会文件读入,高手来,分不是问题
//Client.cpp//非常简单,例如流客户端//工程与Server.cpp。//该程序试图连接到服务器和端口//指定的命令行,打印服务器//一旦连接后,所需要的信息...
// Client.cpp
// 非常简单,例如流客户端
// 工程与Server.cpp 。
// 该程序试图连接到服务器和端口
// 指定的命令行,打印服务器
// 一旦连接后,所需要的信息已启动它。
// 计划发送数据到服务器,等待回应
// 然后退出
// 编译和链接与wsock32.lib版本
// 通过服务器名称和端口号的命令行
//例如:客户名 2000年
#include <stdio.h>
#include <winsock.h>
#pragma comment(lib,"wsock32.lib")
// 函数原型
void StreamClient(char *szServer, short nPort);
// 助手宏观显示错误
#define PRINTERROR(s)
fprintf(stderr,"\n%: %d\n", s, WSAGetLastError())
void main(int argc, char **argv)
{
WORD wVersionRequested = MAKEWORD(1,1);
WSADATA wsaData;
int nRet;
short nPort;
// 检查主机和端口号的代码
if (argc != 3)
{
fprintf(stderr,"\nSyntax: client ServerName PortNumber\n");
return;
}
nPort = atoi(argv[2]);
// 初始化Winsock和检查socket版本
nRet = WSAStartup(wVersionRequested, &wsaData);
if (wsaData.wVersion != wVersionRequested)
{
fprintf(stderr,"\n Wrong version\n");
return;
}
//流客户端
StreamClient(argv[1], nPort);
// 释放的WinSock
WSACleanup();
}
void StreamClient(char *szServer, short nPort)
{
printf("\nStream Client connecting to server: %s on port: %d",
szServer, nPort);
// 查找服务器
LPHOSTENT lpHostEntry;
lpHostEntry = gethostbyname(szServer);
if (lpHostEntry == NULL)
{
PRINTERROR("gethostbyname()");
return;
}
// 创建TCP / IP流套接字
SOCKET theSocket;
theSocket = socket(AF_INET, // 地址族
SOCK_STREAM, // Socket 类型
IPPROTO_TCP); // 协议
if (theSocket == INVALID_SOCKET)
{
PRINTERROR("socket()");
return;
}
// 填写的地址结构
SOCKADDR_IN saServer;
saServer.sin_family = AF_INET;
saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
// 服务器的地址
saServer.sin_port = htons(nPort); // 端口号命令行
// 连接到服务器
int nRet;
nRet = connect(theSocket, // Socket
(LPSOCKADDR)&saServer, // 服务器地址
sizeof(struct sockaddr));// 服务器地址结构的长度
if (nRet == SOCKET_ERROR)
{
PRINTERROR("socket()");
closesocket(theSocket);
return;
}
// 发送数据到服务器
char szBuf[256];
strcpy(szBuf, "From the E037 Client");
nRet = send(theSocket, // 连接套接字
szBuf, // 数据缓冲区
strlen(szBuf), //数据长度
0); // Flags
if (nRet == SOCKET_ERROR)
{
PRINTERROR("send()");
closesocket(theSocket);
return;
}
//等待回复
nRet = recv(theSocket, // 连接套接字
szBuf, // 接收缓冲区
sizeof(szBuf), // 接收缓冲区的大小
0); // Flags
if (nRet == SOCKET_ERROR)
{
PRINTERROR("recv()");
closesocket(theSocket);
return;
}
//收到的数据显示
printf("\nData received: %s", szBuf);
closesocket(theSocket);
return;
}
上面是客户端,要求能输入要传输文件的路径,读取文件并传输
请把程序补充完整可以吗,解决可以再追加
sakura_xp可以再我的程序上做改动吗,filename可以通过输入字符串的形式输入的,不一定要在main中传入,
不过这样也可以 展开
// 非常简单,例如流客户端
// 工程与Server.cpp 。
// 该程序试图连接到服务器和端口
// 指定的命令行,打印服务器
// 一旦连接后,所需要的信息已启动它。
// 计划发送数据到服务器,等待回应
// 然后退出
// 编译和链接与wsock32.lib版本
// 通过服务器名称和端口号的命令行
//例如:客户名 2000年
#include <stdio.h>
#include <winsock.h>
#pragma comment(lib,"wsock32.lib")
// 函数原型
void StreamClient(char *szServer, short nPort);
// 助手宏观显示错误
#define PRINTERROR(s)
fprintf(stderr,"\n%: %d\n", s, WSAGetLastError())
void main(int argc, char **argv)
{
WORD wVersionRequested = MAKEWORD(1,1);
WSADATA wsaData;
int nRet;
short nPort;
// 检查主机和端口号的代码
if (argc != 3)
{
fprintf(stderr,"\nSyntax: client ServerName PortNumber\n");
return;
}
nPort = atoi(argv[2]);
// 初始化Winsock和检查socket版本
nRet = WSAStartup(wVersionRequested, &wsaData);
if (wsaData.wVersion != wVersionRequested)
{
fprintf(stderr,"\n Wrong version\n");
return;
}
//流客户端
StreamClient(argv[1], nPort);
// 释放的WinSock
WSACleanup();
}
void StreamClient(char *szServer, short nPort)
{
printf("\nStream Client connecting to server: %s on port: %d",
szServer, nPort);
// 查找服务器
LPHOSTENT lpHostEntry;
lpHostEntry = gethostbyname(szServer);
if (lpHostEntry == NULL)
{
PRINTERROR("gethostbyname()");
return;
}
// 创建TCP / IP流套接字
SOCKET theSocket;
theSocket = socket(AF_INET, // 地址族
SOCK_STREAM, // Socket 类型
IPPROTO_TCP); // 协议
if (theSocket == INVALID_SOCKET)
{
PRINTERROR("socket()");
return;
}
// 填写的地址结构
SOCKADDR_IN saServer;
saServer.sin_family = AF_INET;
saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
// 服务器的地址
saServer.sin_port = htons(nPort); // 端口号命令行
// 连接到服务器
int nRet;
nRet = connect(theSocket, // Socket
(LPSOCKADDR)&saServer, // 服务器地址
sizeof(struct sockaddr));// 服务器地址结构的长度
if (nRet == SOCKET_ERROR)
{
PRINTERROR("socket()");
closesocket(theSocket);
return;
}
// 发送数据到服务器
char szBuf[256];
strcpy(szBuf, "From the E037 Client");
nRet = send(theSocket, // 连接套接字
szBuf, // 数据缓冲区
strlen(szBuf), //数据长度
0); // Flags
if (nRet == SOCKET_ERROR)
{
PRINTERROR("send()");
closesocket(theSocket);
return;
}
//等待回复
nRet = recv(theSocket, // 连接套接字
szBuf, // 接收缓冲区
sizeof(szBuf), // 接收缓冲区的大小
0); // Flags
if (nRet == SOCKET_ERROR)
{
PRINTERROR("recv()");
closesocket(theSocket);
return;
}
//收到的数据显示
printf("\nData received: %s", szBuf);
closesocket(theSocket);
return;
}
上面是客户端,要求能输入要传输文件的路径,读取文件并传输
请把程序补充完整可以吗,解决可以再追加
sakura_xp可以再我的程序上做改动吗,filename可以通过输入字符串的形式输入的,不一定要在main中传入,
不过这样也可以 展开
2个回答
展开全部
调用程序时把要传输的文件名作为第三个参数。
Client.exe IPAddress Port FileName
然后在程序中判断argv[3]为文件名(如果想支持多文件发送,则argv4以后的也可以判断为要发送的文件,类似Client.exe IPAddress Port FileName1 FileName2)。
至于读写文件,其实很简单,用fopen或fstream均可。
以下是fopen的例子: (为了保持格式用了一个特殊的空格,如果要编译自己批量替换下)
int main(int argc, char* argv[])
{
��if (argc < 4)
��{
����ShowUage();
��}
��//初始化通讯的省略。
��
��for (size_t i = 3; i< argc; ++i )
��{
����char * fileName = argv[i];
����if (FileExist(fileName))
����{
������SendFileName(theSocket, fileName);
������SendFileSize(theSocket, fileName);
������SendFileContent(theSocket, fileName);
����}
��}
}
bool FileExist(char* fileName)
{
��FILE* fp = fopen(fileName, "rb");
��if (fp !=NULL)
��{
����fclose(fp);
����return TRUE;
��}
��return FALSE;
}
SendFileName(theSocket, char* fileName)
{
��size_t length = strlen(fileName);
��send( theSocket, &length, 4, 0 );
��send( theSocket, fileName, length, 0 );
}
SendFileSize(theSocket, char* fileName)
{
��FILE* fp = fopen(fileName, "rb");
��fseek(fp, 0, SEEK_END);
��size_t fileSize = ftell(fp);
��fclose(fp);
��send( theSocket, &fileSize, 4, 0 );
}
SendFile(theSocket, char* fileName)
{
��FILE* fp = fopen(fileName, "rb");
��unsigned char * buffer[512];
��while (!feof(fp))
��{
����size_t size�= fread(buffer, 1, sizeof(buffer), fp);
����send( theSocket, &buffer, size, 0 );
��}
}
对应接收端要另外实现RecvFileName,RecvFileSize,RecvFile这三个接口。
Client.exe IPAddress Port FileName
然后在程序中判断argv[3]为文件名(如果想支持多文件发送,则argv4以后的也可以判断为要发送的文件,类似Client.exe IPAddress Port FileName1 FileName2)。
至于读写文件,其实很简单,用fopen或fstream均可。
以下是fopen的例子: (为了保持格式用了一个特殊的空格,如果要编译自己批量替换下)
int main(int argc, char* argv[])
{
��if (argc < 4)
��{
����ShowUage();
��}
��//初始化通讯的省略。
��
��for (size_t i = 3; i< argc; ++i )
��{
����char * fileName = argv[i];
����if (FileExist(fileName))
����{
������SendFileName(theSocket, fileName);
������SendFileSize(theSocket, fileName);
������SendFileContent(theSocket, fileName);
����}
��}
}
bool FileExist(char* fileName)
{
��FILE* fp = fopen(fileName, "rb");
��if (fp !=NULL)
��{
����fclose(fp);
����return TRUE;
��}
��return FALSE;
}
SendFileName(theSocket, char* fileName)
{
��size_t length = strlen(fileName);
��send( theSocket, &length, 4, 0 );
��send( theSocket, fileName, length, 0 );
}
SendFileSize(theSocket, char* fileName)
{
��FILE* fp = fopen(fileName, "rb");
��fseek(fp, 0, SEEK_END);
��size_t fileSize = ftell(fp);
��fclose(fp);
��send( theSocket, &fileSize, 4, 0 );
}
SendFile(theSocket, char* fileName)
{
��FILE* fp = fopen(fileName, "rb");
��unsigned char * buffer[512];
��while (!feof(fp))
��{
����size_t size�= fread(buffer, 1, sizeof(buffer), fp);
����send( theSocket, &buffer, size, 0 );
��}
}
对应接收端要另外实现RecvFileName,RecvFileSize,RecvFile这三个接口。
Storm代理
2023-06-05 广告
2023-06-05 广告
StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,IP...
点击进入详情页
本回答由Storm代理提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询