在.NET里好像有2个关闭函数
socket关闭close和shutdownsocket关闭有2个close,shutdown他们之间的区别:close-----关闭本进程的socket id,但链接还是开着的,用这个socket id的其它进程还能用这个链接,能读或写这个socket idshutdown--则破坏了socket 链接,读的时候可能侦探到EOF结束符,写的时候可能会收到一个SIGPIPE信号,这个信号可能直到socket buffer被填充了才收到,shutdown还有一个关闭方式的参数,0 不能再读,1不能再写,2 读写都不能。
现在问题是上位机软件用6.0开发的,现在用COLSE方法好像有问题,下位机不能获悉COLSE,请问6.0里有没有类似.NET里的shutdown方法,或其他什么办法,急救!

解决方案 »

  1.   

    最好使用winsock API或使用VC,有一个winsock API叫setsockopt,可以将套接字设置为关闭后立即可用。
      

  2.   

    楼上能详细点吗,API具体怎么用法,2楼的问题要过几分钟才能再连接成功我现在也是这样  Public Declare Function setsockopt Lib "wsock32.dll" (ByVal s As Long, ByVal level As Long, ByVal optname As Long, optval As Any, ByVal optlen As Long) As Long具体怎么用,由例子最好,谢谢!
      

  3.   

    Option Explicit' Error returned by Winsock API.
    Const SOCKET_ERROR = -1' Level number for (get/set)sockopt() to apply to socket itself.
    Const SOL_SOCKET = 65535      ' Options for socket level.
    Const IPPROTO_TCP = 6         ' Protocol constant for TCP.' option flags per socket
    Const SO_DEBUG = &H1&         ' Turn on debugging info recording
    Const SO_ACCEPTCONN = &H2&    ' Socket has had listen() - READ-ONLY.
    Const SO_REUSEADDR = &H4&     ' Allow local address reuse.
    Const SO_KEEPALIVE = &H8&     ' Keep connections alive.
    Const SO_DONTROUTE = &H10&    ' Just use interface addresses.
    Const SO_BROADCAST = &H20&    ' Permit sending of broadcast msgs.
    Const SO_USELOOPBACK = &H40&  ' Bypass hardware when possible.
    Const SO_LINGER = &H80&       ' Linger on close if data present.
    Const SO_OOBINLINE = &H100&   ' Leave received OOB data in line.Const SO_DONTLINGER = Not SO_LINGER
    Const SO_EXCLUSIVEADDRUSE = Not SO_REUSEADDR ' Disallow local address reuse.' Additional options.
    Const SO_SNDBUF = &H1001&     ' Send buffer size.
    Const SO_RCVBUF = &H1002&     ' Receive buffer size.
    Const SO_ERROR = &H1007&      ' Get error status and clear.
    Const SO_TYPE = &H1008&       ' Get socket type - READ-ONLY.' TCP Options
    Const TCP_NODELAY = &H1&      ' Turn off Nagel Algorithm.' linger structure
    Private Type LINGER_STRUCT
      l_onoff As Integer          ' Is linger on or off?
      l_linger As Integer         ' Linger timeout in seconds.
    End Type
     
    ' Winsock API declares
    Private Declare Function setsockopt Lib "wsock32.dll" (ByVal s As Long, ByVal level As Long, ByVal optname As Long, optval As Any, ByVal optlen As Long) As Long
    Private Declare Function getsockopt Lib "wsock32.dll" (ByVal s As Long, ByVal level As Long, ByVal optname As Long, optval As Any, optlen As Long) As LongPrivate Sub Command1_Click()
      ' Read all the options and present in a message box.
      Dim socket As Long
      
      socket = Winsock1.SocketHandle
      
      If socket = 0 Then
        MsgBox "No Socket"
      Else
        MsgBox "Socket Options:" & vbCrLf & _
               "    SO_DEBUG: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_DEBUG)) & vbCrLf & _
               "    SO_ACCEPTCONN: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_ACCEPTCONN)) & vbCrLf & _
               "    SO_REUSEADDR: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_REUSEADDR)) & vbCrLf & _
               "    SO_KEEPALIVE: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_KEEPALIVE)) & vbCrLf & _
               "    SO_DONTROUTE: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_DONTROUTE)) & vbCrLf & _
               "    SO_BROADCAST: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_BROADCAST)) & vbCrLf & _
               "    SO_USELOOPBACK: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_USELOOPBACK)) & vbCrLf & _
               "    SO_LINGER: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_LINGER)) & vbCrLf & _
               "    SO_OOBINLINE: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_OOBINLINE)) & vbCrLf & _
               "    SO_DONTLINGER: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_DONTLINGER)) & vbCrLf & _
               "    SO_EXCLUSIVEADDRUSE: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_EXCLUSIVEADDRUSE)) & vbCrLf & _
               "    SO_SNDBUF: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_SNDBUF)) & vbCrLf & _
               "    SO_RCVBUF: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_RCVBUF)) & vbCrLf & _
               "    SO_ERROR: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_ERROR)) & vbCrLf & _
               "    SO_TYPE: " & CStr(GetSocketOption(socket, SOL_SOCKET, SO_TYPE)) & vbCrLf & vbCrLf & _
               "TCP Options:" & vbCrLf & _
               "    TCP_NODELAY: " & CStr(GetSocketOption(socket, IPPROTO_TCP, TCP_NODELAY))
        End If
    End Sub
    Private Sub Command2_Click()
      Dim lResult As Long     ' Results of 1st option.
      Dim lResult2 As Long    ' Results of 2nd option.
      Dim linger As LINGER_STRUCT
      
      If (Winsock1.Protocol = sckTCPProtocol) Then
        ' Change two options valid for TCP Sockets.
        lResult = setsockopt(Winsock1.SocketHandle, IPPROTO_TCP, TCP_NODELAY, 1, 4)
        If (lResult = SOCKET_ERROR) Then
          MsgBox "Error setting TCP_NODELAY option: " & CStr(Err.LastDllError)
        End If
        
        ' Set up the linger structure.
        linger.l_onoff = 1
        linger.l_linger = 5
        lResult2 = setsockopt(Winsock1.SocketHandle, SOL_SOCKET, SO_LINGER, linger, LenB(linger))
        If (lResult2 = SOCKET_ERROR) Then
          MsgBox "Error setting SO_LINGER option: " & CStr(Err.LastDllError)
        End If
      Else
        ' Change two options valid for UDP sockets.
        lResult = setsockopt(Winsock1.SocketHandle, SOL_SOCKET, SO_REUSEADDR, 1, 4)
        If (lResult = SOCKET_ERROR) Then
          MsgBox "Error setting SO_REUSEADDR option: " & CStr(Err.LastDllError)
        End If    lResult2 = setsockopt(Winsock1.SocketHandle, SOL_SOCKET, SO_BROADCAST, 0, 4)
        If (lResult2 = SOCKET_ERROR) Then
          MsgBox "Error setting SO_BROADCAST option: " & CStr(Err.LastDllError)
        End If
      End If
      
      If (lResult = 0) And (lResult2 = 0) Then
        MsgBox "Options Set"
      End If
    End Sub
    Public Function GetSocketOption(lSocket As Long, lLevel As Long, lOption As Long) As Long
      Dim lResult As Long       ' Result of API call.
      Dim lBuffer As Long       ' Buffer to get value into.
      Dim lBufferLen As Long    ' len of buffer.
      Dim linger As LINGER_STRUCT
      
      ' Linger requires a structure so we will get that option differently.
      If (lOption <> SO_LINGER) And (lOption <> SO_DONTLINGER) Then
        lBufferLen = LenB(lBuffer)
        lResult = getsockopt(lSocket, lLevel, lOption, lBuffer, lBufferLen)
      Else
        lBufferLen = LenB(linger)
        lResult = getsockopt(lSocket, lLevel, lOption, linger, lBufferLen)
        lBuffer = linger.l_onoff
      End If
      
      If (lResult = SOCKET_ERROR) Then
        GetSocketOption = Err.LastDllError
      Else
        GetSocketOption = lBuffer
      End If
    End Function
    Private Sub Form_Load()
      Winsock1.Bind 8377      ' Set up socket enough to get nonzero socket. handle
    End Sub
    回此頁最上方
    参考
      

  4.   

    //初始化WinSock库(版本2.0)
    WSADATA wsaData;
    m_bInitSocket = (WSAStartup(MAKEWORD(2,2), &wsaData) == NO_ERROR);
    if(m_bInitSocket)
    {
    //获得本机IP
    char hostname[255];
    PHOSTENT hostinfo;
    if(gethostname(hostname,255)==0)
    {
    hostinfo = gethostbyname(hostname);
    if(hostinfo != NULL)
    {
    m_pszLocalIP = inet_ntoa(*(struct in_addr *)*hostinfo->h_addr_list);
    }
    }
    //创建服务监听socket
    m_hListenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    DWORD flag = 1;
    //允许端口重用(防止在使用closesocket之后端口不能立即可用)
    setsockopt(m_hListenSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&flag,sizeof(flag));
    //禁用Nagle 算法,实现最小化传输延时
    setsockopt(m_hListenSocket, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag) );
    //设置为非阻塞套接字
    int nStatus = ioctlsocket(m_hListenSocket, FIONBIO, &flag);
    }
      

  5.   

    第一个代码是MSDN里的,第二个代码是俺一个项目里的片断,LZ可以比较着看,应该能够明白,俺就不再转换成VB了。