socket学习笔记——实现收发文件(Windows)
记录下来,供自己学习!
server.c
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
#define BUF_SIZE 1024
char buf[BUF_SIZE], message[BUF_SIZE], file_name[BUF_SIZE];
void error_handling(char* message);
int main(int argc, char* argv[])
{
WSADATA wsadata;
if (WSAStartup(MAKEWORD(, ), &wsadata) != )
error_handling("WSAStartup error"); SOCKET hServSock, hClntSock;
SOCKADDR_IN servAddr, clntAddr;
int clntAdrSize, length; if (argc != )
{
printf("usage:%s <ip> <port>\n", argv[]);
exit();
} hServSock = socket(PF_INET, SOCK_STREAM, );
if (hServSock == INVALID_SOCKET)
error_handling("socket error"); memset(&servAddr, , sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(atoi(argv[])); if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
error_handling("bind error");
if (listen(hServSock, ) == SOCKET_ERROR)
error_handling("listen error");
while ()
{
clntAdrSize = sizeof(clntAddr);
hClntSock = accept(hServSock, (struct sockaddr*)&clntAddr, &clntAdrSize);
if (hClntSock == SOCKET_ERROR)
error_handling("accept() error");
else
printf("connecting client......\n"); if (recv(hClntSock, message, sizeof(message), ) < )
error_handling("recv error"); strncpy(file_name, message, strlen(message)); FILE *fp;
fp = fopen(file_name, "r");
if (fp == NULL)
{
printf("fopen %s error\n", file_name);
exit();
}
else
{
while ((length = fread(buf, sizeof(char), , fp)) > )
{
if (send(hClntSock, buf, length, ) < )
error_handling("send error");
else
printf("send %s successful\n", file_name);
memset(message, ,sizeof(message));
memset(file_name, , sizeof(file_name));
}
fclose(fp);
}
closesocket(hClntSock);
}
closesocket(hServSock);
WSACleanup();
return ;
} void error_handling(char* message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit();
}
client.c
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
void error_handling(char* message);
#define BUF_SIZE 1024
int main(int argc, char* argv[])
{
WSADATA wsadata;
if (WSAStartup(MAKEWORD(, ), &wsadata) != )
error_handling("WSADTA error\n"); SOCKADDR_IN servAddr;
SOCKET hSocket;
char buf[BUF_SIZE];
char message[BUF_SIZE];
int length;
FILE* fp;
if (argc != )
{
printf("usage:%s <ip><port>", argv[]);
exit();
} hSocket = socket(PF_INET, SOCK_STREAM, );
if (hSocket == SOCKET_ERROR)
error_handling("socket error"); memset(&servAddr, , sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.S_un.S_addr = inet_addr(argv[]);
servAddr.sin_port = htons(atoi(argv[])); if (connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
error_handling("connect error");
else
printf("connecting......\n"); fp = fopen("F:\\2.txt", "w");
if (NULL == fp)
{
error_handling("fopen error");
} printf("enter file's name: ");
scanf("%s", message);
send(hSocket, message, sizeof(message), );
while ((length = recv(hSocket, buf, BUF_SIZE, )) > )
{
printf("%d", length);
if (fwrite(buf, sizeof(char), length, fp) < length)
{
printf("fwrite error");
exit();
}
else
{
printf("receve successful\n");
}
}
fclose(fp);
closesocket(hSocket);
WSACleanup();
return ;
}
void error_handling(char* message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit();
}
socket学习笔记——实现收发文件(Windows)的更多相关文章
- Windows phone 8 学习笔记(2) 数据文件操作
原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- thinkphp学习笔记2—入口文件
原文:thinkphp学习笔记2-入口文件 在thinkphp中有两个入口文件,一个是项目的入口文件,是index.php在主目录里面,还有一个是thinkphp框架的的入口文件,放在框架目录下面如: ...
- matlab学习笔记5--低级文件输入输出函数
一起来学matlab-matlab学习笔记5 低级文件输入输出函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢张 ...
- Windows phone 8 学习笔记(2) 数据文件操作(转)
Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方.本节主要讲解它们的用法以及相关限制性.另外包括本地数据库的使用方式 ...
- [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Socket 学习笔记 01 常用函数
常用方法 创建套接字: socket() 绑定本机端口: bind() 建立连接: connect(),accept() 侦听端口: listen() 数据传输: send() ...
- Python学习笔记之从文件中读取数据
10-1 Python 学习笔记:在文本编辑器中新建一个文件,写几句话来总结一下你至此学到的Python 知识,其中每一行都以“In Python you can”打头.将这个文件命名为learnin ...
- matlab学习笔记4--多媒体文件的保存和读取
一起来学matlab-matlab学习笔记4 数据导入和导出_2 多媒体文件的保存和读取 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用&g ...
随机推荐
- 黄聪:wordpress如何扩展TinyMCE编辑器,添加自定义按钮及功能
在functions.php文件里面添加: add_action( 'admin_init', 'my_tinymce_button' ); function my_tinymce_button() ...
- 1. redis简介
一. redis简介 Redis是一种面向"键/值"对数据类型的内存数据库,可以满足我们对海量数据的读写需求. redis的键只能是字符串,redis的值支持多种数据类型: (1) ...
- Git-Flow
Overview Git-Flow is a high-level command set wrapping low-level Git commands to support the "s ...
- DBA_Oracle冷备份和热备份的处理(概念)
2014-07-27 Created By BaoXinjian
- BEvent_客制化BusinessEvent通过Workflow Event接受消息传递(案例)
2014-08-03 Created By BaoXinjian
- NeHe OpenGL教程 第十三课:图像字体
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 0810HTML(表单)
图片热点: 规划出图片上的一个区域,可以做出超链接,直接点击图片区域就可以完成跳转的效果. <img src="a006.jpg" title="这是企鹅" ...
- 为什么引用不了App_Code里的类
在Web应用程序中不能通过右键项目-〉”添加“-〉”添加ASP.NET文件夹“方式添加 .因为Web应用程序中App_Code就不存在 .不过可以通过手动的方式创建,添加一个文件夹命名为App_Cod ...
- C++模板元编程 - 3 逻辑结构,递归,一点列表的零碎,一点SFINAE
本来想把scanr,foldr什么的都写了的,一想太麻烦了,就算了,模板元编程差不多也该结束了,离开学还有10天,之前几天部门还要纳新什么的,写不了几天代码了,所以赶紧把这个结束掉,明天继续抄轮子叔的 ...
- VLC开发相关
1. libvlc在release下时,会出错.解决办法 project->linker->optimization->references-> NOREF 2. Iibvl ...