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