c多线程上传文件
Ⅰ VC如何实现多线程文件传输
发送端,将文件分成N份(如5),FILE1(0-a字节),FILE2(a-b字节),FILE3(b-c字节),FILE4(c-d字节),FILE5(d-文件长度)。 发送可以使用M个线程(如5),THREAD1负责发送FILE1,依次类推,发送的每个数据包包括如下内容:文件内容的长度,文件内容,文件内容起始点相对于整个文件的位置,文件内容相对于整个文件的位置。例如:文件A的总长度为100000字节,则可以先发送一个数据包给接收端,让其准备接收,接着发送 4000(长度),....(内容的二进制流),0(起始),4000(结束)。 接收端根据接收的包写文件即可。 http://www.vckbase.com/document/viewdoc/?id=448 看一下吧
Ⅱ windows下采用tcp协议的c语言多线程文件传输问题!!
多收几次嘛,直到收完为止
Ⅲ windows环境,多线程情况下,C语言向文件写入数据。
下面的程序,编译之后,你可以运行很多个实例,目前我将文件写在了D:\1.txt,每个程序写1000行数据,这些值你可以自己更改(比如 写在C:,每个程序写10000行等),等程序都写完后,你可以去文件中查看写文件的结果。补充一下,我是在VC6.0环境中写的,所以windows.h,如果你不是在这个环境中的话,可能需要修改一些定义,比如DWORD等。其他的API都是windows平台提供的API;
#include <stdio.h>
#include "windows.h"
int main()
{
//获取进程ID,因为你希望是多个进程运行同时写一个文件,所以,我们打印出进程ID
DWORD dwProcessID = GetCurrentProcessId();
//初始化我们要写入文件中的内容,及该内容长度;
char szContent[100] = {0};
sprintf(szContent,"process[%u] write file\r\n",dwProcessID);
DWORD dwContentLen = strlen(szContent);
//创建互斥量,这样可以进行进程间的互斥,当然用这个也可以做线程间的互斥
HANDLE hMutex = CreateMutex(NULL,FALSE,"MyFileMutex");
if (NULL == hMutex)
{
printf("[%u]Create/Open Mutex error!\r\n",dwProcessID);
return 1;
}
//创建或打开文件
HANDLE hFile = CreateFile("D:\\1.txt",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ,NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_ARCHIVE,
NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
printf("[%u]Creat/Open file error!\r\n",dwProcessID);
return 1;
}
//循环写入文件
for(int i = 0; i < 1000 ; i++)
{
//等待临界资源,即锁定文件
WaitForSingleObject(hMutex,INFINITE);
printf("Process[%u] Get the signal\r\n",dwProcessID);
DWORD len = 0;
//因为是共享写文件,即多个程序写一个文件,所以一定要将文件指针偏移到尾部
SetFilePointer(hFile,0,NULL,FILE_END);
//写入文件
BOOL rnt = WriteFile(hFile,szContent,dwContentLen,&len,NULL);
if (rnt == FALSE)
{
printf("Process[%u] Fail to write file\r\n",dwProcessID);
}
//释放互斥量,解除锁定
ReleaseMutex(hMutex);
//加个Sleep便于我们中间观察结果
Sleep(30);
}
CloseHandle(hMutex);
CloseHandle(hFile);
return 0;
}
应你要求,我把AIP中的宏定义解释如下:
HANDLE hFile = CreateFile("D:\\1.txt",
GENERIC_READ | GENERIC_WRITE,//表示程序对该文件有读和写的权限
FILE_SHARE_WRITE | FILE_SHARE_READ,//表示可以多个程序共享读和写的权限
NULL,
OPEN_ALWAYS,//表示打开该文件,如果该文件不存在,则创建该文件
FILE_ATTRIBUTE_ARCHIVE,//文件的属性为存档
NULL);
WaitForSingleObject(hMutex,INFINITE);
//INFINITE表示永远等待,直到hMutex有信号为止
SetFilePointer(hFile,0,NULL,FILE_END);
//FILE_END表示从文件尾部开始偏移;实际此举就是将文件指针偏移到文件尾部;
Ⅳ c语言文件读写 多线程
主线程读的是A文件,次线程写的是B文件,两者不冲突。4K的buffer已经算很小了。重点是主次线程共享的数据需要做同步,所以才造成了要等待的现象。你说的类似消费者和生产者模型。
Ⅳ 编写了两个.c文件,其中一个用到了多线程,makefile文件怎么写,怎么加
两个c文件是要变成同一个可执行程序的话
那么ldflags加上-lpthread就可以了。
因为ld是在将两个.o合成可执行文件用的。
如果是分别编成两个可执行文件,建议写两个makefile
使用不同的ld选项。
Ⅵ 用C语言如何同时传输N个文件
既然单个的都没问题了,多个也就好办了
想传多个就在你的程序里加个循环,循环里添加传输的代码
想同时传的话就得多线程了,把你的传单个的代码写成一个线程函数,同时起多个线程都高用这个函数就行了
Ⅶ 多线程上传,多线程下载,多线程抓取页面,会不会丢失文件 压缩/解压造成文件错误....
丢文件、压缩、解压缩错误,稳定,跟多线程都没有本质的关系,它本身只是让程序并行运行的手段而已。
为什么多线程总给人不稳定的感觉呢,其实是因为多线程程序比较难控制,说句行话就是多线程同步不容易做好。
传统的单线程程序执行是顺序执行的,其执行的流程、结果是可以预知的,所以代码相对来说比较容易写,但是多线程的执行顺序是无序的,比如 你顺序启动 A,B,C线程,但是有可能 C先完成,然后再到A,B(OR B,A),这样,你的后续程序就很难写了。
所以,多线程程序学习的关键就在线程同步控制上,这个工作做好了,多线程程序就会稳定,且有更高的效率。
既然是linux下远程传输文件内容,文件数据量较大,而且要保证传输质量的话,自然是选择TCP来传输。
推荐API自然是socket,至于例子,http://memorymyann.javaeye.com/admin/blogs/619855
这只是一个很简单的例子,多进程并发TCP传输需要注意很多问题,不过,在程序运行后会慢慢凸显出来,慢慢改就是。