winsock的setsockopt问题(50分)

  • 主题发起人 主题发起人 ifeng
  • 开始时间 开始时间
I

ifeng

Unregistered / Unconfirmed
GUEST, unregistred user!
在第二次创建SOCKET套接字进行BIND时,出错,错误号是10048。
经查是由于端口已经被另外一个套接字使用,但我已经关闭了套接字,是不是有一个延时?
查资料:使用setsockopt()函数的SO_REUSEADDR命令可以让多个套接字帮定一个端口。
但我不知具体如何使用
我是这样用的
var NewType;

NewType:=SO_REUSEADDR;
SetSockopt(SerSock,SOL_SOCKET,SO_REUSEADDR,PChar(@NewType),SizeOf(NewType));
if Bind(SerSock,SockAddr,SizeOf(SockAddr))>=0 then //绑定成功
下面的就省略了

上面用的对不对?是不是在客户端的connect前也要用上?
请帮忙,比较急!
 
帮忙提前,比较急!在线等待
 
var
iRc:Integer;
iRc:=SetSockopt(SerSock,SOL_SOCKET,SO_REUSEADDR,PChar(@NewType),SizeOf(NewType));
if iRc=SOCKET_ERROR then //出错处理
同时你这么做很危险,对应用程序也没什么好处,
 
那要怎么样做才行?帮忙告之
 
两为老兄谁能给我发一些delphi网络编程的资料啊?
我上书店找了很多书,可是都是介绍组件的。
而 indy 组件的效果实在是不敢恭维...
谢谢!!
realyanyan@sohu.com
 
对付这个问题有三个办法
1,设置socket没有半等待状态,缺点是有可能丢失数据
2,设置重复绑定参数,缺点是可能被一些程序利用这个漏洞绑定进来偷数据。
3. Sleep(70000)这个最安全。
下面是方法2的代码
var
bReListen:BOOL;
bReLienten := True;
if setsockopt(
FSocket,
SOL_SOCKET,
SO_REUSEADDR,
@bReListen,
SizeOf(bReListen)) <> 0 then
Exit;
 
谢谢无忌大哥的回答,我试试看先
 
以下是10048错误的说明
WSAEADDRINUSE (10048) Address already in use.

正常情况下每一个套接字地址(协议/IP地址/端口号)只允许使用一次。当应用程序试图使用bind()函数将一个被已存在的或没有完全关闭的或正在关闭的套接字使用了的IP地址/端口号绑扎到一个新套接字上时,该错误发生。对于服务器应用程序来说,如果需要使用bind()函数将多个套接字绑扎到同一个端口上,可以考虑使用setsockopt()函数的SO_REUSEADDR命令。客户应用程序一般不必使用bind()函数——connect()函数总是自动选择没有使用的端口号。当bind()函数操作的是通配地址(包括ADDR_ANY)时,错误WSAEADDRINUSE可能延迟到一个明确的地址被提交时才发生。这可能在后续的函数如connect()、listen()、WSAConnect()或WSAJoinLeaf()调用时发生。

为什么我CloseSocket(FSocket)之后,FSocket的值还是原来的?还占用着端口呢?
怎么样才能彻底关闭端口???
 
DFW越来约差劲了
除了张大侠搭理我,别的没人了
谢谢张无忌大侠的回答,接分吧。
我有很多问题想提,但这样子让我不敢提,撒出去的分经常没有得到什么回报。
 
接受答案了.
 
后退
顶部