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 ...
随机推荐
- CFLAGS,CPPFLAGS,CXXFLAGS in Makefile
CC 与 CXX: 这是 C 与 C++ 编译器命令.默认值一般是 “gcc” 与 “g++”. CPPFLAGS will be given to the C preprocessor ...
- 移动Oracle的用户表空间文件方法
原文:http://www.linuxidc.com/Linux/2014-07/104702.htm 1.以sys用户登录 sqlplus /nologSQL>connect s ...
- 【Mongodb】3.0 配置身份验证db.createUser()说明
原文地址:http://bbs.51cto.com/thread-1146654-1.html 定义: 创建一个数据库新用户用db.createUser()方法,如果用户存在则返回一个用户重复错误. ...
- css3旋转小三角
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [转][色彩 A] – 永远不要使用纯黑
原文地址:http://www.cgjoy.com/forum.php?mod=viewthread&tid=110762&extra=page%3D1%26filter%3Dtype ...
- linux下如何不编译opencv的某些模块
opencv非常庞大,有很多模块,但大部分情况我们可能只会用到三四个模块,此时如果还是直接cmake . & make,将会非常费时,尤其是部署时很麻烦. 所以需要去除掉一些不需要的模块,可参 ...
- Java利用MessageDigest提供的MD5算法加密字符串或文件
MD5是常用的加密算法,也经常用于校验信息完整,如文件的完整性.用术语讲,MD5是一种消息摘要算法(Message Digest Algorithm).另外还有一种常用的消息摘要算法SHA1.如果想了 ...
- RAC_Oracle集群服务安装Grid Infrastructure(案例)
2015-01-24 Created By BaoXinjian Thanks and Regards
- RAC_Oracle集群服务安装RAC(案例)
2015-01-23 Created By BaoXinjian Thanks and Regards
- 常见数组&字符串API及其应用场景总结
数组API: String(arr):将arr中每个元素转化为字符串,逗号连接 场景:用于鉴别数据有没有修改等. ps:String是万能的 toString 只能转换除null和unde ...