//这是服务器端代码,我在连接到服务器后使用onReceive
//void CMFCExampleDlg::OnReceive(int nErrorCode)
{
recv(clientsocket,"200" , 1024, 0);
m_name.SetVariable("gear","1");
}
Run Code Online (Sandbox Code Playgroud)
//////客户端
//BOOL CMFCClientDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->lParam==VK_NUMLOCK)
send(s,"200",1024,0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
两个明显的错误:
使用recv():
recv(clientsocket,"200" , 1024, 0);
Run Code Online (Sandbox Code Playgroud)第二个参数填充了传入的数据,因此必须是可修改的(修改字符串文字是未定义的行为)并且足够大以存储所请求的字节:
char buffer[1024] = ""; /* recv() does not null terminate. */
int bytes_read = recv(clientsocket, buffer , 1024, 0);
if (SOCKET_ERROR == bytes_read)
{
/* Failure. */
}
else
{
/* SOME bytes were read. */
}
Run Code Online (Sandbox Code Playgroud)
代码正在撒谎,send()因为没有1024要发送的数据字节:
send(s,"200",1024,0);
Run Code Online (Sandbox Code Playgroud)这将导致未定义的行为,因为send()将访问超出"200"存储字符串文字的数组的边界:
int bytes_sent = send(s, "200", 3, 0);
if (3 != bytes_sent)
{
/* Failed to send all data. */
}
Run Code Online (Sandbox Code Playgroud)
重要的是要记住,在套接字中写入和读取数据只是一个字节流,并且没有消息的逻辑概念:您必须通过某种应用程序定义的协议来实现它.例如:
recv()并且send()通常在循环中使用,直到读取所有数据,发送所有数据或发生不可恢复的故障.
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |