在.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方法,或其他什么办法,急救!
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方法,或其他什么办法,急救!
解决方案 »
- mschart控件是否能在图形上显示数值?
- vb.net如何删除数组里的一个元素?
- 一个让我郁闷了好多天的问题,请朋友们指点迷津!
- 一个数据处理的问题!
- 散分,偶老婆今天高考,希望她能有出色的发挥,考完结贴
- 有关ITC的问题
- 如何解决将文本输入到图片上的问题?
- API函数ChildWindowFromPointEx的问题,请进来看看...
- 为什么会这样啊!调用EXCEL问题!
- <_______________________________________一个小问题______________________________>
- on error goto 报语法错误
- vb查询access数据库问题。提示变量未设置!
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
回此頁最上方
参考
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);
}