⑴ 怎麼用VB實現遠程桌面並運行指定程序
請使用winsock 建立連接,然後遠程發送字元串 "your_path\your_exe_filename.exe", 另一端用 shell "your_path\your_exe_filename.exe" 即可執行。這個方法你要寫兩個軟體,一個在主機運行,另一個在伺服器端運行。以下是MSDN的內容
要創建一個 TCP 伺服器,請按照以下步驟執行:
創建新的 Standard EXE 工程。
將預設窗體的名稱改為 frmServer。
將窗體的標題改為「TCP 伺服器」。
在窗體中放入一個 Winsock 控制項,並將它的名字改為 tcpServer。
在窗體上添加兩個 TextBox 控制項。將第一個命名為 txtSendData,第二個為 txtOutput。
為窗體添加如下的代碼。
Private Sub Form_Load()
'將 LocalPort 屬性設置為一個整數。
'然後調用 Listen 方法。
tcpServer.LocalPort = 1001
tcpServer.Listen
frmClient.Show '顯示客戶端的窗體。
End Sub
Private Sub tcpServer_ConnectionRequest _
(ByVal requestID As Long)
'檢查控制項的 State 屬性是否為關閉的。
'如果不是,
'在接受新的連接之前先關閉此連接。
If tcpServer.State <> sckClosed Then _
tcpServer.Close
'接受具有 requestID 參數的
'連接。
tcpServer.Accept requestID
End Sub
Private Sub txtSendData_Change()
'名為 txtSendData 的 TextBox 控制項中
'包含了要發送的數據。當用戶往文本框中
'鍵入數據時,使用 SendData 方法
'發送輸入的字元串。
tcpServer.SendData txtSendData.Text
End Sub
Private Sub tcpServer_DataArrival _
(ByVal bytesTotal As Long)
'為進入的數據聲明一個變數。
'調用 GetData 方法,並將數據賦予名為 txtOutput
'的 TextBox 的 Text 屬性。
Dim strData As String
tcpServer.GetData strData
txtOutput.Text = strData
End Sub
上面的步驟創建了一個簡單的伺服器應用程序。為了使它能夠工作,還必須為它創建一個客戶端的應用程序。
要創建 TCP 客戶端,請按照以下步驟執行:
在工程中添加一個新的窗體,將其命名為 frmClient。
將窗體的標題改為「TCP Client」。
在窗體中添加一個 Winsock 控制項,並將其命名為 tcpClient。
在 frmClient 中添加兩個 TextBox 控制項。將第一個命名為 txtSend,第二個為 txtOutput。
在窗體上放一個 CommandButton 控制項,並將其命名為 cmdConnect。
將 CommandButton 控制項的標題改為 Connect。
在窗體中添加如下的代碼。
重點 必須將 RemoteHost 屬性值修改為您的計算機的名字。
Private Sub Form_Load()
'Winsock 控制項的名字為 tcpClient。
'注意:要指定遠程主機,可以使用
' IP 地址(例如:"121.111.1.1"),也可以使用
'計算機的「好聽的名字」如下所示。
tcpClient.RemoteHost = "RemoteComputerName"
tcpClient.RemotePort = 1001
End Sub
Private Sub cmdConnect_Click()
'調用 Connect 方法,初始化連接。
tcpClient.Connect
End Sub
Private Sub txtSendData_Change()
tcpClient.SendData txtSend.Text
End Sub
Private Sub tcpClient_DataArrival _
(ByVal bytesTotal As Long)
Dim strData As String
tcpClient.GetData strData
txtOutput.Text = strData
End Sub
⑵ C語言 寫一個tcp的server和client程序問題 麻煩幫我看看(急!!!)
第一個問題:(我當你是Unix系統了)
用pthread_create創建線程在第一個線程中sleep 5秒send消息,第二個sleep 3秒send消息,while循環,(CPU會自己切換時間片的,你試試就知道了)
第二個問題:
如果server掛了,客戶端消息發送函數send的返回值會為-1,你可以接受send的返回值,如果為-1,你可以等待幾秒後從新連接伺服器,再發送。
當然你想邏輯設計的很復雜就少不了條件變數與互斥了。
⑶ 急需一個VB的TCP通信程序!!
大哥,你也得說要求啊?
都需要什麼功能
要是只要能連上就行
伺服器端程序內
Private Sub Form_Load()
Winsock1.LocalPort = 600
Winsock1.Protocol = 0
Winsock1.Listen
End Sub
客戶容端程序
Private Sub Form_Load()
Winsock1.RemoteHost = "這里寫伺服器的IP地址"
Winsock1.RemotePort = 600
End Sub
先在伺服器上打開伺服器端程序
再用隨便一台電腦打開客戶端程序
兩台電腦就已經連上了
伺服器必須是公網的IP地址
⑷ 如何編寫一個高並發的tcp server
伺服器在調用listen和accept後,就會阻塞在accept函數上,accpet函數返回後循環調用accept函數等待客戶的TCP連接。如果這時候又大量的用戶並發發起connect連接,那麼在listen有隊列上限(最大可接受TCP的連接數)的情況下,有多少個connect會成功了。試驗證明,當連接數遠遠高於listen的可連接數上限時,客戶端的大部分TCP請求會被拋棄,只有當listen監聽隊列空閑或者放棄某個連接時,才可以接收新的連接,那麼我們應該如何來避免這種情況出現?
分析:
(一)客戶端
客戶端運行初期完成所設定的一定量的socket創建和相應的處理線程的創建,然後使用條件變數來完成線程同步,直到最後一個線程創建完成,才向所有線程發出廣播通知,讓所有線程並發調用connect,連接成功則關閉連接,失敗則返回,如下代碼所示。
socket創建和線程創建:
int testCount=300; //並發用戶數
/*
每個進程需要自己獨立的棧空間,linux下默認棧大小是10M,在32位的機子上一個進程需要4G的內存空間,去掉自己的棧空間全局程序段空間,一般只有3G內存可以用,創建線程時就需要從這3G的空間中分配10M出來,所以最多可以分配300個線程。當然這里還可以使用多個進程,每個進程300個線程的方式來進一步擴大並發量。
*/
int sockfd[testCount];
pthread_t ntid[testCount];
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERVER_PORT);
inet_pton(AF_INET,argv[1],&servaddr.sin_addr);
int testCaseIndex=0;
for(testCaseIndex=0;testCaseIndex<testCount;testCaseIndex++)
{
sockfd[testCaseIndex]=socket(AF_INET,SOCK_STREAM,0);
//為每個並發客戶端創建一個socket
if(sockfd[testCaseIndex]==-1)
{
printf("socket established error: %s\n",(char*)strerror(errno));
return -1;
}
if( pthread_create(&ntid[testCaseIndex],NULL,handleFun,&sockfd[testCaseIndex])!=0)
{
printf("create thread error :%s\n",strerror(errno));
return -1;
}
//為每個並發客戶端創建一個線程來執行connect
}
printf("%d client has initiated\n",testCaseIndex);
並發客戶端的線程實現:線程阻塞在條件變數上(只有條件滿足了並且發起喚醒動作,線程才開始執行)。
int sockfd=*((int*)arg);
{
pthread_cond_wait(&cond,&mut);
//在條件變數上等待條件滿足!
//阻塞返回後立即解鎖,防止互斥量加鎖帶來的阻塞
pthread_mutex_unlock(&mut);
int conRes=0;
conRes=connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
//線程執行connect連接,每個線程在接到喚醒信號後,才可以執行該語句,來模擬多個線程的並發調用。
if(conRes==-1)
{
printf("connect error: %s\n",strerror(errno));
return 0;
}
}
當條件滿足時,喚醒阻塞在條件變數上的線程:
while(1)
{
sleep(2);
pthread_cond_broadcast(&cond); //在所有線程創建完成後才進行喚醒。