日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IPMSG(飞秋)源代码调试笔记

發布時間:2024/1/1 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IPMSG(飞秋)源代码调试笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、怎么發送普通消息?

進行socket異步select選擇,每個消息都是一個Msg包,并且分配一個senddlg為其發送消息。消息協議可以參考其他文檔,消息統一封裝成文本的方式發送,封裝方式為[屬性1:屬性2:...:消息擴展消息],屬性和屬性之間和消息之間用冒號隔開,消息和擴展消息用消息結構體的exOffset標記隔開,發送的內容可以協定解密方式。

2、使用udp協議發送,如何確定消息是否已經發送成功?

消息發送出去,對方收到消息后會返回一條消息接收成功的確認消息,

然后發送端為每個senddlg開啟一個ontimer函數,每1500ms確定一次(時間可以自己配置)發送出去的消息是否收到的回應,如果未收到則重新發送。

3、接收端如何確定兩個消息是一樣的,而丟棄后面的?

判斷packetNo,判斷addr ,判斷 portNo,pocketNo是根據time()生成的。

4、msg 結構體(如下)的exOffset字段干啥用的?

struct MsgBuf {HostSub hostSub;int version;int portNo;ULONG packetNo;ULONG command;int exOffset; // expand message offset in msgBufint dummy;char msgBuf[MAX_UDPBUF];void Init(MsgBuf *org) {if (org == NULL) {memset(this, 0, (char *)&this->dummy - (char *)this);*msgBuf = 0;return;}memcpy(this, org, (char *)&this->dummy - (char *)this);strcpy(this->msgBuf, org->msgBuf);strcpy(this->msgBuf + exOffset, org->msgBuf + exOffset);} };

??? exOffset表示可以發送除消息意外的其他內容(比如組名稱啥的,和消息區別開來),但前提是整個消息(加上exOffset)大小要小于MAX_UDPBUF。其實不用這個字段也行,我們可以把組名稱啥的封裝到消息buf里面去

5、如果輸入的字符串超出了MAX_UDPBUF怎么辦?

飛秋里面沒處理,直接截斷。。。

可以查看如下兩處處理方式:

(1)從編輯框獲取文本的時候,最大長度就用MAX_UDPBUF:

GetDlgItemText(SEND_EDIT, msg.msgBuf, MAX_UDPBUF);

(2)收取消息的時候,還會進行如下代碼判斷:

if (exStr && (ex_len = strlen(exStr) + 1) < MAX_UDPBUF -1)

{

if (++msg->exOffset + ex_len >= MAX_UDPBUF)

msg->msgBuf[(msg->exOffset = MAX_UDPBUF - ex_len) -1] = '\0';//這句表示超出直接截斷

memcpy(msg->msgBuf + msg->exOffset, exStr, ex_len);

}

6、在創建IPM的時候就進入了tcp_socket 就進入了listen的狀態。然后udp和tcp還可以同時使用一個端口,包括登入退出發送的廣播消息一并使用同一個端口,UDP發送消息,TCP發送文件,對socket的異步管理比較到位。

7、文件發送如何高效?

(1)使用內存映射文件的方式打開文件,內存映射文件方式能高效處理大文件。

(2)為發送和接收程序單獨開線程,并使用select選擇模型處理數據。

用內存映射方式打開關閉文件:

BOOL TMainWin::OpenSendFile(const char *fname, SendFileObj *obj) {DWORD lowSize, highSize, viewSize;if ((obj->hFile = ::CreateFile(fname, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)) != INVALID_HANDLE_VALUE){lowSize = ::GetFileSize(obj->hFile, &highSize);if ((obj->fileSize = (_int64)highSize << 32 | lowSize) == 0)return TRUE;obj->hMap = ::CreateFileMapping(obj->hFile, 0, PAGE_READONLY, highSize, lowSize, 0);viewSize = (int)(obj->fileSize > cfg->ViewMax ? cfg->ViewMax : obj->fileSize);highSize = (int)(obj->offset >> 32);lowSize = (int)((obj->offset / cfg->ViewMax) * cfg->ViewMax);obj->mapAddr = (char *)::MapViewOfFile(obj->hMap, FILE_MAP_READ, highSize, lowSize, viewSize);if (obj->mapAddr && IsBadReadPtr(obj->mapAddr, 1)){CloseSendFile(obj);return FALSE;}}return obj->mapAddr ? TRUE : FALSE; }BOOL TMainWin::CloseSendFile(SendFileObj *obj) {if (obj == NULL)return FALSE;::UnmapViewOfFile(obj->mapAddr);obj->mapAddr= NULL;::CloseHandle(obj->hMap); obj->hMap = NULL;::CloseHandle(obj->hFile); obj->hFile = INVALID_HANDLE_VALUE;obj->offset = 0;return TRUE; }

?

發送文件線程:

DWORD WINAPI TMainWin::SendFileThread(void *_sendFileObj) {SendFileObj *obj = (SendFileObj *)_sendFileObj;fd_set fds;fd_set *rfds = NULL, *wfds = &fds;timeval tv;int sock_ret;BOOL ret = FALSE, completeWait = FALSE;BOOL (TMainWin::*SendFileFunc)(SendFileObj *obj) =obj->command == IPMSG_GETDIRFILES ? &TMainWin::SendDirFile : &TMainWin::SendFile;FD_ZERO(&fds);FD_SET(obj->conInfo->sd, &fds);for (int waitCnt=0; waitCnt < 180 && obj->hThread != NULL; waitCnt++){tv.tv_sec = 1, tv.tv_usec = 0;if ((sock_ret = ::select(obj->conInfo->sd + 1, rfds, wfds, NULL, &tv)) > 0){waitCnt = 0;if (completeWait){ // dummy read if (::recv(obj->conInfo->sd, (char *)&ret, sizeof(ret), 0) >= 0)ret = TRUE;break;}else if ((mainWin->*SendFileFunc)(obj) != TRUE)break;else if (obj->status == FS_COMPLETE){completeWait = TRUE, rfds = &fds, wfds = NULL;if (obj->fileSize == 0) { ret = TRUE; break; }}}else if (sock_ret == 0) {FD_ZERO(&fds);FD_SET(obj->conInfo->sd, &fds);}else if (sock_ret == SOCKET_ERROR) {break;}}if (obj->isDir){mainWin->CloseSendFile(obj);while (--obj->dirCnt >= 0)::FindClose(obj->hDir[obj->dirCnt]);}obj->status = ret ? FS_COMPLETE : FS_ERROR;mainWin->PostMessage(WM_TCPEVENT, obj->conInfo->sd, FD_CLOSE);::ExitThread(0);return 0; }BOOL TMainWin::SendFile(SendFileObj *obj) {if (obj == NULL || obj->hFile == INVALID_HANDLE_VALUE)return FALSE;int size = 0;_int64 remain = obj->fileSize - obj->offset;int transMax = cfg->TransMax - (int)(obj->offset % cfg->TransMax);if (remain > 0 && (size = ::send(obj->conInfo->sd, obj->mapAddr + (obj->offset % cfg->ViewMax), (int)(remain > transMax ? transMax : remain), 0)) < 0)return FALSE;obj->offset += size;if (obj->offset == obj->fileSize)obj->status = obj->command == IPMSG_GETDIRFILES ? FS_ENDFILE : FS_COMPLETE;else if ((obj->offset % cfg->ViewMax) == 0) // {::UnmapViewOfFile(obj->mapAddr);remain = obj->fileSize - obj->offset;obj->mapAddr = (char *)::MapViewOfFile(obj->hMap, FILE_MAP_READ, (int)(obj->offset >> 32), (int)obj->offset, (int)(remain > cfg->ViewMax ? cfg->ViewMax : remain));}obj->conInfo->lastTick = ::GetTickCount();return TRUE; }BOOL TMainWin::EndSendFile(SendFileObj *obj) {if (obj == NULL)return FALSE;if (obj->hThread){HANDLE hThread = obj->hThread;obj->hThread = 0; ::WaitForSingleObject(hThread, INFINITE);::CloseHandle(hThread);}if (::closesocket(obj->conInfo->sd) != 0)obj->status = FS_ERROR; CloseSendFile(obj);if (obj->isDir)free(obj->hDir);shareMng->EndHostShare(obj->packetNo, &obj->host->hostSub, obj->fileInfo, obj->status == FS_COMPLETE ? TRUE : FALSE);sendFileList.DelObj(obj);delete obj->conInfo;delete obj;return TRUE; }

?

總結

以上是生活随笔為你收集整理的IPMSG(飞秋)源代码调试笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄色午夜| 天堂网2020 | 黄瓜视频成人 | 国产精品88| www夜片内射视频日韩精品成人 | 亚洲男人的天堂在线观看 | 三级色网 | zzji欧美大片 | 黑人性高潮| 999黄色片| 激情av综合 | 夜夜综合网 | 一区二区三区免费观看 | 99久久婷婷 | 欧美黄色一区 | 福利二区三区 | 天天操,夜夜操 | 国产一久久| 一区二区天堂 | 久久久久影视 | 成人网在线观看 | 午夜久久久久久久久久久 | 日韩和欧美的一区二区 | 欧美天天性影院 | 亚洲综合在线视频 | 日韩免费a| 日韩一级大片 | 无码一区二区三区免费 | 日韩一区二区三区在线观看视频 | 欧美精品18videosex性欧美 | 欧洲一区二区在线观看 | 日本黄色片视频 | 日韩精品视频免费播放 | 特级西西444www大精品视频免费看 | av全黄| 国产全是老熟女太爽了 | 性——交——性——乱免费的 | 色婷婷av一区二区三区大白胸 | 国产一区二区三区免费看 | 日韩精品一区二区三区视频在线观看 | 给我免费观看片在线电影的 | 黄色三级三级 | 激情三区| 国产精品国产av | 久久久久久久无码 | 亚洲精品免费看 | 一区二区中文字幕在线观看 | 欧美成人精品二区三区99精品 | 久草这里只有精品 | 久久精久久| 久草视频手机在线观看 | 精品人妻在线视频 | 超碰在线看 | 日本黄大片在线观看 | 国产精品主播在线 | 免费看欧美一级特黄a大片 国产免费的av | 国产精品一区二区三区四区五区 | xxx一区二区 | 激情四虎| 超色视频 | 五月天最新网址 | 亚洲第一香蕉网 | sese国产| 99热久久这里只有精品 | 一区二区三区视频在线免费观看 | 色漫在线观看 | 欧美日韩一区电影 | 亚洲欧美一级 | 69久久 | 伊人99在线 | 国产无套内射普通话对白 | 日本福利在线 | 三级黄色在线 | 放荡的少妇2欧美版 | 国产资源网站 | 久久久视频在线 | 4438x亚洲最大 | 国产乱子伦农村叉叉叉 | 久久调教| 一区二区三区免费毛片 | 天天干天天上 | 浪浪视频在线观看 | 黄色av免费在线观看 | 视频在线日韩 | 波多野结衣在线观看一区二区三区 | 中文字幕第9页 | 中文字幕一区二区在线观看视频 | 未满十八岁勿进 | 亚洲作爱 | 天天插天天干 | 欧美日韩一区二区三区在线播放 | av影音先锋 | 久久久999| 国产偷人妻精品一区二区在线 | 青青青青在线 | 日日日日操 | 免费视频一二三区 | 在线观看黄色网 | 麻豆一区产品精品蜜桃的特点 |