客户端启动后,连续发送三条信息,读取初始化信息,
经过调试服务端三条消息都能收到,且每收到一条,能成功发给客户端对应的初始化信息。但是服务端发给客户端的第三条信息虽然成功了(send()的返回值不为-1),但是客户端却收不到。我做了下面的调整,在客户端发完第二条信息后,弹出一个模态对话端,
点击确定,程序继续运行,服务端发给客户端的第三条信息也能成功收到,
请问到底出了什么问题?有人知道吗
经过调试服务端三条消息都能收到,且每收到一条,能成功发给客户端对应的初始化信息。但是服务端发给客户端的第三条信息虽然成功了(send()的返回值不为-1),但是客户端却收不到。我做了下面的调整,在客户端发完第二条信息后,弹出一个模态对话端,
点击确定,程序继续运行,服务端发给客户端的第三条信息也能成功收到,
请问到底出了什么问题?有人知道吗
先客户端发送字符“1111”,服务端收到后发送字符串“wang”到客户端,
然后客户端发送字符“2222”,服务端收到后发送字符串"li"到客户端。根据楼上说的客户端的协议可能一次性发送了“11112222”到服务端,
而服务端的接收函数为,recv(socket,buf,4),一次接收到四个字符,
就受到了1111,就会向客户端发送"wang",当然服务端不会向客户端发送“1i”.请问LS,要怎么做才能解决上面的问题?达到预期的效果。
我举的是个简单的例子,希望能给个比较通用的方法。
在这先谢谢了
比如队列中位11112222,则先取出来1111,然后回复wang,之后看到队列中还有东西,取出来一看,是2222,则再回一个li
就是说,服务端不知道客户端一次最大发送多少个字节过来的话,recv(socket,buf,4)中,的缓冲区大小就不好确定。
客户端一次最大发送的字节数有定值吗?服务端接收时分配多少字节的缓冲区合适呢?
我认为服务端接收时分配的字节数应该和客户端一次发送的最大字节数相等,防止有数据丢失。
但客户端一次发送的最大字节数为多少呢?
简单的控制代码如下:switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
AcceptClient(s, this->m_hWnd);
break;
case FD_READ:
if(SOCKET_ERROR==WSAAsyncSelect(s, this->m_hWnd, WM_MYSOCKMSG, 0))//取消FD_READ|FD_WRITE|FD_CLOSE网络消息通知
{
break;
}
nRecv1=GetString(s, revbuf,PACKETlEN_FIELD_VALUE);//先接收前4个字节
if(nRecv1)
{
if(SOCKET_ERROR==WSAAsyncSelect(s, this->m_hWnd, WM_MYSOCKMSG, FD_READ|FD_WRITE|FD_CLOSE)) //继续关联FD_READ|FD_WRITE|FD_CLOSE网络消息通知
{
break;
}
}
也可以定义包协议,包含包头和数据部分,服务器端每次接收包头数据,根据包头得到包的数据长度,再接收数据部分
服务端接收时两个个包都到达了,触发FD_READ消息。消息响应函数中,
服务端读取了第一个包的包头,知道了下面要读取的字节数,接收读取指定的字节数。
但是服务端不知道还有第二个数据包要读,要怎么读取第二个数据包呢?