void CServerDlg::OnStart()
{
// TODO: Add your control notification handler code here
UpdateData(); if(m_sockSend.Create(m_ServerPort,SOCK_DGRAM,NULL))//创建套接字
{
m_sockSend.Bind(m_ServerPort,m_ServerIP); //绑定本地套接口
SetTimer(1,2000,NULL);//创建一个定时器定时发送
//GetDlgItem(IDC_SEND)->EnableWindow(false);//发送按钮无效
//GetDlgItem(IDC_STOP)->EnableWindow(true);//停止按钮生效
}
else
{
AfxMessageBox("Socket创建失败!");
} //在这儿开始一个子线程
pThread1=AfxBeginThread(ThreadFunc1,&thdStruct[1]); }//下面这个计时器处理可以发送到客户端
void CServerDlg::OnTimer(UINT nIDEvent)
{
CString m_ClientIP="127.0.0.1";
UINT m_ClientPort=8080;
int iSend= m_sockSend.SendTo(szSend,10,m_ClientPort,m_ClientIP,0);//发送UDP数据
CDialog::OnTimer(nIDEvent);
}//在子线程函数中,为什么老发送不出去,也不提示出错,就好像没发送动作一样
UINT ThreadFunc1(LPVOID lpParam)
{
threadStruct* pwwm=(threadStruct*)lpParam;
int bm;
bm=1;
while (bm)
{
Sleep(2000);
strcpy(szSend,"567");//这句能成功
strcpy(szSend,p); //这句也能成功
CString m_ClientIP="127.0.0.1";
UINT m_ClientPort=8080;
m_sockSend.SendTo("1234",10,m_ClientPort,m_ClientIP,0);//这句好像不存在似的,为什么这句不能发送成功
}
return 0;}
{
// TODO: Add your control notification handler code here
UpdateData(); if(m_sockSend.Create(m_ServerPort,SOCK_DGRAM,NULL))//创建套接字
{
m_sockSend.Bind(m_ServerPort,m_ServerIP); //绑定本地套接口
SetTimer(1,2000,NULL);//创建一个定时器定时发送
//GetDlgItem(IDC_SEND)->EnableWindow(false);//发送按钮无效
//GetDlgItem(IDC_STOP)->EnableWindow(true);//停止按钮生效
}
else
{
AfxMessageBox("Socket创建失败!");
} //在这儿开始一个子线程
pThread1=AfxBeginThread(ThreadFunc1,&thdStruct[1]); }//下面这个计时器处理可以发送到客户端
void CServerDlg::OnTimer(UINT nIDEvent)
{
CString m_ClientIP="127.0.0.1";
UINT m_ClientPort=8080;
int iSend= m_sockSend.SendTo(szSend,10,m_ClientPort,m_ClientIP,0);//发送UDP数据
CDialog::OnTimer(nIDEvent);
}//在子线程函数中,为什么老发送不出去,也不提示出错,就好像没发送动作一样
UINT ThreadFunc1(LPVOID lpParam)
{
threadStruct* pwwm=(threadStruct*)lpParam;
int bm;
bm=1;
while (bm)
{
Sleep(2000);
strcpy(szSend,"567");//这句能成功
strcpy(szSend,p); //这句也能成功
CString m_ClientIP="127.0.0.1";
UINT m_ClientPort=8080;
m_sockSend.SendTo("1234",10,m_ClientPort,m_ClientIP,0);//这句好像不存在似的,为什么这句不能发送成功
}
return 0;}
可以用一般的winsock来编程,给线程传入创建的套节字
因为这个连个类和线程相关。如果你要确实要跨线程操作,那你还是用winsock吧,直接API
你看看上句中的m_sockSend的值是不是和你创建socket时m_sockSend的值一样,如果真如1楼说的m_sockSend 是 CServerDlg 的成员变量,那你肯定不能在线程函数(静态全局函数)中调类的成员函数
{
CServerDlg* pwwm=(CServerDlg*)lpParam;
pwwm->m_sockSend.Create(8081,SOCK_DGRAM,NULL);//这句有误,老提示内存不能为read...
}在pThread1=AfxBeginThread(ThreadFunc1,this); 时,把对话框的指针this传给线程函数了,m_sockSend为对话框的一个成员函数。CControlSocket m_sockSend;而CControlSocket是派生而来,如下
class CControlSocket : public CAsyncSocket
查下msdn吧
{
CControlSocket m_sockSend; if(m_sockSend.Create(8080,SOCK_DGRAM,NULL))//创建套接字
{
// pwwm->m_sockSend.Bind(8080,"127.0.0.1"); //绑定本地套接口
}
else
{
AfxMessageBox("Socket创建失败!");
}
但是,那句Create还是会出错,难道Create只能在主线程中用
计算线程没有消息泵用户界面线程可以从CWinThread类派生一个出来,
计算线程就定义一个stdcall API函数就可以了(就是你用的方法)CAsyncSocket内封装了一个CSockWnd窗口,用来中转消息,所以它和它的派生类都必须运行在有消息泵的线程中由于CSocket的特殊封装,用它的阻塞模式可以直接应用于计算线程,但是重载模式也必须运行在用户界面线程中