#include<WinSock2.h>//头文件
#include<stdbool.h>
#include<stdio.h>
#pragma comment(lib, "ws2_32.lib")//库文件
#pragma warning(disable:4996)
#define err(errMsg) printf("[error] %s failed,code %d \
line:%d\n ",errMsg,WSAGetLastError(),__LINE__)
#define PORT 8888 //0~1024一般不用
long g_fileSzie=2723;//文件大小
char* g_fileBuf;//保存文件数据
bool init_Socket()//初始化网络库
{
WSADATA wsadata;
if(0!=WSAStartup(MAKEWORD(2,2),&wsadata ))//windows异步套接字启动
{
printf("[error]WSAStarup failed,code %d\n", WSAGetLastError());
return false;
}
return true;
}
bool close_Socket()//关闭网络库
{
if (0!=WSACleanup())
{
printf("[error]WSACleanup failed,code %d", WSAGetLastError());
return false;
}
return true;
}
SOCKET create_serverSocket()
{
SOCKET fd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建一个空的socket
if (INVALID_SOCKET == fd)
{
printf("[error]socket failed,code %d", WSAGetLastError());
return INVALID_SOCKET;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);//把本地字节序转换为网络字节序
addr.sin_addr.S_un.S_addr = ADDR_ANY;//绑定本地任意IP
if (SOCKET_ERROR == bind(fd,(struct sockaddr *)&addr, sizeof(addr)))
{
printf("[error]bind failed,code %d", WSAGetLastError());
return INVALID_SOCKET;//-1
}
listen(fd, 10);
return fd;
}
//接受文件,保存文件
bool readFile(const char* fileName)
{
FILE* read = fopen(fileName, "rb");//文件名,二进制打开
if (!read)
{
perror("file open failed:\n");
return false;
}
//获取文件大小
fseek(read, 0, SEEK_END);//将文件位置指针移动到最后
g_fileSzie=ftell(read);//
fseek(read, 0, SEEK_SET);//移动到开头
printf("filesize :%d\n",g_fileSzie);
//分配内存
g_fileBuf = calloc(g_fileSzie, sizeof(char));//申请内存,初始化为0
if (!g_fileBuf)
{
return false;
}
//读入内存
fread(g_fileBuf, sizeof(char), g_fileSzie,read);
fclose(read);
return true;
}
//保存文件
bool saveFile(const char* fileName)
{
FILE* write = fopen(fileName, "wb");//文件名
if (!write)
{
perror("file open failed:\n");
return false;
}
//读入内存
fwrite(g_fileBuf, sizeof(char), g_fileSzie,write);
fclose(write);
return true;
}
//发送文件
bool sendFile(SOCKET s, const char* fileName)
{
readFile(fileName);
int ret = send(s, g_fileBuf, g_fileSzie, 0);
if (ret == SOCKET_ERROR)
{
err("sendFile");
return false;
}
printf("发送成功(%d)Byte\n", ret);
return true;
}
//接收文件
bool recvFile(SOCKET s,const char*fileName)
{
if (g_fileBuf == NULL)
{
g_fileBuf = calloc(g_fileSzie, sizeof(char));
if (!g_fileBuf)
{
return false;
}
}
int ret = recv(s, g_fileBuf, g_fileSzie, 0);
if (ret == 0)
{
printf("下线\n");
}
else if (ret < 0)
{
err("recv");
}
saveFile(fileName);
return false;
}
int main()
{
char recvBu[1024] = "今天周几?";
init_Socket();
SOCKET serfd = create_serverSocket();
printf("server create successed,wait client connet....\n ");//
SOCKET clifd = accept(serfd, NULL, NULL);
if (clifd==INVALID_SOCKET)
{
printf("[error]accept failed,code %d", WSAGetLastError());
}
sendFile(clifd,"./server.txt");
/* if (SOCKET_ERROR== send(clifd, recvBu, strlen(recvBu), 0))
{
printf("[error]hello send failed,code %d", WSAGetLastError());
}*/
/*char recvBuf[1024] = "";
int ret = recv(clifd, recvBuf, 1024, 0);
if (ret == 0)
{
printf("客户端正常下线下线\n");
}
else if (ret < 0)
{
err("recv");
}
puts(recvBuf);*/
closesocket(clifd);
closesocket(serfd);
close_Socket();
return 0;
}
评论0