完整代码如下:
注:pch.h是Visual Studio需要的预编译头,可以删除
// UDP_server.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#pragma comment(lib,"ws2_32.lib")
#define buffer_length 512 //接收缓存大小
#define packet_size 53000
using namespace std;
void main()
{
WSADATA wsadata;
SOCKET sSocket;
int ilen;
int irecv;
char recv_buf[buffer_length]; //定义接收缓存
//服务器和客户SOCKETADDR地址结构
struct sockaddr_in seradd, cliadd;
if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0)
{
printf("failed to load winsocket\n");
return;
}
sSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (sSocket == INVALID_SOCKET)
{
printf("socket() failed:%d\n", WSAGetLastError());
return;
}
//初始化服务器SOCKET地址结构
seradd.sin_family = AF_INET;
seradd.sin_port = htons(8000);
//seradd.sin_addr.s_addr=htonl(INADDR_ANY);
seradd.sin_addr.s_addr = inet_addr("192.168.43.118");
if (bind(sSocket, (LPSOCKADDR)&seradd, sizeof(seradd)) == SOCKET_ERROR)
{
printf("地址绑定时出错:%d\n", WSAGetLastError());
return;
}
ilen = sizeof(cliadd);
//初始化接收缓冲区
memset(recv_buf, 0, sizeof(recv_buf));
while (1)
{
cout << "初始化OK!" << endl;
//在此函数中cli为传出参数
irecv = recvfrom(sSocket, recv_buf, buffer_length, 0, (struct sockaddr*)&cliadd, &ilen);
if (irecv == SOCKET_ERROR)
{
printf("接收出错%d\n", WSAGetLastError());
return;
}
else if (irecv == 0)
break;
else
{
printf("%s--", recv_buf);
printf("Server received from Client ip:[%s],port:[%d]\n", inet_ntoa(cliadd.sin_addr), ntohs(cliadd.sin_port));
}
FILE *fp;
char file_name[20];
//char sendData[400000];
int ret;
cout << "------------------------------SENDING...------------------------------" << endl;
cout << "Please input the filename:" << endl;
cin >> file_name;
//传送文件名
sendto(sSocket, file_name, strlen(file_name), 0, (sockaddr *)&cliadd, ilen);
if (!(fp = fopen(file_name, "rb")))
{
cout << "File " << file_name << " can't open" << endl;
continue;
}
int length;
fseek(fp, 0, SEEK_END);
length = ftell(fp);
cout <<"length"<< length << endl;
rewind(fp);
char *sendData = (char*)malloc(length);
memset(sendData, 0x00,length);
//传送长度
char leng_char[20];
itoa(length, leng_char, 10);
sendto(sSocket,leng_char, strlen(leng_char), 0, (sockaddr *)&cliadd, ilen);
//传送文件
int length_read;
length_read = fread(sendData, sizeof(char), length, fp);
cout << "length_read=" << length_read << endl;
char *dataptr = sendData;
ret = sendto(sSocket, dataptr, packet_size, 0, (sockaddr *)&cliadd, ilen);
int i = 1;
int send_no = (length / packet_size);
while (i==send_no||i<send_no)
{
//cout << "length=" << length << endl;
//cout << sendData << endl;
dataptr += packet_size;
Sleep(50);
if (ret == SOCKET_ERROR || ret == 0)
{
cout << ret << endl;
cout << "wrong" << endl;
return ;
}
cout <<i<< "send successful!" << endl;
if (i < length/packet_size) {
ret