18,356
社区成员
发帖
与我相关
我的任务
分享
//======================MySock.h====================================
struct PostThreadMsg
{
SOCKET s;
HWND hwnd;
};
class CMySock
{
//邪恶的省略号................
private:
//构造函数中:PostMsg = new PostThreadMsg;
//析构中delete PostMsg;
PostThreadMsg *PostMsg;
SOCKET m_ServiceSock;
}
//======================MySock.cpp====================================
BOOL CMySock::StartNewThread(HWND hwnd)
{
PostMsg->s = m_ServiceSock;//m_ServiceSock 见.h中,且初始、绑定都正确完成
PostMsg->hwnd = hwnd;
HANDLE hRecvMsgHandle = CreateThread(NULL, 0, &RecvMsgProc, (LPVOID)PostMsg, 0, NULL);
//邪恶的省略号................
CloseHandle(hRecvMsgHandle);
}
//消息接收线程处理函数 静态成员函数
DWORD WINAPI CMySock::RecvMsgProc(LPVOID lpParameter)
{
SOCKET s = ((PostThreadMsg*)lpParameter)->s;
HWND hwnd = ((PostThreadMsg*)lpParameter)->hwnd;
int error(0);
int len = sizeof(SOCKADDR);
SOCKADDR_IN CAddr;
char recvbuf[200];
char tempbuf[300];
while(TRUE)
{
error = recvfrom(s, recvbuf, 200, 0, (SOCKADDR*)&CAddr, &len);
if (SOCKET_ERROR == error)
{
AfxMessageBox(_T("数据接收错误"));
CString err("");
err.Format(_T("错误码:%d"), WSAGetLastError());
AfxMessageBox(err);
//不要纠结这句的顺序
if (WSAEWOULDBLOCK != WSAGetLastError())
{
break;
}
}
sprintf(tempbuf, "%s 说: %s",inet_ntoa(CAddr.sin_addr), recvbuf);
//测试也能正常同主线程对话
::PostMessage(hwnd, WM_RECVMSG, 0, (LPARAM)tempbuf);
}
closesocket(s);
AfxMessageBox(_T("接收线程退出"));
return 0;
}
//编译无错,DeBug Release都编译通过,初学,什么IOCP的都不谈~~~~阻塞模式~
//谢谢各位啦~~~~~~~~~~~~~~~
int main()
{
fstream file("D:\\errorlog.txt");
WSADATA wsaData;
int error(0);
error = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (0 != error)
{
file << "网络初始化失败"
<< std::endl;
file.close();
return FALSE;
}
SOCKET serviceSock;
serviceSock = socket(AF_INET, SOCK_STREAM, 0);
if (SOCKET_ERROR == serviceSock)
{
file << "套接字初始化失败"
<< std::endl;
file.close();
return FALSE;
}
SOCKADDR_IN serviceAddr;
memset(&serviceAddr, 0, sizeof(serviceAddr));
serviceAddr.sin_family = AF_INET;
serviceAddr.sin_port = htons(5500);
serviceAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if ( SOCKET_ERROR == bind(serviceSock, (SOCKADDR*)&serviceAddr, sizeof(SOCKADDR)) )
{
file << "套接字绑定失败"
<< std::endl;
file.close();
return FALSE;
}
int len = sizeof(SOCKADDR);
SOCKADDR_IN clientAddr;
memset(&clientAddr, 0, sizeof(clientAddr));
char recvbuf[200];
char tempbuf[300];
while(TRUE)
{
if (SOCKET_ERROR == recvfrom(serviceSock, recvbuf, 200, 0, (SOCKADDR*)&clientAddr, &len))
{
file << "数据接收失败"
<< std::endl;
file << "错误码:"
<< GetLastError()
<< std::endl;
file.close();
return FALSE;
}
printf("%s 说: %s", inet_ntoa(clientAddr.sin_addr), recvbuf);
}
file.close();
closesocket(serviceSock);
system("pause");
return 0;
}