飞鸽传书源码分析五-文件传输

深度解析飞鸽传书源码:网络编程核心技术与实战 设计自定义通信协议时,首要考虑的是简洁性。一个简洁的协议能够减少开发者在实现时的难度,降低出错的几率,并且提高数据处理的效率。然而,简洁性并不意味着牺牲功能和可扩展性。一个好的协议设计应该留有充分的扩展空间,以支持未来可能增加的新功能或命令。举例来说,协议格式可能需要预留特定的字段来标识协议版本,这样在新版本推出时,就能够通过这些预留字段来区分不同版本的协议,保证新旧版本的协议可以共存。 阅读详情

转载请注明出处:http://blog.youkuaiyun.com/mxway/article/details/44889871
本文是在飞鸽传书源码v2.06的基础上进行分析的。

1.添加要发送的文件

文件的发送是在发送对话框中进行的,首先找到发送对话框的快捷菜单。
这里写图片描述

File Transfer对应的菜单id为MENU_FILEADD,相应的command处理事件在Senddlg.cpp中的EvCommand函数中

BOOL TSendDlg::EvCommand(WORD wNotifyCode, WORD wID, LPARAM hWndCtl)
{
    switch (wID)
    {
        case MENU_FILEADD:
        {
            char    buf[MAX_PATH] = "";
            if (TShareDlg::FileAddDlg(this, shareMng, shareInfo ? shareInfo : (shareInfo = shareMng->CreateShare(packetNo)), cfg))
            {
                SetFileButton(this, FILE_BUTTON, shareInfo);
                EvSize(SIZE_RESTORED, 0, 0);
            }
        }
        break;
    }
}
BOOL TShareDlg::FileAddDlg(TDlg *dlg, ShareMng *shareMng, ShareInfo *shareInfo, Cfg *cfg)
{
    char    buf[MAX_BUF] = "", path[MAX_BUF];
    //打开文件对话框,OpenFileDlg::MULTI_OPEN设置可以同时打开多个文件
    if (OpenFileDlg(dlg, OpenFileDlg::MULTI_OPEN).Exec(buf, ADDFILE_MSGSTR, OPENFILEALL_MSGSTR, cfg->lastOpenDir) != TRUE)
        return  FALSE;
    //获取打开文件的路径字符长度
    int     dirlen = strlen(cfg->lastOpenDir);

    //如果只选择一个文件,直接将文件加入到待发送文件的缓存区shareInfo中
    if (buf[dirlen])
        return  shareMng->AddFileShare(shareInfo, buf);

    //如果选择了多个文件,循环将每个文件都加入到待发送文件缓存区中
    for (char *fname=buf+dirlen+1; *fname; fname += strlen(fname) +1)
    {
        if (MakePath(path, buf, fname) >= MAX_PATH)
            continue;
        shareMng->AddFileShare(shareInfo, path);
    }
    return  TRUE;
}

打开文件对话框的调用是在OpenFileDlg类中的Exec中调用Win32的API GetOpenFileName()函数实现的。

2. 待发送文件的存储结构

从TShareDlg::FileAddDlg函数中可以看到待发送的文件是存储到Sh
areInfo类中。ShareInfo的声明如下

struct ShareInfo : public TListObj {
    int         packetNo;       // 
    Host        **host;         // 要发送的目的机器列表
    int         hostCnt;        // 要发送的目的机器个数
    char        *transStat;     // 
    FileInfo    **fileInfo;     // 要传输的文件信息
    int         fileCnt;        // 要传输的文件个数
    FILETIME    attachTime;
    ...
};
class FileInfo : public TListObj {
    int         id;     // 要传输文件的id
    char        *fname; //文件名
    const char  *fname_ext; // for recv dir thread
    UINT        attr;   //文件的属性,如是文件或文件夹,只读等
    _int64      size;  //文件大小
    time_t      mtime; //文件最后一次修改时间
    time_t      atime; //文件最后一次访问时间
    time_t      crtime; //文件创建时间
    BOOL        isSelected;     // for recvdlg
    ...
}

再回到TShareDlg::FileAddDlg中,看shareMng->AddFileShare(shareInfo, path);

BOOL ShareMng::AddFileShare(ShareInfo *info, char *fname)
{
    //如果要发送的文件已经加入到列表中,不再进行处理
    for (int cnt=0; cnt < info->fileCnt; cnt++)
        if (strcmp(fname, info->fileInfo[cnt]->Fname()) == 0)
            return  FALSE;

    FileInfo    *fileInfo = new FileInfo;
    //设置新的待发送文件信息,如文件大小,最后一次修改时间等
    if (SetFileInfo(fname, fileInfo) == FALSE)
        return  FALSE;

    //如果fileInfo分配的内存已经使用完,需要分配理多的内存,用于存放新的文件信息
    if ((info->fileCnt % BIG_ALLOC) == 0)
        info->fileInfo = (FileInfo **)realloc(info->fileInfo, (info->fileCnt + BIG_ALLOC) * sizeof(FileInfo *));
    info->fileInfo[info->fileCnt] = fileInfo;
    info->fileCnt++;

    return  TRUE;
}

3. 在网络中进行文件传输

(1)文件在网络上进行传时的格式。
id:文件名:文件大小:最后一次修改时间:文件属性:
如果多个文件则多个文件之间的信息加入一个’\a’字符进行分隔。
(2)在Senddlg.cpp中的SendMsg,即按”Send”按钮的触发事件,其代码如下

BOOL TSendDlg::SendMsg(void)
{
    ...
    if (shareInfo && shareInfo->fileCnt)
        command |= IPMSG_FILEATTACHOPT;
    ...
    if (shareInfo && shareInfo->fileCnt)    
    {
        char    buf[MAX_UDPBUF / 2];
        //将文件生成(1)中的格式
        EncodeShareMsg(shareInfo, buf, sizeof(buf));
        shareStr = new char [strlen(buf) + 1];
        strcpy(shareStr, buf);
        shareMng->AddHostShare(shareInfo, sendEntry, sendEntryNum);
    }
    SendMsgSub();
    ...
}
BOOL EncodeShareMsg(ShareInfo *info, char *buf, int bufsize)
{
    int     offset=0;
    char    fname[MAX_PATH];

    *buf = 0;
    for (int cnt=0; cnt < info->fileCnt; cnt++)
    {
        ForcePathToFname(info->fileInfo[cnt]->Fname(), fname);
        info->fileInfo[cnt]->SetId(cnt);
        offset += wsprintf(buf + offset, (info->fileInfo[cnt]->Size() >> 32) ? "%d:%s:%x%08x:%x:%s" : "%d:%s:%x%x:%x:", cnt, fname, (int)(info->fileInfo[cnt]->Size() >> 32), (int)info->fileInfo[cnt]->Size(), info->fileInfo[cnt]->Mtime());
            offset += wsprintf(buf + offset, "%x:", info->fileInfo[cnt]->Attr());
        offset += wsprintf(buf + offset, "%c", FILELIST_SEPARATOR);

        if (offset + MAX_BUF > bufsize)
            break;
    }
    return  TRUE;
}

SendMsgSub()中会对待发送的消息进行加密(传输的文件信息不进行加密)。

BOOL TSendDlg::SendMsgSub(void)
{
    for (int cnt=0; cnt < sendEntryNum; cnt++)
    {
        if (sendEntry[cnt].Status() == ST_MAKECRYPTMSG) {
            MakeEncryptPacket(sendEntry + cnt);     
        }
        ...
        if (sendEntry[cnt].Status() == ST_SENDMSG) {
            const char  *str = sendEntry[cnt].Msg() ? sendEntry[cnt].Msg() : msgBuf;
            int     len = sendEntry[cnt].Msg() ? sendEntry[cnt].MsgLen() : packetLen;

            msgMng->UdpSend(sendEntry[cnt].Host()->hostSub.addr, sendEntry[cnt].Host()->hostSub.portNo, str, len);
        }
        ...
    }
}

下面是使用飞鸽传软件发送文件的一个截图
这里写图片描述
图中红色框中就是要发送的文件信息,从图中可以看出发送的文件名为open_data_structures.pdf,文件大小是十六进制的01817d0字节,最后一次修改时间为十六进制53f492fe。

4.接收端的处理

现在只是将待发送的文件信息发送出去,但是还没有将真正的文件内容传出去。文件内容的传输是通过TCP进行的。
Mainwin接收到发送来的udp消息后会对udp的消息进行处理。udp的处理在Mainwin.cpp的UdpEvent函数中。

BOOL TMainWin::UdpEvent(LPARAM lParam)
{
    MsgBuf  msg;

    if (WSAGETSELECTERROR(lParam) || msgMng->Recv(&msg) != TRUE)
        return  FALSE;
    ...
    switch (GET_MODE(msg.command))
    {
        ...
        case IPMSG_SENDMSG:
        //处理发送来的消息
        MsgSendMsg(&msg);
        break;
        ...
    }
    ...
}
void TMainWin::MsgSendMsg(MsgBuf *msg)
{
    ...
    RecvDlgOpen(msg);
    ...
}

BOOL TMainWin::RecvDlgOpen(MsgBuf *msg)
{
    TRecvDlg *recvDlg;

    ...
    if ((recvDlg = new TRecvDlg(msgMng, msg, &hosts, cfg, logmng)) == NULL)
        return  FALSE;
    ...
    recvDlg->Create();
    recvDlg->Show();
    recvDlg->SetForceForegroundWindow();
    ...
}

当接收端收到了消息后就会打开接收对话框。下面看下接收对话框的构造函数及接收对话框的EvCreate对话框

TRecvDlg::TRecvDlg(MsgMng *_msgMng, MsgBuf *_msg, THosts *_hosts, Cfg *_cfg, LogMng *_logmng) : TListDlg(RECEIVE_DIALOG), editSub(_cfg, this)
{
    ...
    //可选字段中有传输文件的选项命令
    if (msg.command & IPMSG_FILEATTACHOPT)
    {
        //从接收到的消息中解析出文件的信息
        if ((shareInfo = DecodeShareMsg(msg.msgBuf + msg.exOffset)) != NULL)
        {
            fileObj = new RecvFileObj;
            memset(fileObj, 0, sizeof(RecvFileObj));
        }
    }
    ...
}
BOOL TRecvDlg::EvCreate(LPARAM lParam)
{
    ...
    if (msg.command & IPMSG_SECRETOPT)
        ::ShowWindow(GetDlgItem(RECV_EDIT), SW_HIDE), ::ShowWindow(GetDlgItem(QUOTE_CHECK), SW_HIDE);
    else {
        ::ShowWindow(GetDlgItem(OPEN_BUTTON), SW_HIDE), openFlg = TRUE;
        //将文件名显示到按钮中
        if (shareInfo)
            SetFileButton(this, FILE_BUTTON, shareInfo);
    }
    ...
}

RecvDlg如下
这里写图片描述
在出现的对话框中,点击”open_data_structures.pdf”这个按钮。会弹出一个保存文件的对话框。点保存后文件的传输就会开始。关于文件的具体传输代码分析,下一篇再详细解析。

深入解析IPMSG飞鸽传书C++源代码 本文还有配套的精品资源,点击获取 简介:IPMSG是一款允许局域网内即时通讯和文件传输的开源通信软件。源代码压缩包"ipmsg206src.rar"提供了一个研究网络协议、多线程和C++编程的宝贵机会。本源代码通过实现UDP协议进行消息的发送与接收,包括网络通信、数据包解析、多线程处理、用户界面设计和文件传输等关键模块。通过深入分析和理解这些模块,学习者将能够提升网络编程技... 阅读详情

相关推荐

飞鸽传书(IPMessenger) 源码

软件简介   飞鸽传书(IP Messenger),是由日本人Shirouzu Hiroaki (白水 启章)所发明的免费软件, 是一款局域网内即时通信软件,基于 TCP/IP(UDP)。可运行于多种操作平台(Win/Mac/UNIX/Java),并实现跨平台信息交流。不需要服务器支持, 支持文件/文件夹的传送 (2.00版以上),通讯数据采用 RSA/Blofish 加密 (2.00版以上),十分小巧,简单易用,而且你可以完全免费使用它。目前已有的版本包括: Win32, Win16, MacOS, MacOSX, X11, GTK, GNOME,Java 等, 并且公开源代码. 系统要求   Microsoft Windows 95/98/Me/NT4.0/2000/XP/2003   95/98/NT4.0 ... 要求 comctl32.dll(公共控件) 的版本为 5.x 或更高.   (如果你安装的 IE 是 5.x 或更高版本, 那么就不必担心这个问题了)   注意: Windows 3.1(和 NT3.5x), 请使用 IP Messenger for Win16. 使用说明   < 安装/卸载 >   执行 setup.exe 你可以将 IPMsg 安装到指定目录, 或者重新注册到启动组.   如果需要删除 IPMsg, 请先从控制面板中卸载, 再手动删除 IPMsg 目录.   < 系统托盘区图标 >   左键双击图标, 即可打开发送消息窗口.   右键点击图标, 可进入 [服务设置], [离开] 等.   < 发送消息窗口 >   - 发送消息时, 若勾选了 [封装], 则接收者要先打开信封才能看到消息,   如果你还勾选了 [上锁], 则接收者在打开信封时还需要输入密码.   (密码是由接收者自己在 [服务设置] 中设置的)   - 若要发送文件/文件夹, 可直接将文件/文件夹拖入发送消息窗口   或在发送消息窗口上点击右键, 再选择发送文件或发送文件夹   - 传送文件/文件夹时, 当接收者还没有保存(下载)文件/文件夹时,   若发送者关闭或重启了 IPMsg, 则附带的文件信息将被清除,   接收者将不能继续接收(下载)到此文件.   - 用户列表前缀符号说明   ":" 表示用户处于离开模式.   "|" 表示用户使用的不是 2.0 以上版本的 IPMsg,   将不支持文件/文件夹的传送, 并且不支持通信数据加密.   "|"(短线) 表示只支持文件/文件夹的传送.   - 拖动列表表头标题项可改变其顺序, 并可点击右键选择"保存列表顺序"   - 在消息输入窗口中, 可使用 Ctrl+Tab 输入制表符 Tab.   - 在发送消息窗口上点击右键, 可以进入设置显示优先级, 选择工作组,   搜索用户(Ctrl+F), 传送文件, 传送文件夹, 保存列表顺序, 字体设置,   窗口大小设置, 固定窗口位置, 列表显示设置.   - 在用户名上点击右键, 可设置其显示优先级   优先级按由小到大的顺序排序   - 通过设置显示优先级, 可将经常联系的用户至于列表顶端,   或者隐藏不需要联系的用户   < 接收消息窗口 >   - 在接收消息窗口上点击右键, 可以进入字体设置,   窗口大小设置, 固定窗口位置.   - 接收消息窗口标题栏中的 "+" 或 "-" 表示通信数据使用了加密算法   "+" 表示 RSA/1024 位, blowfish/128 位加密   "-" 表示 RSA/512 位, RC2/40 位加密   - 如果你收到的消息附带了文件, 将会显示出附件按钮.   点击按钮即可保存文件.   < 其他 >   - 如果需要(通过路由器)连接到广域网, 则需要设置广播地址.   详见广域网设置(广播设置)   - 其它功能都很容易理解, 你试一试就明白了 操作技巧   1、隐藏/显示窗口Ctrl+D   2、按住Ctrl键再点[刷新]可保持现有用户,搜索新上线的用户   3、打开发送/接收消息窗口Ctrl+Alt+S/R(需要进行详细设置)   4、打开搜索窗口Ctrl+F   5、接收到多个文件,保存时可勾选[全部] 软件原理   局域网聊天软件飞鸽传书是目前比较流行的局域网即时通讯软件,由于历史悠久,它具有比较多的用户。 因为 FreeEIM 的实现原理和飞鸽传书差不多,希望广大用户了解其原理后,在使用时更加得心应手。   开发多年的飞鸽,在他的基础上增加了些许功能,例如语音对话,这里继续讨论FreeEIM(飞鸽传书),前几天,详细的了解了FreeEIM(飞鸽传书)的网络协议,详细分析并且实现了FreeEIM(飞鸽传书)的消息传递过程,这里就FreeEIM(飞鸽传书)中的文件和文件夹的传输做详细的说明。   在FreeEIM(飞鸽传书)中,如果要进行文件或者文件夹的传输,首先需要做的就是消息的应答,通过UDP发送文件传输报文,另外的FreeEIM(飞鸽传书)客户端收到报文后,使用TCP协议发送应答报文,这样就开始进行文件的传输了。   这里开启两个线程,线程1负责文件的传送,线程2负责文件的接受,下边做一一说明。   首先,我们知道,可以发送多个文件,这些文件需要建立链表保存信息。   typedef struct file_info   {   struct file_info *next; //双向链表   struct file_info *forward;   char *file; //文件名   int type; //文件类型:文件或者文件夹   int size; //文件大小   struct sockaddr_in addr; //目标网络信息   } FILE_INFO;   [1]文件传送链表由专门的线程维护,这样,线程1就可以专心进行处理文件传输队列就可以了,线程1始终查询这个链表,如果表头为NULL,就说明没有要传输的文件,表头非空,就开始发送报文,获得正确的应答后,就可以开始文件的传输了,文件传输结束,将相应的链表节点删除。这里借鉴了很多程序中使用非常广泛的“命名池”相关的概念,只不过这里我们使用的是“文件池”,可以这么认为,如果有文件要传输,可以不用考虑是否有文件正在传输,只要把要传输的文件放入 “文件池”就可以了 , 同时,不用考虑“文件池”的大小,线程1是文件池的服务线程,它检测文件池的大小,如果非空,就会逐次传输文件。   这里需要特别注意的就是关于文件夹的传输,这个FreeEIM(飞鸽传书)一个难点,应为对与文件夹的内容是没有显示的,需要我们逐次的判断,在飞鸽传书中是这么处理的,如果是一个文件夹,就发送文件属性为IPMSG_FILE_DIR的信息包,FreeEIM(飞鸽传书)客户端收到这个信息包后,就创建这个文件夹,然后发起发送的FreeEIM(飞鸽传书)客户端,进入文件夹,传送文件夹内的文件,如果该文件夹下,还有文件夹,使用相同的方法,在文件夹内的文件传送结束后,就发送FREEEIM_FILE_RETPARENT信息包,接受的FREEEI_FILE_RETP报文的FreeEIM(飞鸽传书)客户端,执行返回上一级目录,FreeEIM(飞鸽传书)发送端,就需发送目录下的文件。这样循环操作,最终完成文件的传输,这个过程比较难以理解。   有了上边的知识,开发文件传输功能就变得简单多了,文件的接受也可以类推了,同样开启一个线程维护接受文件链表,逐次接受身下的文件,链表为空时。文件传输会遇到文件读写问题,有的文件发送是被打开了,这样会造成访问违规,所以要有相应的处理,才能让程序更加稳健。   程序启动时先读取用户配置文件,一般是"*.ini"格式,然后,使用Winsock的广播消息给整个局域网发送一个数据包,这时候,如果其他电脑已经运行了飞鸽传书,那么他收到这个包后,会将包的信息读取出来,当然,这个包里有用户的IP,用户名,性别等等。这样,在用户列表里就多了一个用户了。他的用户检查方式就如此简单而已。至于跨网段的实现,只需简单地修改一下广播地址就行了,如果不考虑速度,你可以给整个internet发广播消息。 消息发送,文件传输这些功能,都比较简单,如果你会网络编程,给你对方IP地址,这些功能实现起来再简单不过了。语音、视屏等,只需编写一些语音视频采集代码,传书的话,就像传文件一样。这里给段广播消息的实现代码吧:   // 发送广播登陆消息   void EM_UserLogin::SendLogin_BC(LPEM_DATA msg)   {   SOCKET m_socket;   m_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);   if (INVALID_SOCKET == m_socket)   {   MessageBox(0, "socket failed.", NULL, MB_OK);   }   SOCKADDR_IN sin;sin.sin_addr.s_addr = htonl(INADDR_BROADCAST);   sin.sin_family = AF_INET;   sin.sin_port = htons(BROADCAST_SEND_PORT);BOOL bOpt = TRUE;   if (SOCKET_ERROR == setsockopt(m_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt)))   {   // Error occurred   ::MessageBox(0,"BC setsockopt error.",0,0);   return;   }   char *tmpBuf = msg->GetBuffer();   if (SOCKET_ERROR == sendto(m_socket, tmpBuf, msg->GetLength(), 0, (PSOCKADDR)&sin, sizeof(sin)))   {   // Error occurred   ::MessageBox(0,"BC sendto error.",0,0);   return;   }closesocket(m_socket);    相关信息   - 所有的设置信息都保存在注册表的以下位置:   \\HKEY_CURRENT_USER\Software\HSTools\   用户密码以不可逆加密方式存储.   *******************************************************************   * 如果你忘记了密码, 可以在注册表中将此键值删除 *   * \\HKEY_CURRENT_USER\Software\HSTools\IPMsgEng\PasswordStr *   *******************************************************************   - 本软件使用的默认端口为 2425   若仅使用 UDP 协议的端口, 将不能传送文件/文件夹   (如果安装了防火墙, 则必须打开相应的 TCP 和 UDP 端口)   - 本软件为自由软件, 你可以随意传播, 但源码使用请参见许可协议.   - 只有在启动或退出程序, 使用离开模式, 刷新在线用户时 IPMsg 才会进行消息广播.   - 本软件由 Microsoft Visual C++ 6.0 编译 广域网设置(广播设置)   - 主机号全部为 1 的 IP 地址, 即广播地址   例如, 连接到一个 C 类子网(即 24 位网络号, 8 位主机号), IP 地址为   aaa.bbb.ccc.ddd, 其广播地址即为: aaa.bbb.ccc.255   若对方处于另一个私有子网中, 广播可能无效.   - 更多问题, 请参阅相关资料或咨询你的网络管理员.   - 若两台主机的连接经过了多个路由器, 请直接指定对方IP地址   - 拨号上网用户请勾选 [拨号连接]   当刷新在线用户列表时, 列表不会被清空 补充   - 启动飞鸽传书前, 你可以指定其运行时使用的端口,   且可以使用不同的端口打开多个窗口. 用法如下:   ipmsg.exe 2426 (你可在快捷方式上设置)   但是你只能与同时也使用该端口的用户通信.   - 所以你尽可选用你喜欢的端口运行本软件.   介于 10000 至 60000 可能更安全些.   你也可以咨询你的网络管理员.   - 如果有多个网卡(IP), 你可以将飞鸽传书与指定的网卡(IP)进行绑定.   命令格式如下(你可以在快捷方式上设置):   ipmsg.exe [端口] /NIC IP地址   例如:   C:\>ipmsg.exe /NIC 192.168.10.100   - 支持命令方式发送消息   命令格式如下:   ipmsg.exe [端口] /MSG [/LOG][/SEAL] <主机名或IP地址> <消息>   例如:   C:\>ipmsg.exe /MSG /SEAL localhost Hello.    支持   - IPMsg 的技术讨论区是开放的.   如果你想订阅相关邮件, 请联系 ipmsg-subscribe@ring.gr.jp   - 欢迎报告 bug, 以及提出建议   - 如果你有任何疑问, 请 E-mail 联系.   shirouzu@h.email.ne.jp   中文版可联系阿志: hiwyz@163.net   - 发送错误报告, 请勿必记录以下信息:   软件版本, 操作系统, 故障描述, 以及故障重现方法等. 更新历史   ver 1.00 ... 日文版 (1996/08/19)   ver 1.31 ... 英文版/日文版 (1997/09/01)   ver 2.00 ... 英文版/日文版 (2002/11/19)   支持文件/文件夹传送   支持通信数据加密   ver 2.03 ... Bug 修正 (文件传送引起缓冲溢出)   广播设置支持主机地址(FQDN)解析   ver 2.04 ... 增加绑定网卡(IP)功能   ver 2.05 ... Bug 修正 (2.04版当激活发送/接收消息窗口时,无法注销/关闭系统)   ver 2.06 ... 很小的调整   ver 2007 ... 全面调整软件的界面可用性、性能稳定性 注意:本版本为 IPMSG 2.06版 编译环境: WINXP & VS2005, 可正确编译。

IPMsg(飞鸽传书)文件发送源码分析

本文分析了飞鸽传输核心传送过程。DWORDWINAPITMainWin::SendFileThread(void*_sendFileObj){SendFileObj*obj=(SendFileObj*)_sendFileObj;fd_setfds;fd_set*rfds=

余璜的技术博客 1万+

linux飞鸽传书源码及安装

图解Ubuntu linux 下编译安装飞鸽传书IPMsg步骤,包括飞鸽传书源码的编译,可以借鉴学习linux下的网络编程技术

飞鸽传书源码分析三-网络

简单分析飞鸽传书如何对网络进行编程。

mxway的专栏 4203

飞鸽传书源代码(局域网中特别好的传输工具)

Index: 1. About IP Messenger 2. License 3. Requirements 4. Directory 5. Support 从别的地方下载,并非原创。该程序在VC环境下编写

IPMSG飞鸽传书源代码

飞鸽传书 IPMSG c语言 源代码

飞鸽传书源码分析六-文件传输续

分析飞鸽传书对文件传输时的详细步骤。

mxway的专栏 2133

2-feig.tar.gz_Qt 文件传输_qt 飞鸽_qt飞鸽传书_飞鸽_飞鸽 qt

利用QT写的飞鸽传书,传输文件目录,聊天。测试可以运行

飞鸽传书源码分析四-消息发送

本篇文章是在飞鸽传书源码v2.06的基础上进行分析的 飞鸽传书是一款工作在局域网的软件,支持局域网里不同设备之间的消息发送及文件的传输(消息发送使用udp,文件传输使用tcp)。 发送消息及文件传输是在飞鸽传书的发送对话框中进行,而发送对话框的打开是通过双击拖盘(win7系统)到任务栏的图标。而拖盘到任务栏的这个图标就是飞鸽传书的主窗口,对应的源码就是Mainwin.cpp中的TMainWin

mxway的专栏 4409

飞鸽传书(IPMsg4.85)最新源代码

飞鸽传书最新的源代码4.85版,使用VS2017编译通过需要WIN10SDK

【Android应用源码】飞鸽传书.zip

资源说明: 1:本资料仅用作交流学习参考,请切勿用于商业用途。 2:一套精品实用安卓应用APP源码资源,无论是入门练手还是项目复用都超实用,省去重复开发时间,让开发少走弯路!

Ipmsg

目录1 功能介绍2 源码简介3 自述文件(readme)4 版本差异5 软件截图6 相关资源<br /> 飞鸽传书主界面ipmsg全称:IP Messenger,中文名为“飞鸽传书”,是一款由一个名叫H.Shirouzu的日本人开发和维护的用C语言写的局域网聊天和文件传输工具。后来发展为很多志愿者共同开发多种版本。它是一个小巧方便的即时通信软件,它适合用于局域网内甚至广域网间进行实时通信和文档共享。特别是在局域网内传送文件/文件夹的效率很高。它具有很多优点,如数据通讯不需要建立服务器、直接在两台电脑间通信和

asli33的专栏 6137

(Touch™)搭建 Windows 开发环境

> OpenHaptics 开发包参考文档。

置心一处,便无事不办 1502

IPMSG飞鸽传书7——文件发送源码分析

DWORDWINAPI TMainWin::SendFileThread(void*_sendFileObj){     SendFileObj *obj = (SendFileObj *)_sendFileObj;     fd_set       fds;     fd_set       *rfds = NULL, *wfds = &fds;     timeval      tv;    int          sock_ret;    BOOL         ret =

学而不思则罔 1532

速腾R128雷达+海康全景相机ROS数据采集避坑实录:从‘雷达不转’到MATLAB标定的完整流程

本文详细记录了速腾R128激光雷达与海康威视全景相机在ROS环境下的数据采集与MATLAB标定全流程。从硬件配置的常见陷阱(如雷达旋转参数设置)、驱动编译的依赖管理,到多传感器同步的实战技巧和MATLAB标定方法,提供了完整的避坑指南和技术方案。特别针对RoboSense R128雷达和海康相机的特殊需求给出了具体解决方案。

weixin_28717807的博客 1220

[ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042

[ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042 Django 组件存在 SQL 注入漏洞,该漏洞是由于对 QuerySet.order_by()中用户提供数据的过滤不足,攻击者可利用该漏洞在未授权的情况下,构造恶意数据执行 SQL 注入攻击,最终造成服务器敏感信息泄露。

qq_51577576的博客 3228

飞鸽传书中文源码

飞鸽传书中文源码   下载地址: http://www.azhi.net/blog/article.asp?id=35

weixin_33725270的博客 814

海德汉机床采集数据

海德汉数控系统我一般在高端机床上见得比较多。有好多五轴加工精度比较高的机床都用的是海德汉的系统。市面上常见的有530和640等型号。海德汉的采集还是有点难度的,需要对SDK有深度的了解。

若云流风的专栏 1530

飞鸽传书原理以及相关代码详解

最近公司事情不是很多,就想起回顾一件做得小项目,跟大家一起学习共享一下。   模拟飞鸽传书来实现相关的功能。首先看下: 飞鸽传书的实现原理:  (1)最关键的是局域网用户列表的建立;飞鸽启动时使用UDP协议向 255.255.255.255这个广播地址发送广播包,默认端口是2425。广播包内容包含用户名、工作组、主机名、IP等信息;  已启动飞鸽的用户通过2425端口收到此广播包后,就会

老五的作坊 6311

Python 爬虫实战:模拟登录网易云音乐(加密接口逆向与自动化登录实现)

网易云音乐作为国内主流的音乐流媒体平台,其丰富的音乐资源和个性化推荐算法吸引了大量用户。对于开发者而言,模拟登录网易云音乐并实现自动化操作,可以用于数据分析、歌单同步、歌词抓取等场景。然而,网易云音乐采用了多重加密机制和反爬策略,直接模拟登录存在较大挑战。

yansideyucsdn的博客 2590

实干派!网易易盾增强版滑块验证码,全方位讲解识别思路(含源码)

该验证码是异形滑块验证码中的一种,缺口旋转+偏移的处理需要你有很好的图像处理知识,能很好的处理透明通道,同时,该验证码需要你能很好的处理缺口和背景之间匹配的关系,该验证码的处理难点就是两个缺口之间如何找到正确的,两个检测框都有很强的相似度,且加上背景图的干扰,在图像处理和有优化上难度大大增加。

码王吴彦祖的博客 2016

C++飞鸽传书服务器客户端源码及传输协议

C++飞鸽传书服务器客户端源码及传输协议 去发现同类优质开源项目:https://gitcode.com/ 简介 本仓库提供了C++编写的局域网通信飞鸽传书服务器与客户端的完整源码及传输协议。飞鸽传书是一种基于局域网的即时通信工具,适用于企业、学校等内部网络环境。此源码可以帮助开发者学习和了解局域网通信的实现原理,是C++网络编程学习的优秀实践案例。 特点 服务器和客户端完全开源,便于学习和二次...

gitblog_06789的博客 918

webrtc进阶-- FlexFEC 实现原理与调试分析(m80 代码对齐版)

WebRTC 中 FlexFEC 技术解析与调试指南 摘要:本文深入分析 WebRTC 的 FlexFEC(灵活前向纠错)技术实现原理,重点探讨其在 m80 版本中的协商机制、接收侧恢复流程以及 SFU 场景下的特殊处理。文章指出 FlexFEC 通过动态冗余策略提升弱网抗丢包能力,详细解析了编解码器分配、SSRC 映射、包恢复等关键环节,并提供了针对 XR+SFU 场景的调试建议。调试时可重点关注 FEC 包接收与媒体包恢复日志,以验证链路有效性。

HOSTEN的博客 49
上一篇: webbench源码分析
下一篇: C++智能指针管理类
mxway
博客等级 码龄17年 370粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值