自己做了一个WSAAsyncSelect模型的简易聊天室,不知道为什么收发字符串只能收发4个字符,真心求教!解决办法
自己做了一个WSAAsyncSelect模型的简易聊天室,不知道为什么收发字符串只能收发4个字符,真心求教!
不太会发图。。界面就只有一个发送信息的按钮和两个编辑框,IDC_EDIT_SENDMSG是当前要说的话,IDC_EDIT_RECORD是一个显示聊天记录的大编辑框。问题如下:
我在某一端(如客户端)的编辑框里输入一串字符,如“qwerwrerwwerew”,另一端收到的都只是前四个字符,也就是“qwer”,服务器给客户端发的时候也是一样。我在两端都设置断点看了一下,发出去之前从IDC_EDIT_SENDMSG获取的文字是完整的字符串,但是另一端接收过来就只能收到前四个字符,百思不得其解,求助大神!以下是代码(因为两端都有这样的问题,所以为了方便只贴服务端的了):
void CTestDlg::InitSocket() //初始化套接字
{
WSADATA wsadata;
::WSAStartup(MAKEWORD(2,2),&wsadata);
m_socket = ::socket(AF_INET,SOCK_STREAM,0);
::WSAAsyncSelect(m_socket,this->m_hWnd,WM_CONNECT,FD_ACCEPT|FD_READ);
SOCKADDR_IN addr;
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addr.sin_family = AF_INET;
addr.sin_port = htons(8888);
bind(m_socket,(SOCKADDR*)&addr,sizeof(SOCKADDR));
listen(m_socket,2);
}
LRESULT CTestDlg::OnConnect(WPARAM wParam,LPARAM lParam) /*用的VC2008,一开始设置的函数类型是void,但是报错说不能将void类型的转换成LRESULT型的,我就干脆改成LRESULT型的了*/
{
switch(lParam)
{
case FD_ACCEPT:
{
SOCKADDR addr;
int len;
len = sizeof(SOCKADDR);
GetDlgItem(IDC_STATUS)->SetWindowText("有新的连接到来!");//一个静态文本, 表明当前状态
tem = ::accept(m_socket,(SOCKADDR*)&addr,&len);//建了两个SOCKET,分别是m_Socket和tem,一个用于连接另一个绑定
break;
}
case FD_READ:
{
char buf[100] = "";
recv(tem,buf,sizeof(buf),0);//自己感觉问题好像出在这里,因为字符串发送成功了,却只留下了四个字符,奇怪~~
GetDlgItem(IDC_EDIT_RECORD)->SetWindowText(buf);//在“聊天记录”那个大编辑框里显示收到的buf,下断点看了看,接收的就只有四个字符,后面的根本没接收到。。。
break;
}
}
return 0;
}
谢谢!
------解决方案--------------------
判断send和recv的返回值
不太会发图。。界面就只有一个发送信息的按钮和两个编辑框,IDC_EDIT_SENDMSG是当前要说的话,IDC_EDIT_RECORD是一个显示聊天记录的大编辑框。问题如下:
我在某一端(如客户端)的编辑框里输入一串字符,如“qwerwrerwwerew”,另一端收到的都只是前四个字符,也就是“qwer”,服务器给客户端发的时候也是一样。我在两端都设置断点看了一下,发出去之前从IDC_EDIT_SENDMSG获取的文字是完整的字符串,但是另一端接收过来就只能收到前四个字符,百思不得其解,求助大神!以下是代码(因为两端都有这样的问题,所以为了方便只贴服务端的了):
void CTestDlg::InitSocket() //初始化套接字
{
WSADATA wsadata;
::WSAStartup(MAKEWORD(2,2),&wsadata);
m_socket = ::socket(AF_INET,SOCK_STREAM,0);
::WSAAsyncSelect(m_socket,this->m_hWnd,WM_CONNECT,FD_ACCEPT|FD_READ);
SOCKADDR_IN addr;
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addr.sin_family = AF_INET;
addr.sin_port = htons(8888);
bind(m_socket,(SOCKADDR*)&addr,sizeof(SOCKADDR));
listen(m_socket,2);
}
LRESULT CTestDlg::OnConnect(WPARAM wParam,LPARAM lParam) /*用的VC2008,一开始设置的函数类型是void,但是报错说不能将void类型的转换成LRESULT型的,我就干脆改成LRESULT型的了*/
{
switch(lParam)
{
case FD_ACCEPT:
{
SOCKADDR addr;
int len;
len = sizeof(SOCKADDR);
GetDlgItem(IDC_STATUS)->SetWindowText("有新的连接到来!");//一个静态文本, 表明当前状态
tem = ::accept(m_socket,(SOCKADDR*)&addr,&len);//建了两个SOCKET,分别是m_Socket和tem,一个用于连接另一个绑定
break;
}
case FD_READ:
{
char buf[100] = "";
recv(tem,buf,sizeof(buf),0);//自己感觉问题好像出在这里,因为字符串发送成功了,却只留下了四个字符,奇怪~~
GetDlgItem(IDC_EDIT_RECORD)->SetWindowText(buf);//在“聊天记录”那个大编辑框里显示收到的buf,下断点看了看,接收的就只有四个字符,后面的根本没接收到。。。
break;
}
}
return 0;
}
谢谢!
------解决方案--------------------
判断send和recv的返回值