猿问

您好,请问在socket中的recv和send都有错,该怎么解决?

客户端中,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();
}

江户川乱折腾
浏览 595回答 2
2回答

泛舟湖上清波郎朗

提供一下你的完整客户端和服务端的代码。但看这个代码没什么问题。但是根据你的描述,到recv的时候执行不下去,可能是因为没有接受到服务端所发送的消息导致的。因为recv函数是一个阻塞函数,当这个函数没有收到消息时会一直等待,当收到消息之后才能继续向下执行。

SMILET

是这样的,你的通信是同步的,所以recv一直处于接收状态,只有接收到数据才会执行下一步。改进:可以循环等待接收,在循环里可以处理recv:1、使用setsockopt设置超时时间。2、添加select等异步处理(里面也可以设置时间)。PS:个人建议:你若急着完成任务可以采用1,若你是学习状态,可以学习一下select等异步通信
随时随地看视频慕课网APP
我要回答