18,356
社区成员
发帖
与我相关
我的任务
分享
void CMYDlg::wss()//给服务端发送数据
{
tjz();
char sendText[100];
int numsnt,status;
sprintf(sendText,"WSS:%s$%s$%s",uname,city,Sb);
//MessageBox(sendText);
numsnt=send(ClientSock2, sendText, strlen(sendText) + 1, NO_FLAGS_SET);
if (numsnt!= (int)strlen(sendText)+1)
{
// MessageBox("ERROR: Connection terminated!","aasasa",MB_OK);
//status=closesocket( ClientSock2);
if (status == SOCKET_ERROR)
// MessageBox("ERROR: closesocket unsuccessful!","aa",MB_OK);
//status=WSACleanup();
closesocket( ClientSock2);
// if (status == SOCKET_ERROR)
// MessageBox("ERROR: WSACleanup unsuccessful!","aa",MB_OK);
return ;
}
//MessageBox(sendText);
else
{
if(WSAAsyncSelect(ClientSock2, m_hWnd, NETWORK_EVENT, FD_CLOSE | FD_READ ) == SOCKET_ERROR)
{
// MessageBox("注册网络异步事件失败!");
WSACleanup();
}
}
//MessageBox("异步成功");
}
void CMYDlg::OnNetEvent(WPARAM wParam, LPARAM lParam)
{
int iEvent1 = WSAGETSELECTEVENT(lParam);
//调用Winsock API函数,得到发生此事件的客户端套接字
SOCKET CurSock= (SOCKET)wParam;
switch(iEvent1)
{
case FD_READ: //网络数据包到达事件
OnReceive( CurSock);
break;
case FD_CLOSE: //客户端断开事件
OnClose( CurSock);
break;
default: break;
}
}
void CZKDlg::OnReceive(SOCKET CurSock)
{
try
{
char recvText[40480];
int numrcv;
Sleep(500);
numrcv=recv(ClientSock2, recvText, 40480,0);
if ((numrcv == 0) || (numrcv == SOCKET_ERROR))
{
//MessageBox("ERROR: Connection terminated!","aa",MB_OK);
status=closesocket(ClientSock2);
if (status == SOCKET_ERROR)
//MessageBox("ERROR: closesocket unsuccessful!","aa",MB_OK);
status=WSACleanup();
//if (status == SOCKET_ERROR)
// MessageBox("ERROR: WSACleanup unsuccessful!","aa",MB_OK);
}
recvText[numrcv]='\0';//这里接收到得 数据 有的时候不全,请问哪位老大能告诉如何修改接收的代码能使数据完全接收!
//MessageBox(recvText);
}
char recvText[40480];
int numrcv;
Sleep(500);
numrcv=recv(ClientSock2, recvText, 40480,0);
if ((numrcv == 0) || (numrcv == SOCKET_ERROR))
{
//MessageBox("ERROR: Connection terminated!","aa",MB_OK);
status=closesocket(ClientSock2);
if (status == SOCKET_ERROR)
//MessageBox("ERROR: closesocket unsuccessful!","aa",MB_OK);
status=WSACleanup();
//if (status == SOCKET_ERROR)
// MessageBox("ERROR: WSACleanup unsuccessful!","aa",MB_OK);
}
else
{
memcpy(m_szrcvBuf+m_nrcvBufLen, recvText, numrcv); // 将每次接收的数据缓存
m_nrcvBufLen += numrcv; // 修改缓存的位置,以便下次继续缓存
if (m_nrcvBufLen == 你确定正确的数据长度) // 这里不一定是这么处理,你还可以给你的包加上结束符根据结束符判断
{
... // 处理m_szrcvBuf中的数据
m_nrcvBufLen = 0; // 表示缓存已空
}
//////////////////////////////////////////////////////////////////////////
// m_szrcvBuf应该是一个足够大的char数组,m_nrcvBufLen是一个int或long int,需要初始化为0
}
numrcv = 0;
while(numrcv < 40480) // 40480需要事先知道(先传过来或者与发送端约定好)
{
numrcv += recv(ClientSock2, recvText + numrcv, 40480,0);
}