计算机网络实验一 完整TCP/UDP协议 服务端客户端代码

实验报告

完整代码如下:

注: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 
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值