c語言文件傳輸
㈠ c語言 UDP文件傳輸
void ThreadReceive(PVOID param)
{
static struct sockaddr_in server; // 綁定地址
static SOCKET ListenSocket; // 等待接收數據的socket
char buf[4096];
int len = sizeof(client);
int result;
ListenSocket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (ListenSocket == INVALID_SOCKET)
{
perror("opening stream socket");
exit(0);
}
server.sin_family = PF_INET;
server.sin_addr.s_addr = htonl( INADDR_ANY ); // 任何地址
server.sin_port = htons(LOCAL_PORT);
if (SOCKET_ERROR == bind(ListenSocket, (struct sockaddr *)&server, sizeof(server)) )
{
printf("Error: 綁定失敗\n");
exit(1);
closesocket( ListenSocket );
}
printf("socket port %d \n", ntohs(server.sin_port));
while(TRUE)
{
//接收數據
result = recvfrom(ListenSocket, buf, sizeof(buf)-1, 0, (struct sockaddr *)&client, &len);
if ( result > 0 )
{
buf[result] = 0;
inet_ntoa(client.sin_addr), ntohs(client.sin_port));
}
}
closesocket(ListenSocket);
}
㈡ C語言安全文件傳輸程序設計。
安全文件傳輸程序?就是TCP傳輸吧:隨便寫了下,好多地方都沒怎麼驗證,比如待發送的文件是否存在;代碼如下(此程序用於WINDOWS,我用的是VC調試的,linux下方法略有不同)文件接收端:#pragma comment(lib,"ws2_32.lib")#include <stdio.h>
#include <io.h>
#include <winsock2.h>
#include <fcntl.h>
#include <sys\stat.h>
int recv_file(SOCKET sock)
{
char buffer[1024] = {0};
int name_len;
/*首先讀取sizeof(int) 即4個位元組的內容,伺服器發送文件名之前會把該文件名的長度發送過來*/
if (recv(sock,(char *)&name_len,sizeof(int),0) < 0)
{
printf("遠程伺服器斷開");
return -1;
}
/*接收即將傳輸文件的文件名*/
if (recv(sock,buffer,name_len,0))
{
printf("遠程伺服器斷開");
return -1;
}
/*創建該文件,最好此處加上判斷,該文件是否已經存在*/
int fd = open(buffer,O_RDWR|O_CREAT ,S_IFMT );
if (fd < 0)
{
printf("文件創建失敗\n");
return -1;
}
int recv_count = 0;
/*從套接字循環讀取文件內容*/
while ((recv_count = recv(sock,buffer,sizeof(1024),0))>0)
{
/*將讀取到的內容保存至文件,recv_count為從網路上讀取到得位元組數,然後原數保存至文件*/
write(fd,buffer,recv_count);
}
printf("文件接收完成,成功保存至當前目錄下\n");
return 0;
}
void main()
{
WSADATA wsa_data;
/*windows 下使用sock 必須調用這個函數,0x0202是一個版本號*/
WSAStartup(0x0202,&wsa_data); SOCKET s_sock;
/*創建套接字*/
s_sock = socket(AF_INET,SOCK_STREAM,0); /*定義本機綁定套接字需要的IPV4地址*/
sockaddr_in se_addr;
se_addr.sin_family = AF_INET;
se_addr.sin_port = htons(1024);/*指定埠號1024*/
se_addr.sin_addr.S_un.S_addr = INADDR_ANY;/*綁定本機任意網卡IP*/ /*將前兩步創建的套接字和IP地址綁定*/
bind(s_sock,(sockaddr*)&se_addr,sizeof(sockaddr)); /*開始啟動監聽服務*/
if (listen(s_sock,10)<0)
{
int err = GetLastError();
}
sockaddr_in from_addr;
int addr_len = sizeof(from_addr);
/*等待發送文件伺服器連接,此為阻塞函數*/
SOCKET temp_sock = accept(s_sock,(sockaddr *)&from_addr,&addr_len); /*有伺服器連接到本機,調用接收文件函數*/
recv_file(temp_sock);
} 文件發送端:#pragma comment(lib,"ws2_32.lib")#include <stdio.h>
#include <io.h>
#include <winsock2.h>
#include <fcntl.h>
#include <sys\stat.h>
int send_file(SOCKET sock,char *name)
{
int fd = open(name,O_RDWR ,S_IFMT );
if (fd < 0)
{
printf("文件打開失敗\n");
return -1;
} int name_len = strlen(name);
/*首先發送文件名的長度*/
send(sock,(char *)&name_len,sizeof(int),0);
/*發送文件名*/
send(sock,name,name_len,0);
char buffer[1024] = {0};
int read_count = 0;
/*循環從文件中讀取,然後寫入到套接字,發送到網路*/
while ((read_count = read(fd,buffer,sizeof(1024)))>0)
{
send(sock,buffer,read_count,0);
}
printf("文件發送完成\n");
return 0;
}
void main(int argc,char *argv[])
{
WSADATA wsa_data;
WSAStartup(0x0202,&wsa_data);
SOCKET s_sock;
s_sock = socket(AF_INET,SOCK_STREAM,0);
sockaddr_in to_addr;
to_addr.sin_family = AF_INET;
to_addr.sin_port = htons(1024);
/*指定接收文件IP為本機(127.0.0.1為本機IP),如其他主機請更改此IP,正常來說,IP應寫入配置文件*/
to_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
char file_name[256] = {0};
printf("請輸入要發送的文件名,並確保該文件存在於當前目錄下\n");
scanf("%s",file_name); /*連接接收文件的電腦*/
if (connect(s_sock,(sockaddr *)&to_addr,sizeof(sockaddr)) < 0)
{
printf("鏈接接受文件電腦失敗\n");
return;
} /*調用發送文件函數*/
send_file(s_sock,file_name);
}
㈢ linux下的文件傳輸C語言實現
strncpy這個庫函數的實現就是strncpy(目標, 源, 字元個數);第3個參數用於防止越界的;返回值是char *類型;
strncpy(file_name, buffer,strlen(buffer) > FILE_NAME_MAX_SIZE ?FILE_NAME_MAX_SIZE : strlen(buffer));
根據變數命名規則,估計大概的意思就是從輸入(buffer)中獲取文件名;如果這個文件名的長度大於FILE_NAME_MAX_SIZE,那麼截取FILE_NAME_MAX_SIZE個字元作為文件名;否則buffer中的字元全是文件名
㈣ C語言編寫TCP的文件傳輸
粗略看了一下,你是用戶的是TCP不是UDP,注意一點TCP可靠安全但是需要你自己手動處理粘包問題.你要是想學網路編程,就需要學會分析和定製協議.我建議你先去看看TFTP的網路協議.所謂的通信就是我發請求給你,你給我應答(請求成功還是失敗).你剛學網路編程,直接是使用tcp不是很合適,你可以去看看TFTP的協議(向伺服器請求下載或者上傳文件).復雜一點的程序一搬都需要定製網路協議,tcp則還需要處理粘包問題.如果你想學,可以和我聯系,我可以發你資料→_→
㈤ 請教用C語言編的藉助UDP協議實現的文件傳輸的程序
server代碼
#include<sys/socket.h>;
#include<string.h>;
#include<netinet/in.h>;
#include<stdio.h>;
#include<stdlib.h>;
#include<fcntl.h>;
#include<sys/stat.h>;
#include<unistd.h>;
#include<errno.h>;
#include<sys/select.h>;
#include<sys/time.h>;
#include<unistd.h>;
#include<sys/types.h>;
#define SERV_PORT 2500
#define MAX_SIZE 1024*40
void recvUDP(char name[20],int sockfd)
{
int ret,fd;
mode_t fdmode = (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
char mesg[MAX_SIZE];
fd_set rdset;
struct timeval tv;
int rlen,wlen;
int i;
fd = open(name,O_RDWR|O_CREAT|O_APPEND,fdmode);
if(fd == -1)
{
printf("open file %s error:%n",name,strerror(errno));
exit(-1);
}
for(i=0;;i++)
{
tv.tv_sec = 1;
tv.tv_usec = 0;
FD_ZERO(&rdset);
FD_SET(sockfd,&rdset);
ret = select(sockfd+1,&rdset,NULL,NULL,&tv);
if(ret == -1)
{
printf("select error %s\n",strerror(errno));
exit(-1);
}
else if(ret==0)
{
printf("select timeout,continue circle\n");
continue;
}
if(FD_ISSET(sockfd,&rdset))
{
memset(mesg,0,MAX_SIZE);
rlen = read(sockfd,mesg,MAX_SIZE);
if(rlen <=0 )
{
printf("read error %s\n",strerror(errno));
exit(-1);
}
if(!strcmp(mesg,"end"))
{
printf("recv end.\n");
break;
}
wlen = write(fd,mesg,rlen);
if(wlen != rlen )
{
printf("write error %s\n",strerror(errno));
exit(-1);
}
}
printf("The %d times write\n",i);
}
close(fd);
}
int main(int argc, char *argv[])
{
int sockfd;
int r;
struct sockaddr_in servaddr;
sockfd = socket(AF_INET,SOCK_DGRAM,0); /*create a socket*/
/*init servaddr*/
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
/*bind address and port to socket*/
if(bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) == -1)
{
perror("bind error");
exit(-1);
}
r = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, r & ~O_NONBLOCK);
recvUDP(argv[1],sockfd);
return 0;
}
client代碼
#include<sys/types.h>;
#include<sys/socket.h>;
#include<string.h>;
#include<netinet/in.h>;
#include<stdio.h>;
#include<stdlib.h>;
#include<arpa/inet.h>;
#include<fcntl.h>;
#include<sys/stat.h>;
#include<errno.h>;
#include<sys/sysinfo.h>;
#include<sys/select.h>;
#include<sys/time.h>;
#include<unistd.h>;
#define MAX_SIZE 1024*40
#define SERV_PORT 2500
void connectUDP(char name[20],int sockfd,struct sockaddr *pservaddr,socklen_t servlen)
{
char buf[MAX_SIZE];
fd_set wrset;
struct timeval tv;
int rlen,wlen;
int fd;
int ret;
int i;
if(connect(sockfd,(struct sockaddr *)pservaddr,servlen) == -1)
{
perror("connet error");
exit(1);
}
else
printf("connect server ok!\n");
fd = open(name,O_RDONLY);
if(fd==-1)
{
printf("fopen error %s\n",strerror(errno));
exit(-1);
}
i=0;
while(1)
{
tv.tv_sec = 1;
tv.tv_usec = 0;
FD_ZERO(&wrset);
FD_SET(sockfd,&wrset);
ret = select(sockfd+1,NULL,&wrset,NULL,&tv);
if(ret == -1)
{
printf("select error %s\n",strerror(errno));
exit(-1);
}
else if(ret==0)
{
printf("select timeout,continue circle\n");
continue;
}
memset(buf,0,MAX_SIZE);
if(FD_ISSET(sockfd,&wrset))
{
rlen = read(fd,buf,MAX_SIZE);
if(rlen <0)
{
printf("fread data error %s\n",strerror(errno));
exit(-1);
}
else if(rlen==0)
{
wlen = write(sockfd,"end",3);
if(wlen !=3)
{
printf("write end error\n",strerror(errno));
exit(-1);
}
printf("all complete\n");
close(fd);
close(sockfd);
exit(0);
}
wlen = write(sockfd,buf,rlen);
if(wlen != rlen)
{
printf("write data to sockfd error:%s\n",strerror(errno));
exit(-1);
}
i++;
usleep(500);
printf("The %d times read\n",i);
}
}
}
int main(int argc ,char *argv[])
{
char *fh;
struct sysinfo s_info;
float time1,time2;
int error1,error2;
int sockfd;
struct stat fsize;
struct sockaddr_in servaddr;
error1= sysinfo(&s_info);
time1 = s_info.uptime;
int r;
if(argc != 3)
{
printf("useage:udpclient<IPaddress>;\n");
exit(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family= AF_INET;
servaddr.sin_port = htons(SERV_PORT);
if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr) <= 0)
{
printf("[%s]is not a valid IPaddress\n",argv[1]);
exit(1);
}
fh = argv[2];
sockfd =socket(AF_INET,SOCK_DGRAM,0);
r = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, r & ~O_NONBLOCK);
connectUDP(argv[2],sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
fprintf(stderr,"ServerIP:\t%s\n",argv[1]);
if(stat(argv[2],&fsize) == -1)
perror("failed to get fiel statusi\n");
else
fprintf(stderr,"file name:\t%s\nfile size:\t%dK\n",argv[2],fsize.st_size/1024);
error2=sysinfo(&s_info);
time2 = s_info.uptime;
printf("tranfice file time =%fs\n",(time2-time1));
}
makefile
all:send recv
send:send.c
gcc -Wall send.c -o send
recv:recv.c
gcc -Wall recv.c -o recv
clean:
rm -rf send recv
㈥ 請教用C語言編的藉助UDP協議實現的文件傳輸的程序
本程序在 Windows 7 Visual Studio 2015 和 Linux Ubuntu 15.04 GCC 5.11 下均編譯運行測試通過。
本程序支持 Windows 和 Linux 之間傳送文件,如果要在 Windows 和 Linux 之間傳送文件,文件名不能出現中文。
本程序支持無線 WiFi,支持 USB 收發器,但僅支持區域網內傳送文件,傳送文件需要輸入對方的 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>
#pragmacomment(lib,"ws2_32.lib")
#else
#include<pthread.h>
#include<unistd.h>
#include<signal.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#endif
//存放發送接收字元數組大小
#defineSIZEA65501
//每次發送接收位元組數
#defineSIZEB65500
typedefstructsockaddr_inSockAddrIn;
SockAddrInserverAddr,remoteAddr,clientAddr;
//埠號
intiServerPort,iClientPort;
//新建socket信息
intiUDP;
//字元串轉整型
intstrToInt(char*acStr)
{
inti,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;
returniNum;
}
//整型轉字元串
voidintToStr(intiInt,char*acStr)
{
intiIndex=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]='