① c#socket編程怎麼判讀客戶端與伺服器斷開連接
使用Socket類中的Poll方法,就可以。
Socket client //假如已經創建好了,連接到伺服器端得Socket的客戶端對象。
我們只要client.Poll(10,SelectMode.SelectRead)判斷就行了。只要返回True是。就可以認為客戶端已經斷開了。
Poll 方法將會檢查 Socket 的狀態。指定 selectMode 參數的 SelectMode..::.SelectRead,可確定 Socket 是否為可讀。指定 SelectMode..::.SelectWrite,可確定 Socket 是否為可寫。使用 SelectMode..::.SelectError 檢測錯誤條件。Poll 將在指定的時段(以 microseconds 為單位)內阻止執行。如果希望無限期的等待響應,則將 microSeconds 設置為一個負整數。如果要檢查多個套接字的狀態,則不妨使用 Select 方法。
② asp中如何強制斷開客戶端與伺服器的連接
大概還沒明白isclientconnected 的意思 他是只讀的 而且用法也不是這么寫的
If Response.IsClientConnected Then
Response.Flush
Else
Response.End
End If
下面是摘抄的一段
在進入長時運算之前使用Resonse.IsClientConnected
如果用戶感到不耐煩,他們可能在ASP頁面計算他們的請求之前離開這個頁面。如果他們點擊刷新或是跳到伺服器上的另一個頁面,新的請求將位於ASP請求隊列尾部,而中斷的請求卻在請求隊列的中部;通常伺服器在高負載情況下可能發生這種情況(伺服器有很長的請求隊列,同時請求次數也很多);而這種情況又使伺服器的負載情況變得更加惡劣。如果用戶已經斷掉連接,沒有必要再執行這個ASP頁面(尤其當這是一個很慢、很耗資源的頁面時);Response.IsClientConnected屬性能檢查出這種情
況;如果屬性返回False,就應該調用Resonse.End來結束剩餘的頁面。事實上,
IIS 5.0使這種檢查規律劃--無論什麼時候ASP准備執行一個新的請求,他先檢查請求隊列有多長;如果隊列已經超過3秒鍾,ASP就會檢查客戶端是否連接;如果客戶端已經斷開,ASP立即終止這個請求。可以使用AspQueueConnectionTestTime設置來調整3秒的超時。
如果有一個非常耗時的頁面要執行,也可以在頁面中檢查
Response.IsClientConnected。當響應緩沖打開時,在頁面運行中使用
Response.Flush也能給用戶操作正在執行的感覺。
注意:在IIS 4.0上,除非你先執行了Response.Write,否則
Response.IsClientConnected的結果有可能不正確;如果響應緩沖已經打開,還必須先執行Response.Flush。在IIS 5.0上,就沒有這個必要了,
Response.IsClientConnected工作得很正常。無論任何情況,
Response.IsClientConnected總要消耗一些時間,因此,只應該在執行耗時至少超過500ms的頁面中執行。首要原則是,不要在一個緊密的循環中反復調用這個屬性。
直接設置10秒自動關閉不就得了
③ 客戶端與伺服器端的通訊,C++書寫步驟。
C++通過socket編程實現服務端與客戶端的通訊,代碼如下(個人環境下測試正常,如果遇到運行send發送報錯,請檢查伺服器埠是否被佔用,調試的時候請先運行服務端程序在運行客服端,一定要載入庫函數ws2_32.lib,發送字元時應該多加一個空字元作為結束字元):
伺服器端程序:
//Server.cpp:.
#include"winsock2.h"
#pragmacomment(lib,"ws2_32.lib")
#include<iostream>
usingnamespacestd;
intmain(intargc,char*argv[])
{
constintBUF_SIZE=64;
WSADATAwsd;//WSADATA變數
SOCKETsServer;//伺服器套接字
SOCKETsClient;//客戶端套接字
SOCKADDR_INaddrServ;;//伺服器地址
charbuf[BUF_SIZE];//接收數據緩沖區
charsendBuf[BUF_SIZE];//返回給客戶端得數據
intretVal;//返回值
//初始化套結字動態庫
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
cout<<"WSAStartupfailed!"<<endl;
return1;
}
//創建套接字
sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sServer)
{
cout<<"socketfailed!"<<endl;
WSACleanup();//釋放套接字資源;
return-1;
}
//伺服器套接字地址
addrServ.sin_family=AF_INET;
addrServ.sin_port=htons(4999);
addrServ.sin_addr.s_addr=INADDR_ANY;
//綁定套接字
retVal=bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN));
if(SOCKET_ERROR==retVal)
{
cout<<"bindfailed!"<<endl;
closesocket(sServer);//關閉套接字
WSACleanup();//釋放套接字資源;
return-1;
}
//開始監聽
retVal=listen(sServer,1);
if(SOCKET_ERROR==retVal)
{
cout<<"listenfailed!"<<endl;
closesocket(sServer);//關閉套接字
WSACleanup();//釋放套接字資源;
return-1;
}
//接受客戶端請求
sockaddr_inaddrClient;
intaddrClientlen=sizeof(addrClient);
sClient=accept(sServer,(sockaddrFAR*)&addrClient,&addrClientlen);
if(INVALID_SOCKET==sClient)
{
cout<<"acceptfailed!"<<endl;
closesocket(sServer);//關閉套接字
WSACleanup();//釋放套接字資源;
return-1;
}
while(true)
{
//接收客戶端數據
ZeroMemory(buf,BUF_SIZE);
retVal=recv(sClient,buf,BUF_SIZE,0);
if(SOCKET_ERROR==retVal)
{
cout<<"recvfailed!"<<endl;
closesocket(sServer);//關閉套接字
closesocket(sClient);//關閉套接字
WSACleanup();//釋放套接字資源;
return-1;
}
if(buf[0]=='0')
break;
cout<<"客戶端發送的數據:"<<buf<<endl;
cout<<"向客戶端發送數據:";
cin>>sendBuf;
send(sClient,sendBuf,strlen(sendBuf),0);
}
//退出
closesocket(sServer);//關閉套接字
closesocket(sClient);//關閉套接字
WSACleanup();//釋放套接字資源;
return0;
}
客戶端程序:
#include"winsock2.h"
#include<iostream>
#pragmacomment(lib,"ws2_32.lib")
usingnamespacestd;
BOOLRecvLine(SOCKETs,char*buf);//讀取一行數據
intmain(intargc,char*argv[])
{
constintBUF_SIZE=64;
WSADATAwsd;//WSADATA變數
SOCKETsHost;//伺服器套接字
SOCKADDR_INservAddr;//伺服器地址
charbuf[BUF_SIZE];//接收數據緩沖區
charbufRecv[BUF_SIZE];
intretVal;//返回值
//初始化套結字動態庫
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
cout<<"WSAStartupfailed!"<<endl;
return-1;
}
//創建套接字
sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sHost)
{
cout<<"socketfailed!"<<endl;
WSACleanup();//釋放套接字資源
return-1;
}
//設置伺服器地址和埠
servAddr.sin_family=AF_INET;
servAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
servAddr.sin_port=htons((short)4999);
intnServAddlen=sizeof(servAddr);
//連接伺服器
retVal=connect(sHost,(LPSOCKADDR)&servAddr,sizeof(servAddr));
if(SOCKET_ERROR==retVal)
{
cout<<"connectfailed!"<<endl;
closesocket(sHost);//關閉套接字
WSACleanup();//釋放套接字資源
return-1;
}
while(true)
{
//向伺服器發送數據
ZeroMemory(buf,BUF_SIZE);
cout<<"向伺服器發送數據:";
cin>>buf;
retVal=send(sHost,buf,strlen(buf),0);
if(SOCKET_ERROR==retVal)
{
cout<<"sendfailed!"<<endl;
closesocket(sHost);//關閉套接字
WSACleanup();//釋放套接字資源
return-1;
}
//RecvLine(sHost,bufRecv);
ZeroMemory(bufRecv,BUF_SIZE);
recv(sHost,bufRecv,BUF_SIZE,0);//接收伺服器端的數據,只接收5個字元
cout<<endl<<"從伺服器接收數據:"<<bufRecv;
cout<<" ";
}
//退出
closesocket(sHost);//關閉套接字
WSACleanup();//釋放套接字資源
return0;
}
④ 上下傳客戶端斷開連接怎麼回事
可能是微軟帳戶有記錄你的行為。
客戶端斷開意思是指客戶端已經斷開了的意思,也是表明對於當前狀態的一種明確的闡述,對這方面通過自己的信息那些觀察或者深入一些了解自己,也是有人明確態度的,自己認為當天的這些客戶端是已經斷開了的意思,所以是產生一些非常大的一些問題,所以是並不能持續進行下去的一種目的。
伺服器斷開連接,意思是伺服器主動釋放與客戶端建立起的 HTTP 連接。引起伺服器斷開連接的原因有兩種。第一種原因,伺服器端維護了一個 keep alive 閾值,如果超出該閾值後客戶端仍然沒有報文發送往伺服器端,該連接就會被伺服器重置。第二種原因,客戶端實現里主動調用了 close 這個系統調用,此時客戶端主動發起連接重置的信號,也會導致伺服器端斷開連接。
⑤ 如何從SignalR客戶端端確定伺服器斷開連接
1. 集線器有disconnect這將允許您添加一個回調函數,當斷線發生:myHub.disconnect(function() {
alert('Server has disconnected');
});
如果你阿仁'樞紐然後為代碼將幫助你:$(connection).bind("onDisconnect", function (e, data) {
callback.call(connection);
});
這顯示了語法鉤到底層連接的觸發OnDisconnect事件。
2. 如果集線器那麼IDisconnect介面。public class ChatHub : Hub, IDisconnect
{
public void Disconnect()
{
Debug.WriteLine(Context.ConnectionId + " disconnected");
}
}
對持續連接可以覆蓋OnDisconnectAsync, (從SignalR維基於)public class MyEndPoint : PersistentConnection
{
protected override Task OnDisconnectAsync(string clientId)
{
return Connection.Broadcast("Client " + clientId + " disconncted");
}
}
3. 開始與SignalR v0.5.1它的工作原理是這樣的:$.connection.hub.stateChanged(function (change) {
if (change.newState === $.signalR.connectionState.reconnecting) {
console.log("liveFeed is reconnecting!");
}
else if (change.newState === $.signalR.connectionState.connected) {
console.log("liveFeed is connected!");
}
});
⑥ 怎麼斷開伺服器和客戶端的連接
在伺服器中,選擇注銷斷開連接。或者在客戶端,關閉遠程桌面連接窗口,斷開伺服器連接。
⑦ 如何在客戶端上建立一個Socket與伺服器端連接,包括連接的函數
進入mysql,創建一個新用戶xuys:
格式:grant 許可權 on 資料庫名.表名 用戶@登錄主機 identified by "用戶密碼";
grant select,update,insert,delete on *.* to [email protected] identified by "xuys1234";
查看結果,執行:
use mysql;
select host,user,password from user;
可以看到在user表中已有剛才創建的xuys用戶。host欄位表示登錄的主機,其值可以用IP,也可用主機名,
將host欄位的值改為%就表示在任何客戶端機器上能以xuys用戶登錄到mysql伺服器,建議在開發時設為%。
update user set host = '%' where user = 'xuys';
2、 ./mysqladmin -uroot -p21century reload
./mysqladmin -uroot -p21century shutdown
3、./mysqld_safe --user-root &
記住:對授權表的任何修改都需要重新reload,即執行第3步。
如果經過以上3個步驟還是無法從客戶端連接,請執行以下操作,在mysql資料庫的db表中插入一條記錄:
use mysql;
insert into db values('192.168.88.234','%','xuys','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
update db set host = '%' where user = 'xuys';
重復執行上面的第2、3步。