【计算机网络原理】【C语言】用UDP协议实现文件传输

该程序在Windows 7和Linux环境下通过UDP协议实现文件的传输,支持视频、图片等各类文件,可在Windows与Linux间进行文件交换,但不支持中文文件名。程序包含服务器端和客户端,能发送和接收文件,需要输入对方IP地址。同时提供了在Windows和Linux下查看IP地址的方法。
摘要由CSDN通过智能技术生成

1、本程序在 Windows 7 Visual Studio 2015 和 Linux Ubuntu 15.04 GCC 5.11 下均编译运行测试通过,

2、本程序可以传送任何形式的文件,包括视频和图片,支持 Windows 和 Linux 之间传送文件,如果要在 Windows 和 Linux 之间传送文件,文件名不能出现中文。

3、本程序支持无线 WiFi,支持 USB 收发器,但仅支持局域网内传送文件。

4、本程序包括服务器端和客户端,既可以发送文件又可以接收文件,传送文件需要输入对方的 IP 地址。如果要在同一台机器上测试需要同时打开两个程序。

Windows 下查看本机 IP 地址,在命令提示符中输入如下命令:

ipconfig

Linux 下查看本机 IP 地址,在终端中输入如下命令:

ifconfig

以下是程序代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

#ifdef _MSC_VER
	#include<winsock2.h>
	#include<windows.h>
	#pragma comment(lib, "ws2_32.lib")
#else
	#include<pthread.h>
	#include<unistd.h>
	#include<signal.h>
	#include<sys/socket.h>
	#include<arpa/inet.h>
#endif

// 存放发送接收字符数组大小
#define SIZEA 65501
// 每次发送接收字节数
#define SIZEB 65500

typedef struct sockaddr_in SockAddrIn;
SockAddrIn serverAddr, remoteAddr, clientAddr;

// 端口号
int iServerPort, iClientPort;
// 新建 socket 信息
int iUDP;

// 字符串转整型
int strToInt(char* acStr)
{
	int i, iIndex = 0, iNum = 0, iSize = 0;
	if(acStr[0] == '+' || acStr[0] == '-')
		iIndex = 1;

	for(iSize=iIndex; ; iSize++)
		if(acStr[iSize] < '0' || acStr[iSize] > '9')
			break;

	for(i=iIndex; i<iSize; i++)
		iNum += (int)pow(10, iSize - i - 1) * (acStr[i] - 48);

	if(acStr[0] == '-')
		iNum = - iNum;

	return iNum;
}

// 整型转字符串
void intToStr(int iInt, char* acStr)
{
	int iIndex = 0, iSize, iNum, iBit, i, j;

	if(iInt < 0)
	{
		acStr[0] = '-';
		iInt = - iInt;
		iIndex = 1;
	}
	for(i=0; ; i++)
		if(iInt < pow(10, i))
			break;
	iSize = i;

	for(i=0; i<iSize; i++)
	{
		iNum = pow(10, iSize - i - 1);
		iBit = iInt/iNum;
		iInt -= iNum*iBit;
		acStr[i + iIndex] = iBit + 48;
	}
	if(iSize != 0)
		acStr[iSize + iIndex] = '\0';
	else
	{
		acStr[0] = '0';
		acStr[1] = '\0';
	}
}

void sleepUDP(int iSleep)
{
#ifdef _MSC_VER
	Sleep(iSleep);
#else
	usleep(iSleep*1000);
#endif
}

void openUDP(char* acIpAddr)
{
#ifdef _MSC_VER
	// Winsows 启用 socket
	WSADATA wsadata;
	if(WSAStartup(MAKEWORD(1, 1), &wsadata) == SOCKET_ERROR)
	{
		printf("启用 socket 失败\n");
		exit(0);
	}
#endif

	// 新建 socket
	if((iUDP = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
	{
		printf("新建 socket 失败\n");
		exit(0);
	}

	// 清零
	memset(&serverAddr, 0
  • 4
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值