多个SOCKET的连接后,请问是否用的一个端口发送和接受数据?
我是VC的初学者,我看过几个多用户聊天的程序,虽然看的不是很懂,但我发现个问题,这些程序好像都只绑定一次端口,然后开始监听,连接,ACCEPT后返回以个套接字,原来的套接...
我是VC的初学者,我看过几个多用户聊天的程序,虽然看的不是很懂,但我发现个问题,这些程序好像都只绑定一次端口,然后开始监听,连接,ACCEPT后返回以个套接字,原来的套接字如果不调用LISTEN就是什么也不作,可以继续监听吗 ?这是一个问题,再一个就是如果再接受到一个连接请求,再用SOCKET C=ACCEPT(...)接受连接,那么SEND,和RECV函数在这两个刚接收请求的套接字上,对收发的数据是不是都在绑定的端口上进行?
我学过VB,好像VB一个套接字只能绑定一个端口,VC不知道是不是也这样?
在顺便问个问题,VC用哪个函数知道哪个端口未被使用?如果这个端口正被使用,是否我写的程序,也可以使用?
再问一个问题,ACCEPT,RECV都是阻塞函数,而新建的无限循环线程如果不加个Sleep(1),主线程会很卡,那这两个阻塞函数是因为需要执行完后,才能进行下面的Sleep,所以是不是这样也会让主线程变的卡?
二楼,你只回答了第二个问题,能不能把我提问的都回答完,这几天我一直围着这几个问题转,我再给你加五分,先谢谢你了
---------------------------------
我的意思是,我做一个多用户的服务器,如果我不知道客户什么时间发送过来消息,(当然是多个套接字的用户),我想用多个无限循环的线程去针对每个套接字做接受工作,会不会把主线程弄的很迟钝? 或是一个线城正在执行RECV函数,因为阻塞,所以迟钝,而另一个线程已经可以收到数据了,但因为第一个线程的阻塞,而极大(几秒钟)的耽误这个线程的收到数据的时间,
比如说
线程1(VOID *CC)
{ while(1){}}
一个基于对话框的程序,因为加了这个线程1,点最大话,最小化,都反映迟钝,而加了个Sleep(1)后,速度就正常了.那么套接字的这个阻塞是不是回出现象线程1这样的问题?(又或者recv函数里加了类似与Sleep(1)的功能?不会使主线程迟钝?) 展开
我学过VB,好像VB一个套接字只能绑定一个端口,VC不知道是不是也这样?
在顺便问个问题,VC用哪个函数知道哪个端口未被使用?如果这个端口正被使用,是否我写的程序,也可以使用?
再问一个问题,ACCEPT,RECV都是阻塞函数,而新建的无限循环线程如果不加个Sleep(1),主线程会很卡,那这两个阻塞函数是因为需要执行完后,才能进行下面的Sleep,所以是不是这样也会让主线程变的卡?
二楼,你只回答了第二个问题,能不能把我提问的都回答完,这几天我一直围着这几个问题转,我再给你加五分,先谢谢你了
---------------------------------
我的意思是,我做一个多用户的服务器,如果我不知道客户什么时间发送过来消息,(当然是多个套接字的用户),我想用多个无限循环的线程去针对每个套接字做接受工作,会不会把主线程弄的很迟钝? 或是一个线城正在执行RECV函数,因为阻塞,所以迟钝,而另一个线程已经可以收到数据了,但因为第一个线程的阻塞,而极大(几秒钟)的耽误这个线程的收到数据的时间,
比如说
线程1(VOID *CC)
{ while(1){}}
一个基于对话框的程序,因为加了这个线程1,点最大话,最小化,都反映迟钝,而加了个Sleep(1)后,速度就正常了.那么套接字的这个阻塞是不是回出现象线程1这样的问题?(又或者recv函数里加了类似与Sleep(1)的功能?不会使主线程迟钝?) 展开
3个回答
展开全部
一个套接字只能绑定一个端口是对的
ACCEPT后返回以个套接字,这个字使用的端口是操作系统随机分配的,不是原来的端口
------------------------------------
原来的socket不用管它,只要开始listen一次后就行了
------------------------------------
哪个端口未使用我也不清楚怎么判断,不过被使用的端口你肯定不能绑定(听说有些高级技术能实现一个端口被两个套接字使用,不过一般应该不会碰上)
------------------------------------
你是担心RECV时候其它线程无法响应吧?
应该不会,因为CPU会自动进行线程切换的,不需要你担心(一般一个线程在进行较长的IO操作时,CPU会自动切换到其它线程)
------------------------------------
我以前用过recv函数,是在onrecv里调用的,没碰上过你说的导致主线程无法响应的情况
ACCEPT后返回以个套接字,这个字使用的端口是操作系统随机分配的,不是原来的端口
------------------------------------
原来的socket不用管它,只要开始listen一次后就行了
------------------------------------
哪个端口未使用我也不清楚怎么判断,不过被使用的端口你肯定不能绑定(听说有些高级技术能实现一个端口被两个套接字使用,不过一般应该不会碰上)
------------------------------------
你是担心RECV时候其它线程无法响应吧?
应该不会,因为CPU会自动进行线程切换的,不需要你担心(一般一个线程在进行较长的IO操作时,CPU会自动切换到其它线程)
------------------------------------
我以前用过recv函数,是在onrecv里调用的,没碰上过你说的导致主线程无法响应的情况
参考资料: 自己的理解和推测
迪凯特科技(北京)有限公司
2023-07-28 广告
2023-07-28 广告
要从电脑的一个串行口接收数据并将其从另一个串行口发送出去,你可以使用以下步骤:1. 确定你要使用的两个串行口。在大多数计算机上,串行口通常被称为COM1、COM2等。确保你了解每个串行口的名称或编号。2. 编写一个程序来读取来自一个串行口的...
点击进入详情页
本回答由迪凯特科技(北京)有限公司提供
展开全部
好像不是这样的,刚用netmoniter抓了几个浏览器发送和接受的IP包看了一下,送去服务器的包是发送到了80端口,而服务器回送的也是从80端口来的,说明accept产生的新套接字还是使用listen时绑定的端口来收发数据的。
套接字的阻塞模式和无限循环使用的机制是不一样的,无限循环可以说是让CPU不停的执行一个空指令,所以会抢占CPU时间,让其他线程“卡”。而套接字阻塞是操作的线程被挂起,等待下层服务完成操作后再被唤醒,是不会消耗CPU时间的。
套接字的阻塞模式和无限循环使用的机制是不一样的,无限循环可以说是让CPU不停的执行一个空指令,所以会抢占CPU时间,让其他线程“卡”。而套接字阻塞是操作的线程被挂起,等待下层服务完成操作后再被唤醒,是不会消耗CPU时间的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看看Winsock的6种模型.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询