socket服务器文件名和客户端一致,缘分锝天空的博客:嵌入式课程设计:socket通信模拟服务器客户端...

#include

//#include

#include

#include

#include

#pragma comment(lib,"ws2_32.lib")

using namespace std;

void initialization();

#define BUF_SIZE 1024

SOCKET s_accept;

SOCKADDR_IN accept_addr;

void sendFile() {

cout << "输入待传送的文件名:";

char filename1[100];

cin >> filename1;

//检查文件是否存在

const char *filename = filename1;

#pragma warning(suppress : 4996)

FILE *fp = fopen(filename, "rb");

if (fp == NULL)

{

printf("不能打开文件,按任何键退出!");

system("pause");

}

else

{

cout << "文件准备就绪" << endl;

}

//循环发送数据,直到文件结尾

char buffer[BUF_SIZE] = { 0 };//缓冲区

int nCount;

while ((nCount = fread(buffer, 1, BUF_SIZE, fp)) > 0)

{

send(s_accept, buffer, nCount, 0);

}

shutdown(s_accept, SD_SEND);文件读取完毕,断开输出流,向客户端发送FIN包,注意加头文件#include ,不然报错

recv(s_accept, buffer, BUF_SIZE, 0);//阻塞,等待客户端接收完毕

//关闭文件

fclose(fp);

}

void listen1(SOCKET s_server,int len, SOCKADDR_IN accept_addr) {

//设置套接字为监听状态

if (listen(s_server, SOMAXCONN) < 0) {

cout << "设置监听状态失败!" << endl;

WSACleanup();

}

else {

cout << "设置监听状态成功!" << endl;

}

cout << "服务端正在监听连接,请稍候...." << endl;

cout << "-------------------------------------" << endl;

//接受连接请求

len = sizeof(SOCKADDR);

s_accept = accept(s_server, (SOCKADDR*)&accept_addr, &len);

if (s_accept == SOCKET_ERROR) {

cout << "连接失败!" << endl;

WSACleanup();

}

cout << "连接就绪~" << endl;

}

int main() {

//定义长度变量

int len = 0;

//定义服务端套接字,接受请求套接字

SOCKET s_server;

//服务端地址客户端地址

SOCKADDR_IN server_addr;

initialization();

//填充服务端信息

server_addr.sin_family = AF_INET;

server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

//设置端口号

server_addr.sin_port = htons(1234);

//创建套接字

s_server = socket(AF_INET, SOCK_STREAM, 0);

//绑定套接字到一个IP地址和一个端口上

if (bind(s_server, (SOCKADDR*)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {

cout << "-----------------------------" << endl;

cout << "套接字绑定失败!" << endl;

WSACleanup();

}

else {

cout << "套接字绑定成功!" << endl;

}

//监听

listen1(s_server, len, accept_addr);

//发送文件

while (true)

{

sendFile();

}

//关闭套接字

closesocket(s_server);

closesocket(s_accept);

//释放DLL资源

WSACleanup();

return 0;

}

void initialization() {

//初始化套接字库

WORD w_req = MAKEWORD(2, 2);//版本号

WSADATA wsadata;

int err;

err = WSAStartup(w_req, &wsadata);

if (err != 0) {

cout << "初始化套接字库失败!" << endl;

}

else {

cout << " 计181李延胜" << endl;

cout << "--------------------------------------" << endl;

cout << "初始化套接字库成功!" << endl;

}

}

客户端程序:

#include

#include

#pragma comment(lib,"ws2_32.lib")

using namespace std;

#define BUF_SIZE 1024

void initialization();

int main() {

//定义服务端套接字,接受请求套接字

SOCKET s_server;

//服务端地址客户端地址

SOCKADDR_IN server_addr;

initialization();

//填充服务端信息

server_addr.sin_family = AF_INET;

//获取IP

cout << "-------------------------" << endl;

cout << "输入服务器的IP:";

//定义保存输入IP的字符数组

char Service_ip[15];

//遇到空格或者回车结束输入

cin >> Service_ip;

server_addr.sin_addr.S_un.S_addr = inet_addr(Service_ip);

//server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

server_addr.sin_port = htons(1234);

//创建套接字

s_server = socket(AF_INET, SOCK_STREAM, 0);

if (connect(s_server, (SOCKADDR*)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {

cout << "服务器连接失败!" << endl;

WSACleanup();

WSACleanup();

}

else {

cout << "服务器连接成功!" << endl;

}

while (1)

{

//输入文件名,看文件能否创建成功

char filename[100] = { 0 };

cout << "请输入要保存的文件:";

cin >> filename;

//以二进制创建文件

#pragma warning(suppress : 4996)

FILE *fp = fopen(filename, "wb");//以只写方式打开或新建一个二进制文件,只允许写数据

//循环接受

char buffer[BUF_SIZE] = { 0 };//文件保存缓冲区

int nCount = 0;

while ((nCount = recv(s_server, buffer, BUF_SIZE, 0)) > 0)//recv(对应的套接字,保存数据的地方,保存区的大小,第四个参数一般设置为 0

{

fwrite(buffer, nCount, 1, fp);//buffer输出数据的地址,nCount要输入内容的字节数,1位写入nCount字节的数据项的个数,fp为目标文件

}

if (fp == NULL)

{

cout << "接收文件失败!";

system("pause");

exit(0);

}

if (fp != NULL) {

cout << "文件接收成功!" << endl;

}

//打开并显示图片

ShellExecute(NULL,"open", filename, NULL, NULL, SW_SHOWNORMAL);

system("pause");

fclose(fp);

}

//关闭套接字

closesocket(s_server);

//释放DLL资源

WSACleanup();

return 0;

}

void initialization() {

//初始化套接字库

WORD w_req = MAKEWORD(2, 2);//版本号

WSADATA wsadata;

int err;

err = WSAStartup(w_req, &wsadata);

//检测版本号

if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {

cout << "套接字库版本号不符!" << endl;

WSACleanup();

}

else {

cout << "计181李延胜" << endl;

cout << "套接字库版本正确!" << endl;

}

}

?程序执行效果:

分别运行服务端和客户端,本机测试IP地址用127.0.0.1,局域网的话IP自己查IPv4对应的IP号(这里用本机回环测试演示)

a40c68e6afbb56c3e23ff6ecb7b21706.png

在客户端输入IP,然后回车可以看到连接是否成功

9f4a336a0fc9d12d3a3dfeb5b98f725f.png

?然后在服务端输入要传送的文件的路径:(这里演示传送一个视频,发送图片的方式也同理)

?

b738375b7d3afd332b422b01f4af93b7.png

?在客户端也输入要保存服务端传送过来文件的地址,保存在哪里可以自己定义,文件名也可以自己定义,但是文件格式一定要跟服务器传过来的文件的文件格式一致,即文件后缀名要一样

5e76d4f7eb127721c0961e8edba163c7.png

?文件传送成功后,程序会自动调用计算机的默认应用打开文件,即你是传送的文件,那么你收到文件后,系统会调用计算机的视频播放软件打开,如果是图片,那么就会用图片查看器打开,其他文件格式也同理

671cd83df8dbdb6b0b139217217593ba.png

?打开刚刚保存文件的路径,可以看到我们的文件传送过来了,两个文件大小一致

?

579abc6193e43a6c6f04a0e9e7e05b45.png

不同计算机连接同一个局域网也能实现文件传送呢,感兴趣的伙伴可以试一下哦!!

程序不足之处:一次运行只能传输一次文件,然后程序就结束退出了,需要再一次传送文件还得再重新先打开服务端然后打开客户端连接,?这个可以考虑把发送接收文件的代码块放到一个循环里,我今天简单尝试了一下,没有成功,时间问题,就没来得及继续完善这个不足了,感兴趣的伙伴可以把上面程序修改修改试试

以上程序的注释是个人对程序的一些理解,可能存在有错误的地方,欢迎大家留言指正!!

创作不易,喜欢的伙伴三连支持一下哦!

08a8df5669fdffc78197ff68e29b0e6d.png

?cs

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值