线程访问内存的问题。

xf_pan 2008-09-18 11:38:22
如下程序,我在main里调用WinSocket的AcceptSocket方法没问题。。
但把步移到线程里,调试发现不能访问WinSocket的成员变量,nClientSocketAddrLen。。
这是什么问题啊,,线程里是用的这个对象的引用阿。。为什么无法访问呢~~
听听高手的解答。
程序如下
TestMian:

//#include <windows.h>
#include <iostream>
#include <winsock2.h>
#include "WinSocket.h"
#pragma comment(lib,"Ws2_32.lib")
using namespace std;
const u_long PORT = 5555;
HANDLE hHand;

DWORD WINAPI doAcceptConnect(WinSocket &winSocket);

int main()
{
WinSocket winSocket;
if(winSocket.InitSocketLib())
{
return 0;
}
SOCKADDR_IN serverSockAddr;
serverSockAddr.sin_addr.S_un.S_addr = htons(INADDR_ANY);
serverSockAddr.sin_family = AF_INET;
serverSockAddr.sin_port = htons(PORT);

if(!winSocket.CreateSocket())
{
return 0;
}
if(!winSocket.BindSocket(serverSockAddr))
{
return 0;
}
if(!winSocket.ListenSocket(2))
{
return 0;
}

/* if(!winSocket.AcceptSocket())
{
return 0;
}*/
hHand = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)doAcceptConnect,NULL,0,NULL);

while(1)
{
Sleep(500);
}
}

DWORD WINAPI doAcceptConnect(WinSocket &winSocket)
{
while(true)
{
if(!winSocket.AcceptSocket())
{
return 0;
}

char *buffer = new char[255];
if(!winSocket.ReceiveSocket(&buffer))
{
return 1;
}

cout<<buffer<<endl;
}
return 0;
}


WinSocket.h WinSocket.cpp

/**
*create a sokcet server or client
**/
#ifndef WINSOCKET_H
#define WINSOCKET_H
#pragma once
//#include <windows.h>
#include <winsock2.h>
#include <iostream>

using namespace std;

#pragma comment(lib,"Ws2_32.lib")

const int SUCCESS = 1;
const int MAXBUFLEN = 256;
const int NO_FLAGS_SET = 0;

class WinSocket
{

public:
WinSocket(void);
~WinSocket(void);

/**
*listen socket
**/
int SendMessage(SOCKET ¶Socket,SOCKADDR_IN ¶SeverAddr);


/**
*init the socket lib
**/
int InitSocketLib();

/**
*craate a socket
**/
int CreateSocket();

/**
*bind the socket
**/
int BindSocket(SOCKADDR_IN ¶SeverAddr);

/**
*listen socket
**/
int ListenSocket(int nType);

/**
*listen socket
**/
int AcceptSocket();

/**
*listen socket
**/
int ConnectSocket(string strServerIP,int nPort);

/**
*listen socket
**/
int ReceiveSocket(char **buffer);

private:
WSADATA m_WSAdata;
SOCKET m_socket,m_ClientSocket;
SOCKADDR_IN m_ServerSockAddr,m_ClientSocketAddr;
int nClientSocketAddrLen;
};
#endif


#include "WinSocket.h"

WinSocket::WinSocket(void)
{
}

WinSocket::~WinSocket(void)
{
}

/**
*init the socket lib
**/
int WinSocket::InitSocketLib()
{
return WSAStartup(MAKEWORD(1, 1), &m_WSAdata);
}
/**
*craate a Socket
**/
int WinSocket::CreateSocket()
{
m_socket = socket(AF_INET, SOCK_STREAM, 0);
if(m_socket==INVALID_SOCKET)
{
return ERROR;
}
return SUCCESS;

}

/**
*bind the socket
**/
int WinSocket::BindSocket(SOCKADDR_IN ¶SeverAddr)
{
if(bind(m_socket,(LPSOCKADDR)¶SeverAddr,sizeof(paraSeverAddr)) == SOCKET_ERROR)
{
return ERROR;
}

return SUCCESS;
}

/**
*listen socket
**/
int WinSocket::ListenSocket(int nType)
{
if(listen(m_socket,nType)==SOCKET_ERROR)
{
return ERROR;
}
return SUCCESS;
}

/**
*listen socket
**/
int WinSocket::AcceptSocket()
{
nClientSocketAddrLen = sizeof(m_ClientSocketAddr);
int nResult = accept(m_socket,(LPSOCKADDR)&m_ClientSocketAddr,&nClientSocketAddrLen);
if(nResult==SOCKET_ERROR)
{
return ERROR;
}
return SUCCESS;
}

/**
*listen socket
**/
int WinSocket::ConnectSocket(string strServerIP,int nPort)
{
m_ServerSockAddr.sin_addr.S_un.S_addr = inet_addr(strServerIP.c_str());
m_ServerSockAddr.sin_port = nPort;
m_ServerSockAddr.sin_family = AF_INET;

if(connect(m_socket,(LPSOCKADDR)&m_ServerSockAddr,sizeof(m_ServerSockAddr))==SOCKET_ERROR)
{
return ERROR;
}
return SUCCESS;
}

/**
*listen socket
**/
int WinSocket::ReceiveSocket(char **buffer)
{
int nResult = recv(m_ClientSocket,*buffer,MAXBUFLEN, NO_FLAGS_SET);
if(nResult == 0 || nResult == SOCKET_ERROR)
{
return ERROR;
}
return SUCCESS;
}

...全文
140 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
blackcat242 2008-09-18
  • 打赏
  • 举报
回复
jf啦
xf_pan 2008-09-18
  • 打赏
  • 举报
回复
汗,,粗心了,
忘了传参数,,
xf_pan 2008-09-18
  • 打赏
  • 举报
回复
特此感谢bubu8633的建议,收获不少,结贴了。。
冷月清晖 2008-09-18
  • 打赏
  • 举报
回复
还有,建议不要用
while(1)
while(true)之类的来循环,

用while(bFlag)来循环bFlag为一个布尔量,方便正常退出。
冷月清晖 2008-09-18
  • 打赏
  • 举报
回复
不过,你最好有个全局的结构,存放每个连接的信息,方便程序扩展的查询,处理之类的需求。
e_sharp 2008-09-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xf_pan 的回复:]
汗,,粗心了,
忘了传参数,,
[/Quote]

JF :)
冷月清晖 2008-09-18
  • 打赏
  • 举报
回复
应该没关系的吧,线程函数里的局部变量是根据不同线程的不同的
xf_pan 2008-09-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 bubu8633 的回复:]
while(true)
{
char *buffer = new char[255];
if(!winSocket.ReceiveSocket(&buffer))
{
return 1;
}

cout < <buffer < <endl;
}
红色那里有点恐怖,内存哇!
[/Quote]
这里我知道,,没释放,,我现在是在尝试方法,感谢指出这个大问题。,我想知道,这样winSocket.AcceptSocket()以后,把sokcet保存是在一个对象的同一个变量里。。
会不会有问题~~,后面的覆盖了前面的,,会有问题吗
冷月清晖 2008-09-18
  • 打赏
  • 举报
回复
其它说不上来,还是要实际测滴!
冷月清晖 2008-09-18
  • 打赏
  • 举报
回复
while(true)
{
char *buffer = new char[255];
if(!winSocket.ReceiveSocket(&buffer))
{
return 1;
}

cout < <buffer < <endl;
}
红色那里有点恐怖,内存哇!
xf_pan 2008-09-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bubu8633 的回复:]
引用 6 楼 xf_pan 的回复:
呵呵。。帖都发了,,
就顺便问问大家,,都是怎么做针对多连接的~~?


来个连接建一个线程呗,

大规模情况用线程池呗。
[/Quote]
第一次搞这方面的程序,,下面是我现在的做法,,就是一个连接一个线程,,
请问,,这样会不会产生问题啊~,,我现在还没测都连接会出现什么情况,,也不好测。。
while(1)
{

if(!winSocket.AcceptSocket())
{
return 0;
}

LPVOID para;
para = (LPVOID) &winSocket;
hHand = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)doAcceptConnect,para,0,NULL);

}
}

DWORD WINAPI doAcceptConnect(WinSocket &winSocket)
{
while(true)
{
char *buffer = new char[255];
if(!winSocket.ReceiveSocket(&buffer))
{
return 1;
}

cout<<buffer<<endl;
}
return 0;
}
冷月清晖 2008-09-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xf_pan 的回复:]
呵呵。。帖都发了,,
就顺便问问大家,,都是怎么做针对多连接的~~?
[/Quote]

来个连接建一个线程呗,

大规模情况用线程池呗。
wudeshou82666 2008-09-18
  • 打赏
  • 举报
回复
接分了
哈哈
没做过网络方面的啊
就不说了
xf_pan 2008-09-18
  • 打赏
  • 举报
回复
呵呵。。帖都发了,,
就顺便问问大家,,都是怎么做针对多连接的~~?
tengye19840704 2008-09-18
  • 打赏
  • 举报
回复
参数
冷月清晖 2008-09-18
  • 打赏
  • 举报
回复
刚想说有没全局或传参,jf :)
星羽 2008-09-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xf_pan 的回复:]
汗,,粗心了,
忘了传参数,,
[/Quote]

技术散分我喜欢 :)

64,282

社区成员

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

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