为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

江户川乱折腾 2021-11-03 11:07:20
客户端中,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函数是一个阻塞函数,当这个函数没有收到消息时会一直等待,当收到消息之后才能继续向下执行。

查看完整回答
反对 回复 2021-11-07
?
SMILET

TA贡献1796条经验 获得超4个赞

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

查看完整回答
反对 回复 2021-11-07
  • 2 回答
  • 0 关注
  • 594 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信