⑴ 怎么用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); //在所有线程创建完成后才进行唤醒。