线程调用 socket编程

MervynChina 2010-12-16 03:19:25
我想要用socket编程服务器程序 在线程外完成了sock的创建和绑定,但是在线程内,不知道哪里出问题了,完成不了accept() 可能是句柄什么的出问题了,请大侠们指点。
下面是部分程序
UINT thread(LPVOID p)
{
char buff[100];
CSize size;
size.cx=0;
size.cy=30;
int s=1,msgcount,loop=1,flag=0;
CCSocketDlg *dlg1=(CCSocketDlg*)AfxGetApp()->GetMainWnd();
//获得客户端数量
msgcount=dlg1->getcount();
if (msgcount==-1)
loop=0;
if(loop)
{
s=1;
dlg1->msgsock[msgcount]=accept(dlg1->sock,(sockaddr*)&(dlg1->serv),&(dlg1->addlen));
if (dlg1->msgsock[msgcount]==INVALID_SOCKET)
{
dlg1->m_edit.SetWindowText("Error accept");
dlg1->m_list.InsertItem(dlg1->count++,"accept Error");
AfxMessageBox("accept error");
}
else
{

//启动线程
这是在CCSocketDlg m_CSocketDlg中调用的线程 我觉得是这句出问题了
CCSocketDlg *dlg1=(CCSocketDlg*)AfxGetApp()->GetMainWnd();
...全文
108 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
MervynChina 2010-12-16
  • 打赏
  • 举报
回复
就是想fishion你说的那样 dlg1->sock 以及其他关于dlg1的东西都没有带进去 那个句柄错了
CCSocketDlg *dlg1=(CCSocketDlg*)AfxGetApp()->GetMainWnd();
我应该怎么写呢?
MervynChina 2010-12-16
  • 打赏
  • 举报
回复
调试过了 发现sock的值不一样,我认为是这一句的问题,这个程序片段是我拷贝的,而这个sock的创建和线程调用都是在子窗口中完成的 所以我怀疑句柄出问题了就是这一句:
CCSocketDlg *dlg1=(CCSocketDlg*)AfxGetApp()->GetMainWnd();
fishion 2010-12-16
  • 打赏
  • 举报
回复
或者是你的socket没创建完,而线程已经运行到accept那句了?
fishion 2010-12-16
  • 打赏
  • 举报
回复
调试,看下sock创建时的值是什么,再调试看下线程中accept(dlg1->sock,(sockaddr*)&(dlg1->serv),&(dlg1->addlen))这里面的各个参数是否一致
wangtingguang 2010-12-16
  • 打赏
  • 举报
回复
可以在线程 中监听socket,之前写过的线程函数
void TKCommunication::MainLoop()
{
SOCKET sClient; // 客户端Socket
struct sockaddr_in client; // 客户端Socket地址
int iAddrSize = sizeof(client);

while(TRUE)
{
sClient = accept(m_Server, // 获得客户端Socket
(struct sockaddr*)&client,
&iAddrSize);
if(INVALID_SOCKET == sClient)
{
continue;
}

if(iAccessNum >= m_MaxAccessNum)
{
closesocket(sClient);
continue;
}

++iAccessNum;
// 构造线程函数的参数
_PARAM_ Param;
Param._this = this;
Param._socket = sClient;
std::string strIP = inet_ntoa(client.sin_addr);
char* pBuff = new char[strIP.length() + 1];
memset(pBuff, 0, strIP.length() + 1);
memcpy(pBuff, (char*)strIP.c_str(), strIP.length());
Param._ip = pBuff;
// 启动一个处理线程
AfxBeginThread(fnRecvDataFunc, (LPVOID)¶m);
}

return;
}
wangtingguang 2010-12-16
  • 打赏
  • 举报
回复
建议还是用原始socket,不要用封装的socket,对线程的支持不好.

socket I/O模型之WSAAsyncSelect模型(异步IO模型)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧