用socket实现文件传输(c语言socket文件传输)

      最后更新:2023-11-01 02:56

      iOS 中设备之间 socket 传文件应该怎么实现

      socket是比较底层的通讯方式,只是建立了一个连接通道,具体上面传输什么样的数据,按照什么格式传输,需要你自己定义。换句话说,你需要自己定义一个文件传输协议。例如,要定义数据包的大小,要定义每个数据包的格式,定义纠错机制,网络中断后如何恢复等等。大文件要拆分成数据包来传输,接收方要把收到的数据包再组装起来。文件名这些信息也做为原始数据的一部分通过数据包传过去,只不过跟文件内容的数据包类型不一样而已。 但是,实现这样一个传输协议是比较麻烦和容易出错的,象传文件这种逻辑比较简单的操作一般没必要在socket层直接操作。iOS提供了CFStream接口,适合文件这种数据流的传输。iOS本身的FTP和HTTP协议栈的实现也是使用CFStream API,而不是直接操作socket的。
      sock_stream 是有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料(如文件)传送。 sock_dgram 是无保障的面向消息的socket , 主要用于在网络上发广播信息。 SOCK_STREAM是基于TCP的,数据传输比较有保障。SOCK_DGRAM是基于UDP的,专门用于局域网,基于广播 SOCK_STREAM 是数据流,一般是tcp/ip协议的编程,SOCK_DGRAM分是数据抱,是udp协议网络编程 解释一下: 关于UDP 1、UDP协议适用端口分辨运行在同一台设备上的多个应用程序,UDP有不提供数据报分组、组装和不能对数据包进行排序的缺点。 也就是说,当报文发送之后,是无法得知其是否安全完整到达的。 2、在网络质量令人不十分满意的环境下,UDP协议数据包丢失会比较严重。 3、但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。 关于TCP 1、TCP提供端到端、全双工通信;采用字节流方式,如果字节流太长,将其分段;提供紧急数据传送功能。 2、TCP特性: (1)面向连接的传输; (2)端到端的通信; (3)高可靠性,确保传输数据的正确性,不出现丢失或乱序; (4)全双工方式传输; (5)采用字节流方式,即以字节为单位传输字节序列; (6)紧急数据传送功能。 所以如果你需要传输的数据是准确的,建议采用TCP,也就是sock_stream 如果你传输的是视频音频等数据,丢几个包也无所谓的,可以采用UDP,也就是sock_dgram
      iOS 中设备之间 socket 传文件应该怎么实现

      利用java socket实现文件传输

      1.服务器端 package sterning;import java.io.BufferedInputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.net.ServerSocket;import java.net.Socket;public class ServerTest {int port = 8821;void start() {Socket s = null;try {ServerSocket ss = new ServerSocket(port);while (true) {// 选择进行传输的文件String filePath = "D:\lib.rar";File fi = new File(filePath);System.out.println("文件长度:" + (int) fi.length());// public Socket accept() throws// IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。s = ss.accept();System.out.println("建立socket链接");DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));dis.readByte();DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));DataOutputStream ps = new DataOutputStream(s.getOutputStream());//将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java 4th里有现成的代码。ps.writeUTF(fi.getName());ps.flush();ps.writeLong((long) fi.length());ps.flush();int bufferSize = 8192;byte[] buf = new byte[bufferSize];while (true) {int read = 0;if (fis != null) {read = fis.read(buf);}if (read == -1) {break;}ps.write(buf, 0, read);}ps.flush();// 注意关闭socket链接哦,不然客户端会等待server的数据过来,// 直到socket超时,导致数据不完整。fis.close();s.close();System.out.println("文件传输完成");}} catch (Exception e) {e.printStackTrace();}}public static void main(String arg[]) {new ServerTest().start();}}2.socket的Util辅助类package sterning;import java.net.*;import java.io.*;public class ClientSocket {private String ip;private int port;private Socket socket = null;DataOutputStream out = null;DataInputStream getMessageStream = null;public ClientSocket(String ip, int port) {this.ip = ip;this.port = port;}/** *//*** 创建socket连接** @throws Exception* exception*/public void CreateConnection() throws Exception {try {socket = new Socket(ip, port);} catch (Exception e) {e.printStackTrace();if (socket != null)socket.close();throw e;} finally {}}public void sendMessage(String sendMessage) throws Exception {try {out = new DataOutputStream(socket.getOutputStream());if (sendMessage.equals("Windows")) {out.writeByte(0x1);out.flush();return;}if (sendMessage.equals("Unix")) {out.writeByte(0x2);out.flush();return;}if (sendMessage.equals("Linux")) {out.writeByte(0x3);out.flush();} else {out.writeUTF(sendMessage);out.flush();}} catch (Exception e) {e.printStackTrace();if (out != null)out.close();throw e;} finally {}}public DataInputStream getMessageStream() throws Exception {try {getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));return getMessageStream;} catch (Exception e) {e.printStackTrace();if (getMessageStream != null)getMessageStream.close();throw e;} finally {}}public void shutDownConnection() {try {if (out != null)out.close();if (getMessageStream != null)getMessageStream.close();if (socket != null)socket.close();} catch (Exception e) {}}}3.客户端package sterning;import java.io.BufferedOutputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.FileOutputStream;public class ClientTest {private ClientSocket cs = null;private String ip = "localhost";// 设置成服务器IPprivate int port = 8821;private String sendMessage = "Windwos";public ClientTest() {try {if (createConnection()) {sendMessage();getMessage();}} catch (Exception ex) {ex.printStackTrace();}}private boolean createConnection() {cs = new ClientSocket(ip, port);try {cs.CreateConnection();System.out.print("连接服务器成功!" + "n");return true;} catch (Exception e) {System.out.print("连接服务器失败!" + "n");return false;}}private void sendMessage() {if (cs == null)return;try {cs.sendMessage(sendMessage);} catch (Exception e) {System.out.print("发送消息失败!" + "n");}}private void getMessage() {if (cs == null)return;DataInputStream inputStream = null;try {inputStream = cs.getMessageStream();} catch (Exception e) {System.out.print("接收消息缓存错误n");return;}try {//本地保存路径,文件名会自动从服务器端继承而来。String savePath = "E:\";int bufferSize = 8192;byte[] buf = new byte[bufferSize];int passedlen = 0;long len=0;savePath += inputStream.readUTF();DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))));len = inputStream.readLong();System.out.println("文件的长度为:" + len + "n");System.out.println("开始接收文件!" + "n");while (true) {int read = 0;if (inputStream != null) {read = inputStream.read(buf);}passedlen += read;if (read == -1) {break;}//下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比System.out.println("文件接收了" +(passedlen * 100/ len) + "%n");fileOut.write(buf, 0, read);}System.out.println("接收完成,文件存为" + savePath + "n");fileOut.close();} catch (Exception e) {System.out.println("接收消息错误" + "n");return;}}public static void main(String arg[]) {new ClientTest();} }
      java中的网络信息传输方式基于TCP协议和UD协议P的,socket是基于TCP协议的实现代码如下: import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.net.InetSocketAddress;import java.net.Socket;public class ClientTcpSend {public static void main(String[] args) {int length = 0;byte[] sendBytes = null;Socket socket = null;DataOutputStream dos = null;FileInputStream fis = null;try {try {socket = new Socket();socket.connect(new InetSocketAddress("127.0.0.1", 33456),dos = new DataOutputStream(socket.getOutputStream());File file = new File("/root/6674541037_c3a9c8b64c_b.jpg");Ffis = new FileInputStream(file);sendBytes = new byte[1024];while ((length = fis.read(sendBytes, 0, sendBytes.length)) > 0) {dos.write(sendBytes, 0, length);dos.flush();}} finally {if (dos != null)dos.close();if (fis != null)fis.close();if (socket != null)socket.close();}} catch (Exception e) {e.printStackTrace();}} }
      代码如下: /*import java.io.*;import java.net.*;import java.util.*;*/private HttpURLConnection connection;//存储连接private int downsize = -1;//下载文件大小,初始值为-1private int downed = 0;//文加已下载大小,初始值为0private RandomAccessFile savefile;//记录下载信息存储文件private URL fileurl;//记录要下载文件的地址private DataInputStream fileStream;//记录下载的数据流try{/*开始创建下载的存储文件,并初始化值*/File tempfileobject = new File("h:\webwork-2.1.7.zip");if(!tempfileobject.exists()){/*文件不存在则建立*/tempfileobject.createNewFile();}savefile = new RandomAccessFile(tempfileobject,"rw");/*建立连接*/fileurl = new URL("https://webwork.dev.java.net/files/documents/693/9723/webwork-2.1.7.zip");connection = (HttpURLConnection)fileurl.openConnection();connection.setRequestProperty("Range","byte="+this.downed+"-");this.downsize = connection.getContentLength();//System.out.println(connection.getContentLength());new Thread(this).start();}catch(Exception e){System.out.println(e.toString());System.out.println("构建器错误");System.exit(0);}public void run(){/*开始下载文件,以下测试非断点续传,下载的文件存在问题*/try{System.out.println("begin!");Date begintime = new Date();begintime.setTime(new Date().getTime());byte[] filebyte;int onecelen;//System.out.println(this.connection.getInputStream().getClass().getName());this.fileStream = new DataInputStream(new BufferedInputStream(this.connection.getInputStream()));System.out.println("size = " + this.downsize);while(this.downsize != this.downed){if(this.downsize - this.downed > 262144){//设置为最大256KB的缓存filebyte = new byte[262144];onecelen = 262144;}else{filebyte = new byte[this.downsize - this.downed];onecelen = this.downsize - this.downed;}onecelen = this.fileStream.read(filebyte,0,onecelen);this.savefile.write(filebyte,0,onecelen);this.downed += onecelen;System.out.println(this.downed);}this.savefile.close();System.out.println("end!");System.out.println(begintime.getTime());System.out.println(new Date().getTime());System.out.println(begintime.getTime() - new Date().getTime());}catch(Exception e){System.out.println(e.toString());System.out.println("run()方法有问题!");}}/***//FileClient.javaimport java.io.*;import java.net.*;public class FileClient {public static void main(String[] args) throws Exception {//使用本地文件系统接受网络数据并存为新文件File file = new File("d:\fmd.doc");file.createNewFile();RandomAccessFile raf = new RandomAccessFile(file, "rw");// 通过Socket连接文件服务器Socket server = new Socket(InetAddress.getLocalHost(), 3318);//创建网络接受流接受服务器文件数据InputStream netIn = server.getInputStream();InputStream in = new DataInputStream(new BufferedInputStream(netIn));//创建缓冲区缓冲网络数据byte[] buf = new byte[2048];int num = in.read(buf);while (num != (-1)) {//是否读完所有数据raf.write(buf, 0, num);//将数据写往文件raf.skipBytes(num);//顺序写文件字节num = in.read(buf);//继续从网络中读取文件}in.close();raf.close();}}//FileServer.javaimport java.io.*;import java.util.*;import java.net.*;public class FileServer {public static void main(String[] args) throws Exception {//创建文件流用来读取文件中的数据File file = new File("d:\系统特点.doc");FileInputStream fos = new FileInputStream(file);//创建网络服务器接受客户请求ServerSocket ss = new ServerSocket(8801);Socket client = ss.accept();//创建网络输出流并提供数据包装器OutputStream netOut = client.getOutputStream();OutputStream doc = new DataOutputStream(new BufferedOutputStream(netOut));//创建文件读取缓冲区byte[] buf = new byte[2048];int num = fos.read(buf);while (num != (-1)) {//是否读完文件doc.write(buf, 0, num);//把文件数据写出网络缓冲区doc.flush();//刷新缓冲区把数据写往客户端num = fos.read(buf);//继续从文件中读取数据}fos.close();doc.close();}} */
      利用java socket实现文件传输

      用c++ socket怎么实现发送文件夹

      代码很长,如下: /*server.h*/#pragma comment(lib, "WS2_32")#include #include //#include #include #ifndef COMMONDEF_H#define COMMONDEF_H#define MAX_PACKET_SIZE 10240// 数据包的最大长度,单位是sizeof(char)#define MAXFILEDIRLENGTH 256 // 存放文件路径的最大长度#define PORT 4096// 端口号#define SERVER_IP"127.0.0.1" // server端的IP地址// 各种消息的宏定义#define INVALID_MSG-1 // 无效的消息标识#define MSG_FILENAME 1 // 文件的名称#define MSG_FILELENGTH 2 // 传送文件的长度#define MSG_CLIENT_READY3 // 客户端准备接收文件#define MSG_FILE4 // 传送文件#define MSG_SENDFILESUCCESS5 // 传送文件成功#define MSG_OPENFILE_ERROR10 // 打开文件失败,可能是文件路径错误找不到文件等原因#define MSG_FILEALREADYEXIT_ERROR 11 // 要保存的文件已经存在了class CCSDef{public:#pragma pack(1)// 使结构体的数据按照1字节来对齐,省空间// 消息头struct TMSG_HEADER{charcMsgID;// 消息标识TMSG_HEADER(char MsgID = INVALID_MSG): cMsgID(MsgID){}};// 请求传送的文件名// 客户端传给服务器端的是全路径名称// 服务器传回给客户端的是文件名struct TMSG_FILENAME : public TMSG_HEADER{char szFileName[256]; // 保存文件名的字符数组TMSG_FILENAME(): TMSG_HEADER(MSG_FILENAME){}};// 传送文件长度struct TMSG_FILELENGTH : public TMSG_HEADER{long lLength;TMSG_FILELENGTH(long length): TMSG_HEADER(MSG_FILELENGTH), lLength(length){}};// Client端已经准备好了,要求Server端开始传送文件struct TMSG_CLIENT_READY : public TMSG_HEADER{TMSG_CLIENT_READY(): TMSG_HEADER(MSG_CLIENT_READY){}};// 传送文件struct TMSG_FILE : public TMSG_HEADER{union // 采用union保证了数据包的大小不大于MAX_PACKET_SIZE * sizeof(char){char szBuff[MAX_PACKET_SIZE];struct{int nStart;int nSize;char szBuff[MAX_PACKET_SIZE - 2 * sizeof(int)];}tFile;};TMSG_FILE(): TMSG_HEADER(MSG_FILE){}};// 传送文件成功struct TMSG_SENDFILESUCCESS : public TMSG_HEADER{TMSG_SENDFILESUCCESS(): TMSG_HEADER(MSG_SENDFILESUCCESS){}};// 传送出错信息,包括:// MSG_OPENFILE_ERROR:打开文件失败// MSG_FILEALREADYEXIT_ERROR:要保存的文件已经存在了struct TMSG_ERROR_MSG : public TMSG_HEADER{TMSG_ERROR_MSG(char cErrorMsg): TMSG_HEADER(cErrorMsg){}};#pragma pack()};#endif/*server.cpp*/#include "server.h"char g_szNewFileName[MAXFILEDIRLENGTH];char g_szBuff[MAX_PACKET_SIZE + 1];long g_lLength;char* g_pBuff = NULL;// 初始化socket库bool InitSocket();// 关闭socket库bool CloseSocket();// 解析消息进行相应的处理bool ProcessMsg(SOCKET sClient);// 监听Client的消息void ListenToClient();// 打开文件bool OpenFile(CCSDef::TMSG_HEADER* pMsgHeader, SOCKET sClient);// 传送文件bool SendFile(SOCKET sClient);// 读取文件进入缓冲区bool ReadFile(SOCKET sClient);int main(){InitSocket();ListenToClient();CloseSocket();return 0;}void ListenToClient(){// 创建socket套接字SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (SOCKET_ERROR == sListen){printf("Init Socket Error!n");return;}// 绑定socket到一个本地地址sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.S_un.S_addr = INADDR_ANY;if (::bind(sListen, (LPSOCKADDR)&sin, sizeof(sockaddr_in)) == SOCKET_ERROR){printf("Bind Error!n");return;}// 设置socket进入监听状态if (::listen(sListen, 10) == SOCKET_ERROR){printf("Listen Error!n");return;}printf("Listening To Client...n");// 循环接收client端的连接请求sockaddr_in ClientAddr;int nAddrLen = sizeof(sockaddr_in);SOCKET sClient;while (INVALID_SOCKET == (sClient = ::accept(sListen, (sockaddr*)&ClientAddr, &nAddrLen))){}while (true == ProcessMsg(sClient)){}// 关闭同客户端的连接::closesocket(sClient);::closesocket(sListen);}bool InitSocket(){// 初始化socket dllWSADATA wsaData;WORD socketVersion = MAKEWORD(2, 2);if (::WSAStartup(socketVersion, &wsaData) != 0){printf("Init socket dll errorn");return false;}return true;}bool CloseSocket(){// 释放winsock库::WSACleanup();if (NULL != g_pBuff){delete [] g_pBuff;g_pBuff = NULL;}return true;}bool ProcessMsg(SOCKET sClient){int nRecv = ::recv(sClient, g_szBuff, MAX_PACKET_SIZE + 1, 0);if (nRecv > 0){g_szBuff[nRecv] = '';}// 解析命令CCSDef::TMSG_HEADER* pMsgHeader = (CCSDef::TMSG_HEADER*)g_szBuff;switch (pMsgHeader->cMsgID){case MSG_FILENAME:// 文件名{OpenFile(pMsgHeader, sClient);}break;case MSG_CLIENT_READY: // 客户端准备好了,开始传送文件{SendFile(sClient);}break;case MSG_SENDFILESUCCESS: // 传送文件成功{printf("Send File Success!n");return false;}break;case MSG_FILEALREADYEXIT_ERROR: // 要保存的文件已经存在了{printf("The file reay to send already exit!n");return false;}break;}return true;}bool ReadFile(SOCKET sClient){if (NULL != g_pBuff){return true;}// 打开文件FILE *pFile;if (NULL == (pFile = fopen(g_szNewFileName, "rb"))) // 打开文件失败{printf("Cannot find the file, request the client input file name againn");CCSDef::TMSG_ERROR_MSG tMsgErrorMsg(MSG_OPENFILE_ERROR);::send(sClient, (char*)(&tMsgErrorMsg), sizeof(CCSDef::TMSG_ERROR_MSG), 0);return false;}// 把文件的长度传回到client去fseek(pFile, 0, SEEK_END);g_lLength = ftell(pFile);printf("File Length = %dn", g_lLength);CCSDef::TMSG_FILELENGTH tMsgFileLength(g_lLength);::send(sClient, (char*)(&tMsgFileLength), sizeof(CCSDef::TMSG_FILELENGTH), 0);// 处理文件全路径名,把文件名分解出来char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFname[_MAX_FNAME], szExt[_MAX_EXT];_splitpath(g_szNewFileName, szDrive, szDir, szFname, szExt);strcat(szFname,szExt);CCSDef::TMSG_FILENAME tMsgFileName;strcpy(tMsgFileName.szFileName, szFname);printf("Send File Name: %sn", tMsgFileName.szFileName);::send(sClient, (char*)(&tMsgFileName), sizeof(CCSDef::TMSG_FILENAME), 0);// 分配缓冲区读取文件内容g_pBuff = new char[g_lLength + 1];if (NULL == g_pBuff){return false;}fseek(pFile, 0, SEEK_SET);fread(g_pBuff, sizeof(char), g_lLength, pFile);g_pBuff[g_lLength] = '';fclose(pFile);return true;}// 打开文件bool OpenFile(CCSDef::TMSG_HEADER* pMsgHeader, SOCKET sClient){CCSDef::TMSG_FILENAME* pRequestFilenameMsg = (CCSDef::TMSG_FILENAME*)pMsgHeader;// 对文件路径名进行一些处理char *p1, *p2;for (p1 = pRequestFilenameMsg->szFileName, p2 = g_szNewFileName;'' != *p1;++p1, ++p2){if ('n' != *p1){*p2 = *p1;}if ('\' == *p2){*(++p2) = '\';}}*p2 = '';ReadFile(sClient);return true;}// 传送文件bool SendFile(SOCKET sClient){if (NULL == g_pBuff){ReadFile(sClient);}int nPacketBufferSize = MAX_PACKET_SIZE - 2 * sizeof(int); // 每个数据包存放文件的buffer大小// 如果文件的长度大于每个数据包所能传送的buffer长度那么就分块传送for (int i = 0; i < g_lLength; i += nPacketBufferSize){CCSDef::TMSG_FILE tMsgFile;tMsgFile.tFile.nStart = i;if (i + nPacketBufferSize + 1> g_lLength){tMsgFile.tFile.nSize = g_lLength - i;}else{tMsgFile.tFile.nSize = nPacketBufferSize;}//printf("start = %d, size = %dn", tMsgFile.tFile.nStart, tMsgFile.tFile.nSize);memcpy(tMsgFile.tFile.szBuff, g_pBuff + tMsgFile.tFile.nStart, tMsgFile.tFile.nSize);::send(sClient, (char*)(&tMsgFile), sizeof(CCSDef::TMSG_FILE), 0);Sleep(0.5);}delete [] g_pBuff;g_pBuff = NULL;return true;}/*client.h同server.h*//*client.cpp*/#include "client.h"long g_lLength = 0;char* g_pBuff = NULL;char g_szFileName[MAXFILEDIRLENGTH];char g_szBuff[MAX_PACKET_SIZE + 1];SOCKET g_sClient;// 初始化socket库bool InitSocket();// 关闭socket库bool CloseSocket();// 把用户输入的文件路径传送到server端bool SendFileNameToServer();// 与server端连接bool ConectToServer();// 打开文件失败bool OpenFileError(CCSDef::TMSG_HEADER *pMsgHeader);// 分配空间以便写入文件bool AllocateMemoryForFile(CCSDef::TMSG_HEADER *pMsgHeader);// 写入文件bool WriteToFile(CCSDef::TMSG_HEADER *pMsgHeader);// 处理server端传送过来的消息bool ProcessMsg();int main(){InitSocket();ConectToServer();CloseSocket();return 0;}// 初始化socket库bool InitSocket(){// 初始化socket dllWSADATA wsaData;WORD socketVersion = MAKEWORD(2, 2);if (::WSAStartup(socketVersion, &wsaData) != 0){printf("Init socket dll errorn");exit(-1);}return true;}// 关闭socket库bool CloseSocket(){// 关闭套接字::closesocket(g_sClient);// 释放winsock库::WSACleanup();return true;}// 与server端连接进行文件的传输bool ConectToServer(){// 初始化socket套接字if (SOCKET_ERROR == (g_sClient = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))){printf("Init Socket Error!n");exit(-1);}sockaddr_in servAddr;servAddr.sin_family = AF_INET;servAddr.sin_port = htons(PORT);servAddr.sin_addr.S_un.S_addr = ::inet_addr(SERVER_IP);if (INVALID_SOCKET == (::connect(g_sClient, (sockaddr*)&servAddr, sizeof(sockaddr_in)))){printf("Connect to Server Error!n");exit(-1);}// 输入文件路径传输到server端SendFileNameToServer();// 接收server端传过来的信息,直到保存文件成功为止while (true == ProcessMsg()){}return true;}// 把用户输入的文件路径传送到server端bool SendFileNameToServer(){char szFileName[MAXFILEDIRLENGTH];printf("Input the File Directory: ");fgets(szFileName, MAXFILEDIRLENGTH, stdin);// 把文件路径发到server端CCSDef::TMSG_FILENAME tMsgRequestFileName;strcpy(tMsgRequestFileName.szFileName, szFileName);if (SOCKET_ERROR == ::send(g_sClient, (char*)(&tMsgRequestFileName), sizeof(CCSDef::TMSG_FILENAME), 0)){printf("Send File Name Error!n");exit(-1);}return true;}// 处理server端传送过来的消息bool ProcessMsg(){CCSDef::TMSG_HEADER *pMsgHeader;int nRecv = ::recv(g_sClient, g_szBuff, MAX_PACKET_SIZE + 1, 0);pMsgHeader = (CCSDef::TMSG_HEADER*)g_szBuff;switch (pMsgHeader->cMsgID){case MSG_OPENFILE_ERROR: // 打开文件错误{OpenFileError(pMsgHeader);}break;case MSG_FILELENGTH:// 文件的长度{if (0 == g_lLength){g_lLength = ((CCSDef::TMSG_FILELENGTH*)pMsgHeader)->lLength;printf("File Length: %dn", g_lLength);}}break;case MSG_FILENAME: // 文件名{return AllocateMemoryForFile(pMsgHeader);}break;case MSG_FILE:// 传送文件,写入文件成功之后退出这个函数{if (WriteToFile(pMsgHeader)){return false;}}break;}return true;}// 打开文件失败bool OpenFileError(CCSDef::TMSG_HEADER *pMsgHeader){if (NULL != g_pBuff)return true;assert(NULL != pMsgHeader);printf("Cannot find file!Please input again!n");// 重新输入文件名称SendFileNameToServer();return true;}// 查找是否已经存在了要保存的文件,同时分配缓冲区保存文件bool AllocateMemoryForFile(CCSDef::TMSG_HEADER *pMsgHeader){assert(NULL != pMsgHeader);if (NULL != g_pBuff){return true; }
      基础: 1. 会发送一个文件2. 会遍历一个文件夹下的所有文件然后用下面两种方法之一:1. 将文件夹压缩成一个文件,可以使用zlib库,发送过去后解压缩 2. 遍历所有文件,在每个发送的文件前面带上 相对路径,到远方后按相对路径存放
      主要函数或步骤: WSAStartup, 初始化,WSACleanup,结束socket(, ,) 构造函数,要有socket的instance才能实现传输send()recv()listen(), server端开始要监听自己的端口号有没有被连接bind(),server的用来listen()的socket绑定addressaccept(),如果没有client要连接,server在调用时就阻塞,有client要连接,就从这个要连接的队列里取出然后accept,然后server产生一个新的socket,而之前在listen()的socket是和这个不一样的,微软为何要弄两个socket出来呢,网上有一些解释,似乎是为了使用时更清楚一点可以看看这个http://blog.csdn.net/jackyguo1992/article/details/18020225
      对,就是推荐答案里的方法
      用c++ socket怎么实现发送文件夹

      用C语言实现socket文件传输?

      服务端代码: #include #include #include #include #include #include #include #include #define MYPORT 3490 /*定义用户连接端口*/#define BACKLOG 10 /*多少等待连接控制*/main(){int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd*/struct sockaddr_in my_addr; /* my address information */struct sockaddr_in their_addr; /* connector's address information */int sin_size;if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {perror("socket");exit(1);}my_addr.sin_family = AF_INET; /* host byte order */my_addr.sin_port = htons(MYPORT); /* short, network byte order */my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */bzero(&(my_addr.sin_zero),; /* zero the rest of the struct */if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(structsockaddr))== -1) {perror("bind");exit(1);}if (listen(sockfd, BACKLOG) == -1) {perror("listen");exit(1);}while(1) { /* main accept() loop */sin_size = sizeof(struct sockaddr_in);if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) {perror("accept");continue;}printf("server: got connection from %sn", inet_ntoa(their_addr.sin_addr));if (!fork()) { /* this is the child process */if (send(new_fd, "Hello, world!n", 14, 0) == -1)perror("send");close(new_fd);exit(0);}close(new_fd); /* parent doesn't need this */while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */}}客户代码:#include #include #include #include #include #include #include #include #define PORT 3490 /* 客户机连接远程主机的端口 */#define MAXDATASIZE 100 /* 每次可以接收的最大字节 */int main(int argc, char *argv[]){int sockfd, numbytes;char buf[MAXDATASIZE];struct hostent *he;struct sockaddr_in their_addr; /* connector's address information */if (argc != 2) {fprintf(stderr,"usage: client hostnamen");exit(1);}if ((he=gethostbyname(argv[1])) == NULL) { /* get the host info */herror("gethostbyname");exit(1);}if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {perror("socket");exit(1);}their_addr.sin_family = AF_INET; /* host byte order */their_addr.sin_port = htons(PORT); /* short, network byte order */their_addr.sin_addr = *((struct in_addr *)he->h_addr);bzero(&(their_addr.sin_zero),; /* zero the rest of the struct */if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(structsockaddr)) == -1) {perror("connect");exit(1);}if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) {perror("recv");exit(1);}buf[numbytes] = '';printf("Received: %s",buf);close(sockfd);return 0; }
      socket + FILE灰常简单~! SOCKET 例子多如牛毛,FILE文件操作更是随处可见~!
      用C语言实现socket文件传输?

      要通过(socket)来传输文件?这是什么意思?

      SOCKET用于在两个基于TCP/IP协议的应用程序之间相互通信。中文有的称为套接字,你可以理解为一个插座和插头,两者匹配才能进行数据通信。 SOCKET最早出现在UNIX系统中,是UNIX系统主要的信息传递方式。在WINDOWS系统中,SOCKET称为WINSOCK。 SOCKET有两个基本概念:客户方和服务方。当两个应用之间需要采用SOCKET通信时,首先需要在两个应用之间(可能位于同一台机器,也可能位于不同的机器)建立SOCKET连接,发起呼叫连接请求的一方为客户方,接受呼叫连接请求的一方成为服务方。客户方和服务方是相对的,同一个应用可以是客户方,也可以是服务方。在客户方呼叫连接请求之前,它必须知道服务方在哪里。所以需要知道服务方所在机器的IP地址或机器名称,如果客户方和服务方事前有一个约定就好了,这个约定就是PORT(端口号)。也就是说,客户方可以通过服务方所在机器的IP地址或机器名称和端口号唯一的确定方式来呼叫服务方。在客户方呼叫之前,服务方必须处于侦听状态,侦听是否有客户要求建立连接。一旦接到连接请求,服务方可以根据情况建立或拒绝连接。连接方式有两种,同步方式(Blocking)和(noBlocking). 客户方发送的消息可以是文本,也可以是二进制信息流。当客户方的消息到达服务方端口时,会自动触发一个事件(event),服务方只要接管该事件,就可以接受来自客户方的消息了。
      要通过(socket)来传输文件?这是什么意思?

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类