求問:為什么建立連接之后,程式總是崩掉,是while回圈的問題嗎?
200分是我全部家當,真心求教
if(radio1==0)///////////////////////////////////////創建服務端
{
WSADATA Ws ;
SOCKET ServerSocket, ClientSocket;
struct sockaddr_in LocalAddr, ClientAddr;
int iRet = 0;
int AddrLen = 0;
HANDLE hThread = NULL;
//Init windows socket
if(WSAStartup(MAKEWORD(2,2), &Ws) != 0)
{
}
//Create Socket
ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
LocalAddr.sin_family = AF_INET;
LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
LocalAddr.sin_port = htons(PORT);
memset(LocalAddr.sin_zero, 0x00, 8);
//Bind Socket
iRet = bind(ServerSocket, (struct sockaddr*)&LocalAddr, sizeof(LocalAddr));
iRet = listen(ServerSocket, 10);
AddrLen = sizeof(ClientAddr);
ClientSocket= accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen);
while(1)
{
if(recv(ClientSocket,editfive,MAX_PATH,0)>0)
{
CString edittemp(editfive);
edit5=edittemp;
UpdateData(FALSE);
}
if((editfour[0])!='\0')
{
send(ClientSocket, editfour, strlen(editfour), 0);
editfour[0]='\0';
//memset(editfour,0,sizeof(editfour));
}
Sleep(1000);
}
}
else////////////////////////////////////////////////////創建客戶端
{
WSADATA Ws;
SOCKET ClientSocket;
struct sockaddr_in ServerAddr;
int iRet = 0;
int iAddrLen = 0;
HANDLE hThread = NULL;
//init windows socket;
if(WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
{
}
//Create Socket
ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
ServerAddr.sin_port = htons(PORT);
memset(ServerAddr.sin_zero, 0x00, 8);
//Connect Server
iRet = connect(ClientSocket, (struct sockaddr*)&ServerAddr, sizeof(ServerAddr));
while(1)
{
if((editfour[0])!='\0')
{
send(ClientSocket, editfour, strlen(editfour), 0);
editfour[0]='\0';
//memset(editfour,0,sizeof(editfour));
}
if(recv(ClientSocket,editfive,MAX_PATH,0)>0)
{
CString edittemp(editfive);
edit5=edittemp;
UpdateData(FALSE);
}
Sleep(1000);
}
}// TODO: 在此添加控制元件通知處理程式代碼
}
void Cshuangji::OnBnClickedButton2()////////////////////////////////點擊發送按鈕
{
UpdateData(TRUE);
editfour=edit4.GetBuffer(0);
// TODO: 在此添加控制元件通知處理程式代碼
}
uj5u.com熱心網友回復:
先看程式出錯的時候,代碼跑在什么位置,然后來分析。或者增加一下日志等uj5u.com熱心網友回復:
代碼是button點擊事件里的?while(1) 里面不斷接收發送。或者sleep 根本沒有讓點擊事件回傳,mfc程式訊息回圈就阻塞了。
1.換用多執行緒
2.換用異步socket
uj5u.com熱心網友回復:
Sleep(1000); 改 為void DoEvents()
{
MSG msg;
// Process existing messages in the application's message queue.
// When the queue is empty, do clean up and return.
while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{// has msg
if (!AfxGetThread()->PumpMessage()) break;
}
}
uj5u.com熱心網友回復:
我用多執行緒了,但是不知道為什么發送端沒問題,除錯接收端到recv函式自動停止了struct local//////////////////////////////////////////////////////////////////////啟動多執行緒傳入的結構體引數
{
SOCKET socket;
char* rcvmessage;
char* sendmessage;
};
DWORD WINAPI RThread(LPVOID lpParameter)///////////////////////接收端
{
Sleep(3000);
local* c = (local*)lpParameter;
while(1)
{
if(recv(c->socket,c->rcvmessage,2,0)>0)
{
continue;
}
}
return 0;
}
DWORD WINAPI SThread(LPVOID lpParameter)/////////////////////發送端
{
Sleep(3000);
local* c = (local*)lpParameter;
while(1)
{
if(strcmp(c->sendmessage,""))
{
send(c->socket,c->sendmessage, strlen(c->sendmessage), 0);
c->sendmessage[0]='\0';
}
}
return 0;
}
uj5u.com熱心網友回復:
edit5=edittemp;UpdateData(FALSE);
如果你的接收端用的是作業執行緒,就不要在作業執行緒中,去更新主界面的任何控制元件,直接postmessage給主界面,讓主界面自己處理
總之一點,不要在作業執行緒中呼叫主界面的任何和界面更新以及改變控制元件屬性的方法和函式。不然,絕對會崩
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/88193.html
標籤:基礎類
上一篇:mfc c++服務器端放在外網服務器,客戶端放同一個局域網p2p打洞不成功
下一篇:64位的win7系統,用vs2012生成release下的exe程式,在其他win10、win7呼叫dll失敗問題
