游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4036|回复: 7

有关网络编程阻塞recv函数的问题

[复制链接]

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2011-12-20 11:29:00 | 显示全部楼层 |阅读模式
网络编程中服务器端recv函数如果为阻塞,客户端套接字储存在数组中,服务器端如何编写程序接收每个客户端发送过来的数据,如果用多线程处理的话:

void ClientRecvThead( void* p )
{
        SOCKET* s = ( SOCKET* )p;
        while( true )
        {
                char Buffer[ 1024 ];
                if( recv( s, Buffer, sizeof( Buffer ), 0 ) > 0 )
                {
                     using namespace std;
                     cout<<Buffer<<endl;
                }
        }
}

如果是多个客户端套接字线程里面怎么处理呢
不可能是每接收到一个客户端连接就开启一个线程然后让线程运行上面那个函数吧,这样线程里面的SOCKET就都变成最后连接的那个客户端SOCKET了啊

71

主题

1330

帖子

2585

积分

金牌会员

Rank: 6Rank: 6

积分
2585
发表于 2011-12-20 15:36:00 | 显示全部楼层

Re:有关网络编程阻塞recv函数的问题

楼主已经回答出了答案,按照这段代码,的确是每一个客户端连接过来,就需要创建一个线程,因此,这个方法不时候大连接数的程序。只适用于一些简单的应用。

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2011-12-20 16:47:00 | 显示全部楼层

Re:有关网络编程阻塞recv函数的问题

to:yahle
我的问题是这样子的,如果accept一个新的客户端SOCKET, 然后根据这个新的SOCKET传给新的线程的,如果accept第二个客户端建立新的SOCKET也是传递给同样的一个线程函数。这样就会把第一个线程的SOCKET给覆盖了,导致这两个线程都在接收最后一次accept过来的客户端套接字,相当于是两个线程都在处理同样的套接字,我想要的结果是每个线程都是处理Accept新过来的套接字,避免覆盖问题。可能是我多线程的理解有问题吧?

71

主题

1330

帖子

2585

积分

金牌会员

Rank: 6Rank: 6

积分
2585
发表于 2011-12-26 18:07:00 | 显示全部楼层

Re:有关网络编程阻塞recv函数的问题

      SOCKET* s = ( SOCKET* )p;

这里获得的Socket是指针,而不是socket的实例,在外部的sockt修改后,线程内部也是会被修改的。

SOCKET S1 = *s;

应该就没啥问题了。

1

主题

8

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2012-3-16 18:37:00 | 显示全部楼层

Re:有关网络编程阻塞recv函数的问题

网络处理不只是简单的send和recv,你还得去看看IO模型,select等等。

0

主题

41

帖子

50

积分

注册会员

Rank: 2

积分
50
发表于 2012-3-20 12:56:00 | 显示全部楼层

Re:有关网络编程阻塞recv函数的问题

顶一下~~~

0

主题

15

帖子

34

积分

注册会员

Rank: 2

积分
34
发表于 2012-5-14 20:37:00 | 显示全部楼层

Re:有关网络编程阻塞recv函数的问题

你的意思是,在一个线程中,处理多个Socket ?

5

主题

84

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
发表于 2012-6-5 00:58:00 | 显示全部楼层

Re:有关网络编程阻塞recv函数的问题

其实 socket 库有很多异步处理函数,例如 :select
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-28 06:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表