如何在主进程共享子线程中accept得到的socket号?

ks9960 2003-12-23 07:27:45
用全局变量带回socket号但不能使用,子线程中该资源是私有的。请大家帮忙 谢谢
...全文
65 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ks9960 2003-12-24
  • 打赏
  • 举报
回复
没人理我啊!!!痛苦
ks9960 2003-12-24
  • 打赏
  • 举报
回复
va_list老大,人了?
ks9960 2003-12-24
  • 打赏
  • 举报
回复
while(1)
{
if ((newSock =
accept(listenSock, (struct sockaddr*)&sin, sizeof(sin))) == -1)
{
if (errno == EINTR)
{
continue;
}

perror("accept() ");
return -1;
}

// 设置newSock为非阻塞socket
fcntl(newSock, F_SETFL, O_NDELAY);
// 设置超时
if (setTimeout(newSock, expired) <= 0)
{
close(newSock);
continue;
}
......................
g_Sock = newSock;(用它带回让主进程使用)
......................
主进程自己写的get_info()函数用g_Sock接收数据,但收不到啊
fierygnu 2003-12-24
  • 打赏
  • 举报
回复
程序有问题。贴代码。
lichungen 2003-12-24
  • 打赏
  • 举报
回复
进程间通讯,比如管道
rexp 2003-12-24
  • 打赏
  • 举报
回复
我感觉是能公用的。
ks9960 2003-12-24
  • 打赏
  • 举报
回复
自己顶一下
ks9960 2003-12-24
  • 打赏
  • 举报
回复
实在不好意思,是我自己主进程打回应包打错了,被代理把连接断掉了,所以收不到数据了,不是因为与字线程冲突。
结贴!
growup 2003-12-24
  • 打赏
  • 举报
回复
>>g_Sock = newSock;(用它带回让主进程使用)
如果你用的是多进程而不是用多线程,那么这个g_Sock是无法带回父进程的,很明显父子进程各有一个g_Sock变量,不是同一个。

一般做法是父进程accept(),得到newSock后fork()子进程对这个socket处理。
或者用线程。
sharkhuang 2003-12-24
  • 打赏
  • 举报
回复
可以用哦是线程的嘛
fierygnu 2003-12-24
  • 打赏
  • 举报
回复
1、g_Sock = newSock应该设置mutex或condition variable,否则有可能产生冲突。
2、POSIX标准是O_NONBLOCK,不要用O_NDELAY了。
3、g_Sock应该是有效的。accept只是说明对端用connect连接了,即完成了三次握手,对端不一定发送了数据。你用了非阻塞socket,当然可能收不到数据就返回。查看此时的errno。

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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