郁闷的问题(error10054)

nj841 2004-10-10 05:00:23
Socket的通讯问题,使用UDP协议,将服务器端程序作成服务程序,定义类
class MyClass
{
static int sock;
...
};
MyClass::sock = -1;

服务的建立,删除均无问题,但是在服务程序启动后的处理函数
void HandleData()
{
MyClass::Init();
int sock = MyClass::sock;
/*sockaddr_in addr;

int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
return;

memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(9000);
addr.sin_addr.s_addr = INADDR_ANY;

if (bind(sock, (sockaddr *) &addr, sizeof(addr)) < 0)
return;
*/
for (;;)
{
fd_set readfds;
fd_set writefds;
FD_ZERO(&readfds);
FD_ZERO(&writefds);

FD_SET(sock, &readfds);
int maxfd = sock;

timeval to;
to.tv_sec = 1;
to.tv_usec = 0;
int n = select(maxfd + 1, &readfds, &writefds, NULL, &to);
if (n > 0)
{
if (FD_ISSET(sock, &readfds))
{
char buf[512];
sockaddr_in addr;
int len = sizeof(addr);
int n = recvfrom(sock, buf, 512, 0, (sockaddr *) &addr, &len);

memset(buf, 0, sizeof(buf));
sprintf(buf, "%s", "19800810");
int s = sendto(sock, (char *)buf, 20, 0, (sockaddr *) &addr, sizeof(addr));
}
}
else if (n < 0)
{
if (errno == 4)
continue;

break;
}
}
使用注释部分可以正常通讯,如果调用MyClass::Init(),客户端返回错误10054
bool MyClass::Init()
{
sockaddr_in addr;

sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
return false;

memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(9000);
addr.sin_addr.s_addr = INADDR_ANY;

if (bind(sock, (sockaddr *) &addr, sizeof(addr)) < 0)
return false;
return true;
}
而且即使调用MyClass::Init(),如果以一般的Win32 Console Application也是正常的,实在是不解!
...全文
186 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
temp3000 2004-10-11
  • 打赏
  • 举报
回复
就是说线程中不要操作静态变量
temp3000 2004-10-11
  • 打赏
  • 举报
回复

可能的原因

void HandleData()
{
}

在一个服务线程中执行的,
MyClass::Init()中使用了的静态成员变量造成不可重入问题
nj841 2004-10-11
  • 打赏
  • 举报
回复
MyClass::Init()只调用了一次,而且以一般的Win32 Console Application运行也是正常的,所以觉得很奇怪,运行后进入for( ; ; )循环,初始化只进行一次,两种方式应当一样,实在不解!!!
Micro_Sheng 2004-10-11
  • 打赏
  • 举报
回复
int sock = MyClass::sock;
你的上面的代码我觉得一点意义都没有,这基本等于重新定义了一个SOCKET,并没有改变静态成员sock,它还是处于。。。。。。
Micro_Sheng 2004-10-11
  • 打赏
  • 举报
回复
静态函数实现时也要加上static关键词!
nj841 2004-10-11
  • 打赏
  • 举报
回复
Init()已经是静态函数了
Micro_Sheng 2004-10-11
  • 打赏
  • 举报
回复
在非静态成员函数中不能直接使用静态成员变量,可以通过MyClass::sock来使用,一般在静态成员函数中调用它
所以你的Init函数应该声明为静态成员函数就OK了
声明
static bool Init();

实现
static bool MyClass::Init()
{
sockaddr_in addr;

sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
return false;

memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(9000);
addr.sin_addr.s_addr = INADDR_ANY;

if (bind(sock, (sockaddr *) &addr, sizeof(addr)) < 0)
return false;
return true;
}
xxedge 2004-10-10
  • 打赏
  • 举报
回复
你的这个函数是不是会多次调用?如果是的话,
关键的区别是注释部分sock在每次调用的时候都是不同的,分别进行初始化,
而使用静态成员变量,相当于全局变量,在后面调用的时候,就把前面的sock给
覆盖掉了。

如果只是调用一次的话,我觉得两种处理是一样的。

18,355

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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