為什么串一回“C”,而不是“C:\用戶\桌面\專案phoneedge \ ForMark \頂”?
當我在一個空的 c 專案中測驗它時,在我將我的一些代碼從 ThreadFunction 移動到 StartButton 之前它作業(UI 應該不斷更新,但套接字 recv() 阻塞它導致它只更新一次所以我移動了開始按鈕的 UI 代碼)
這是服務器代碼,按下開始按鈕后,啟動套接字并創建一個執行緒來運行listen()accept()和recv()。關閉按鈕關閉套接字和執行緒。
服務器代碼(MFC專案)
void CUIServerDlg::StartButton()
{
WSADATA Winsockdata;
int iTCPClientAdd = sizeof(TCPClientAdd);
WSAStartup(MAKEWORD(2, 2), &Winsockdata);
TCPServerAdd.sin_family = AF_INET;
TCPServerAdd.sin_addr.s_addr = inet_addr("127.0.0.1");
TCPServerAdd.sin_port = htons(8000);
TCPServersocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bind(TCPServersocket, (SOCKADDR*)&TCPServerAdd, sizeof(TCPServerAdd));
bRunning = true;
hthread = CreateThread(NULL, 0, ThreadFunction, this, 0, &ThreadID);
WaitForSingleObject(hthread, INFINITE);
funRunning = true;
while (funRunning == true) {
vector<string> caseOne;
/*string a;
char RecvBuffer[512];//this is the declaration in member class
int iRecvBuffer = strlen(RecvBuffer) 1;*/
**a = RecvBuffer;**//a is a String, RecvBuffer is a path name like c:\user..
//Find files,This part of code is left out because it should not effect the question
//put the files found in a vector, then display it on a listbox
for (string fileVec : caseOne) {
CString fileunderPath;
string filevector1 = fileVec;
fileunderPath = filevector1.c_str();//conversion for AddString
list1.AddString(fileunderPath);
}
Sleep(1000);//The code updates every 1 second , when file names are modified is displays immediately.
}
}
我想將 Sleep(1000) 更改為 WaitForSingleObject() 以替換 WM_Timer 進行分配,但我不知道既然您需要句柄,我該如何創建另一個執行緒?
void CUIServerDlg::CloseButton()
{
bRunning = false;
funRunning = false;
WaitForSingleObject(hthread, INFINITE);
CloseHandle(hthread);
closesocket(TCPServersocket);
}
所以在這個專案之前我從來沒有學過任何關于套接字和執行緒的東西,下面代碼的想法是使用一個執行緒來運行一個while回圈來不斷檢查新的cilents來發送東西,如果思維程序是錯誤的。
DWORD WINAPI CUIServerDlg::ThreadFunction(LPVOID lpParam) {
CUIServerDlg* This = (CUIServerDlg*)lpParam;
while (This->bRunning == true) {
int iListen = listen(This->TCPServersocket, 10);
if (iListen == INVALID_SOCKET)
OutputDebugString(_T("FAIL LISTEN\n"));
This->sAccecpSocket = accept(This->TCPServersocket, (SOCKADDR*)&This->iTCPClientAdd, &This->iTCPClientAdd);
recv(This->sAccecpSocket, This->RecvBuffer, This->iRecvBuffer, 0);
}
return 0;
}
客戶端代碼(空 c 專案)
int main(){
string a = "C:\\Users\\Desktop\\Project phoneedge\\ForMark\\Top";
const char* SenderBuffer = a.c_str();
int iSenderBuffer = strlen(SenderBuffer) 1;
WSAStartup(MAKEWORD(2, 2), &WinSockData);
TCPClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
TCPServerAdd.sin_family = AF_INET;
TCPServerAdd.sin_addr.s_addr = inet_addr("127.0.0.1");
TCPServerAdd.sin_port = htons(8000);
connect(TCPClientSocket,(SOCKADDR*)&TCPServerAdd,sizeof(TCPServerAdd));
send(TCPClientSocket, SenderBuffer, iSenderBuffer, 0);
closesocket(TCPClientSocket);
WSACleanup();
system("PAUSE");
return 0;
}
uj5u.com熱心網友回復:
TCP 協議按位元組流傳遞資料。
這意味著客戶端逐位元組傳遞資料,而不是一次傳遞所有資料。
當您收到來自客戶端的資料時。通程序式可能沒有完成。
所以你需要在一次recv呼叫接收到一些資料后檢查資料是否傳遞完,然后保存子資料,直到接收到所有資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/408224.html
標籤:
