delphi 用 Winsock创建一个服务端,能否通过它监听两个端口??? ( 积分: 100 )

  • 主题发起人 主题发起人 Carson_zzd
  • 开始时间 开始时间
C

Carson_zzd

Unregistered / Unconfirmed
GUEST, unregistred user!
现在的问题是系统中已经存在一个socket服务,可以监听一个端口发来的数据<br>现在客户有了新的需求,要求通过不同的端口发送数据,但是服务端程序要是一个。不能开启两个服务,不知应该如何实现~~<br>[**要求:系统中只有一个服务,可以读取不同端口的数据**]<br>部分代码:<br> &nbsp;// 得到本地监听端口<br> &nbsp;port := g_ItemSingleton.SocketConfig.LocalListenPort;<br><br> &nbsp;g_ServerSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);<br> &nbsp;if g_ServerSocket = INVALID_SOCKET then<br> &nbsp; &nbsp;raise ESocketException.Create('创建监听Socket错误');<br><br> &nbsp;sa.sin_family := PF_INET;<br> &nbsp;sa.sin_port := htons(port);<br> &nbsp;sa.sin_addr.S_addr := INADDR_ANY;<br> &nbsp;if bind(g_ServerSocket, sa, sizeof(sa)) = SOCKET_ERROR then<br> &nbsp;begin<br> &nbsp; &nbsp;raise ESocketException.Create('绑定监听Socket错误,请检查是否有服务在监听' + IntToStr(port) + '端口!');<br> &nbsp; &nbsp;closesocket(g_ServerSocket);<br> &nbsp; &nbsp;Exit;<br> &nbsp;end;<br> &nbsp;listen(g_ServerSocket, 5);<br><br>上面的代码可以监听一个端口,一个以上不知道应该如何扩展??
 
现在的问题是系统中已经存在一个socket服务,可以监听一个端口发来的数据<br>现在客户有了新的需求,要求通过不同的端口发送数据,但是服务端程序要是一个。不能开启两个服务,不知应该如何实现~~<br>[**要求:系统中只有一个服务,可以读取不同端口的数据**]<br>部分代码:<br> &nbsp;// 得到本地监听端口<br> &nbsp;port := g_ItemSingleton.SocketConfig.LocalListenPort;<br><br> &nbsp;g_ServerSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);<br> &nbsp;if g_ServerSocket = INVALID_SOCKET then<br> &nbsp; &nbsp;raise ESocketException.Create('创建监听Socket错误');<br><br> &nbsp;sa.sin_family := PF_INET;<br> &nbsp;sa.sin_port := htons(port);<br> &nbsp;sa.sin_addr.S_addr := INADDR_ANY;<br> &nbsp;if bind(g_ServerSocket, sa, sizeof(sa)) = SOCKET_ERROR then<br> &nbsp;begin<br> &nbsp; &nbsp;raise ESocketException.Create('绑定监听Socket错误,请检查是否有服务在监听' + IntToStr(port) + '端口!');<br> &nbsp; &nbsp;closesocket(g_ServerSocket);<br> &nbsp; &nbsp;Exit;<br> &nbsp;end;<br> &nbsp;listen(g_ServerSocket, 5);<br><br>上面的代码可以监听一个端口,一个以上不知道应该如何扩展??
 
再创建一个socket监听另一个端口不就行了
 
现在是想不另外创建一个,用当前的这个能否监听到两个端口的数据??
 
一个socket监听两个端口,这个恐怕不行吧。<br>但是看你的要求“要求通过不同的端口发送数据,但是服务端程序要是一个”<br>我的意思是一个服务程序中创建两个socket,这个好像符合你的要求啊
 
同意迷糊的观点。
 
好久没有接触delphi了,我是代一个朋友问的<br>应该如何创建?<br>难道还是:g_ServerSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);<br><br>能写一下具体的创建代码吗~~<br><br>另外,在现系统中g_ServerSocket是一个全局的变量,在其它的很多地方应用到,如何使得新创建的这个socket保证在其它的地方和g_ServerSocket有一样的应用,不是要在所有g_ServerSocket调用的地方也添加上新创建这个socket的调用方法吧??<br>
 
我没有直接用socket编程,我是用的Delhpi 7自带的indy组件(Delphi之前的版本可能需要另外安装组件)。<br><br>这个做起来很容易的,放置2个Server控件,监听不同的端口,使用同一个事件处理就可以了。
 
问大家:<br>socket(PF_INET, SOCK_STREAM, IPPROTO_IP); 得到的是什么??
 
&amp;gt;&amp;gt;socket(PF_INET, SOCK_STREAM, IPPROTO_IP); 得到的是什么?? &nbsp;<br>这个是创建一个流式套接字<br>在创建一个其实就是吧你上面的代码复制一份,然后 sa.sin_port := htons(port);改一下绑定到另一个端口就行了
 
现在又出现了一个问题:<br>就是通过socket(PF_INET, SOCK_STREAM, IPPROTO_IP); 创建两个流式套接字<br>之后sa.sin_port 绑定不同的端口<br><br>之后通过多线程,接收客户端的数据<br>每个端口对应一个线程类,分别创建了8个线程<br>现在的问题是,一个端口必须接收完所有的客户端的数据,另一个端口才可以进行接收<br>没有同时进行数据的接收~<br>不知道上面这个问题是正常现象,还是由于程序上有问题导致的~ 忘指教!!
 
这肯定是不正常的,应该是你线程处理有问题。收发数据是并行的,要不用线程干嘛
 
<br><br>上面就是具体的线程代码,有什么问题? 忘迷糊指教~~
 
另一个线程类和他写的一样,就是<br>m_AcceptSocket := accept(g_ServerSocket, @isa, @isa_len);<br>对应不同的流式套接字<br><br>现在系统运行导致端口数据的接收是无限的交替 一个端口完成之后,进行另一个端口的数据接收 存在什么问题呢??
 
迷糊说得对<br>而且也没必要搞得太复杂。
 
问题可能在这里,看不出必须把这句放在临界区的必要<br> &nbsp;EnterCriticalSection(g_AcceptSocketLock);<br> &nbsp;try<br> &nbsp; &nbsp;m_AcceptSocket := accept(g_ServerSocket, @isa, @isa_len);<br> &nbsp;finally<br> &nbsp; &nbsp;LeaveCriticalSection(g_AcceptSocketLock);<br> &nbsp;end;
 
放在临届区是为了保证多线程的同步,难道没有这个必要吗??
 
&nbsp; 对您程序看的不是很明白,并且您所说“每个端口对应一个线程类,分别创建了8个线程”是指监听8个端口,分别用8个线程去轮巡呢,还是开始说的两个端口用8个线程轮巡?<br> &nbsp; &nbsp;但是您说的排队现象肯定是临界区造成的,accept在没有接收到连接时会阻塞,所以一旦某一个线程进入临界区(accept),在它没有接受到连接之前其他端口根本没机会执行accept,因为它无法进入临界区。<br> &nbsp; 当然“放在临届区是为了保证多线程的同步”但是最起码可以对不同的端口设置不同的临界区标示啊<br> &nbsp;
 
朋友说问题已经解决了,本贴也就结了~<br>最后想问问迷糊,如何设置临届区标识~<br>分给大家加上~ 十分感谢迷糊之前的回答<br><br><br><br>
 
后退
顶部