客戶端中,recv(m_sockClient,strRecv,100,0); 執行不下去(一直卡在這句,感覺這句根本沒執行)。自己將socket的函數封裝成一個類。第一次接觸,徹底蒙了。下邊是自己寫的類。看看哪里有問題://加載套接字庫void CClientSocket::AddWSA() {m_wVersionRequested = MAKEWORD( 1, 1 );m_err = WSAStartup( m_wVersionRequested, &m_wsaData );if ( m_err != 0 ) {return;}if ( LOBYTE( m_wsaData.wVersion ) != 1 ||HIBYTE( m_wsaData.wVersion ) != 1 ) {WSACleanup( );return; }}//創建用于監聽的套接字并連接void CClientSocket::Create() {m_sockClient = socket(AF_INET,SOCK_STREAM,0);//連接m_addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");m_addrSrv.sin_family = AF_INET;m_addrSrv.sin_port = htons(6000);connect(m_sockClient, (SOCKADDR*)&m_addrSrv, sizeof(SOCKADDR));HANDLE hThread = CreateThread(NULL,0,ThreadProc,this,0,NULL); //創建線程CloseHandle(hThread); //關閉內核對象線}DWORD WINAPI CClientSocket::ThreadProc(LPVOID lpParameter){CClientSocket *pClientSock= (CClientSocket *)lpParameter;Sleep(1);pClientSock->Recv();return 0;}//接受消息CString CClientSocket::Recv() {//等待服務器的消息到來CString str;char strRecv[100] = "\0";m_length = sizeof(SOCKADDR);Sleep(1);recv(m_sockClient,strRecv,100,0); str.Format("%s",strRecv);return str;}//發送消息void CClientSocket::Send(CString str) {char strSend[100] = "\0";str.GetBuffer(str.GetLength());strcpy(strSend,str);send(m_sockClient,strSend,strlen(strSend)+1,0);}//關閉套接字void CClientSocket::close(){closesocket(m_sockClient);WSACleanup();}
2 回答

泛舟湖上清波郎朗
TA貢獻1818條經驗 獲得超3個贊
提供一下你的完整客戶端和服務端的代碼。但看這個代碼沒什么問題。
但是根據你的描述,到recv的時候執行不下去,可能是因為沒有接受到服務端所發送的消息導致的。
因為recv函數是一個阻塞函數,當這個函數沒有收到消息時會一直等待,當收到消息之后才能繼續向下執行。

SMILET
TA貢獻1796條經驗 獲得超4個贊
是這樣的,你的通信是同步的,所以recv一直處于接收狀態,只有接收到數據才會執行下一步。
改進:
可以循環等待接收,在循環里可以處理recv:
1、使用setsockopt設置超時時間。
2、添加select等異步處理(里面也可以設置時間)。
PS:個人建議:你若急著完成任務可以采用1,若你是學習狀態,可以學習一下select等異步通信
添加回答
舉報
0/150
提交
取消