103.tcp通信实现远程控制
- 客户端代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib") //定义端口号
#define port 9876
//要连接的ip地址
#define ip_addr "192.168.1.108" void main()
{
//对比版本
WSADATA WSA;
//客户端套接字
SOCKET client;
//服务器信息
struct sockaddr_in severaddr;
//线程句柄
HANDLE hthread = NULL;
//保存连接信息
int Ret = ;
char senbuf[] = { }; if (WSAStartup(MAKEWORD(,),&WSA)!=)
{
puts("版本不一致,通信失败");
system("pause");
return;
}
//创建socket
client = socket(AF_INET, SOCK_STREAM, );
if (client == INVALID_SOCKET)
{
puts("客户端创建失败");
system("pause"); }
//设置服务器信息
severaddr.sin_family = AF_INET;
//设置地址
severaddr.sin_addr.s_addr = inet_addr(ip_addr);
//端口
severaddr.sin_port = htons(port);
//清空
memset(severaddr.sin_zero, 0x00, ); //连接
Ret = connect(client, (struct sockaddr*) &severaddr, sizeof(severaddr));
if (Ret!=)
{
puts("客户端链接失败");
system("pause");
}
while ()
{
printf("请输入向服务器发送的消息:");
//scanf("%s", senbuf);//输入
fgets(senbuf,,stdin);
Ret = send(client, senbuf, strlen(senbuf), );//发送
if (Ret==SOCKET_ERROR)
{
puts("客户端send失败");
system("pause");
}
//char receivebuf[256];
//memset(receivebuf, 0, 256);//清零
//Ret = recv(client, receivebuf, 256, 0);
//printf("收到客户端发送的消息:%s\n", receivebuf);
} closesocket(client);
WSACleanup();
} - 服务器端代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include <winsock.h>
#include <process.h>
#pragma comment(lib,"ws2_32.lib") #define port 9876
#define ip_addr "192.168.1.102"
char sendbuf[] = { };
HANDLE event;//事件
HANDLE mutex = NULL; //创建线程接受客户端发来的消息
DWORD WINAPI clientthreadread(void *p)
{
//数指针类型转换
SOCKET client = (SOCKET)p;
int Ret = ;
char receivebuf[]; while ()
{
//清零
memset(receivebuf, , );
//读取
Ret = recv(client, receivebuf, , );
if (Ret == SOCKET_ERROR)
{
puts("客户端send失败");
break;
}
printf("\n收到%s,", receivebuf);
system(receivebuf);
//进入临界区
WaitForSingleObject(mutex, INFINITE);
memset(sendbuf, , );
//全局变量,锁定
strcpy(sendbuf, receivebuf);
ReleaseMutex(mutex);
//通知
//SetEvent(event);
}
return ;
} //创建线程向客户端发送消息
DWORD WINAPI clientthreadwrite(void *p)
{
SOCKET client = (SOCKET)p;//数指针类型转换
int Ret = ; while ()
{
WaitForSingleObject(event, INFINITE);//等待事件
WaitForSingleObject(mutex, INFINITE); if (strlen(sendbuf) != )
{
//发送信息
Ret = send(client, sendbuf, strlen(sendbuf), );
}
ReleaseMutex(mutex);
ResetEvent(event);//手动复位
}
} //接受连接
void recv_connect(void *p)
{
WSADATA WSA;//对比版本 SOCKET client,sever;//客户端 //本地地址信息,以及连接的客户端地址信息
struct sockaddr_in localeaddr,clientaddr;
int addrlength = ;
HANDLE hthread1 = NULL;//线程句柄
HANDLE hthread2 = NULL;
HANDLE hthread3 = NULL;
int Ret = ;
char senbuf[] = { }; //对比版本
if (WSAStartup(MAKEWORD(, ), &WSA) != )
{
puts("版本不一致,通信失败");
system("pause");
return;
}
//创建通信
sever = socket(AF_INET, SOCK_STREAM, );
if (sever == INVALID_SOCKET)
{
puts("服务器创建失败");
system("pause");
return;
}
//设置服务器结构体信息
localeaddr.sin_family = AF_INET;
localeaddr.sin_addr.s_addr = inet_addr(ip_addr);
localeaddr.sin_port = htons(port);
memset(localeaddr.sin_zero, 0x00, );//清零
//与socket绑定
Ret = bind(sever, (struct sockaddr*)&localeaddr, sizeof(localeaddr));
if (Ret != )
{
puts("绑定失败");
system("pause");
return;
}
Ret = listen(sever, );
if (Ret != )
{
puts("监听失败");
system("pause");
return;
}
puts("服务器启动"); while ()
{
addrlength = sizeof(clientaddr);//获取长度
//接受客户端连接,信息存放在clientaddr中
client = accept(sever, (struct sockaddr*) &clientaddr, &addrlength);
if (client == INVALID_SOCKET)
{
puts("接收失败");
system("pause");
return;
}
printf("\n客户端连接%s 端口号:%d\n", inet_ntoa(clientaddr.sin_addr), clientaddr.sin_port);
//创建写的线程
//hthread3 = CreateThread(NULL, 0, clientthreadwrite, (void*)client, 0, NULL);
//根据连接信息创建读的线程
hthread2 = CreateThread(NULL, , clientthreadread, (void*)client, , NULL);
} //关闭socket
closesocket(sever);
closesocket(client);
WSACleanup();
} void main()
{
event = CreateEvent(NULL, TRUE, FALSE, NULL);//第二个参数TRUE表示手动复位
mutex = CreateMutex(NULL, FALSE, NULL);//互相排斥 _beginthread(recv_connect, , NULL); /*Sleep(100);
while (1)
{
printf("请输入要发送的信息:");
scanf("%s", sendbuf);
SetEvent(event);
}*/
Sleep();
system("pause");
}
103.tcp通信实现远程控制的更多相关文章
- TCP通信
//网络套接字编程实例,服务器端,TCP通信. #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib") #inc ...
- 清晰易懂TCP通信原理解析(附demo、简易TCP通信库源码、解决沾包问题等)C#版
目录 说明 TCP与UDP通信的特点 TCP中的沾包现象 自定义应用层协议 TCPLibrary通信库介绍 Demo演示 未完成功能 源码下载 说明 我前面博客中有多篇文章讲到了.NET中的网络编程, ...
- JAVASE02-Unit010: 多线程基础 、 TCP通信
多线程基础 . TCP通信 * 当一个方法被synchronized修饰后,那么 * 该方法称为同步方法,即:多个线程不能同时 * 进入到方法内部执行. package day10; /** * 当多 ...
- 艺萌文件上传下载及自动更新系统(基于networkComms开源TCP通信框架)
1.艺萌文件上传下载及自动更新系统,基于Winform技术,采用CS架构,开发工具为vs2010,.net2.0版本(可以很容易升级为3.5和4.0版本)开发语言c#. 本系统主要帮助客户学习基于TC ...
- NetworkComms V3 使用TCP通信传递IList<T>类型的数据
客户端从服务器获取一组IList<T>类型的数据非常常见(通常从数据库中获取) 我们用NeworkComms V3来演示一下(NetworkcommsV2.x版本也同样支持) [ 使用pr ...
- [C语言]一个很实用的服务端和客户端进行TCP通信的实例
本文给出一个很实用的服务端和客户端进行TCP通信的小例子.具体实现上非常简单,只是平时编写类似程序,具体步骤经常忘记,还要总是查,暂且将其记下来,方便以后参考. (1)客户端程序,编写一个文件clie ...
- ACE_linux:TCP通信
1.涉及类 ACE_INET_Addr//ACE网络地址ACE_SOCK_Acceptor//ACE网络服务器ACE_SOCK_Connector//ACE网络客户端ACE_SOCK_Stream// ...
- 异步tcp通信——APM.Server 消息推送服务的实现
消息推送服务 服务器推送目前流行就是私信.发布/订阅等模式,基本上都是基于会话映射,消息对列等技术实现的:高性能.分布式可以如下解决:会话映射可采用redis cluster等技术实现,消息对列可使用 ...
- 异步tcp通信——APM.ConsoleDemo
APM测试 俗话说麻雀虽小,五脏俱全.apm虽然简单,但是可以实现单机高性能消息推送(可以采用redis.kafka等改造成大型分布式消息推送服务器). 测试demo: using System; u ...
随机推荐
- LDAP实现企业异构平台的统一认证
LDAP实现企业异构平台的统一认证 技术是为应用服务的,没有应用,技术就无用武之地.同样光配置完LDAP服务器没有任何意义,只有把所有需要认证的环节,只有纳入LDAP系统中,才能使它发挥应有 ...
- java.util.logging.FileHandler
java.util.logging.FileHandler java自带的日志功能,FileHandler可以写日志到文件系统,并且自己维护日志的增删,比c++不知道强多少 FileHandler(f ...
- cf 865 B. Ordering Pizza
B. Ordering Pizza It's another Start[c]up finals, and that means there is pizza to order for the ons ...
- 昼猫笔记 -- 面向对象(II) - 继承
继承 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念. 所以,要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现,还有就是js可以 ...
- 关于idea开发工具常用的快捷键
自动补全缺失的import alt+enter 自动优化import ctrl+alt+o 自动补全返回代码:IDEA的ctrl+alt+v ,eclipse的CTRL+F1 main p ...
- 【Uva 307】Sticks
[Link]: [Description] 给你最多n个棍子; (n< = 64) 每根棍子长度(1..50) 问你这n根棍子,可以是由多少根长度为x的棍子分割出来的; x要求最小 [Solut ...
- WPF和WinForm的区别, 数据驱动与事件驱动的优势对比
Winform中针对界面的元素进行操作, 所有业务都关联在当前窗口的后台, 而在此之前, 无奈你是双击事件的添加方式.还是后台绑定事件的方式, 你都需要给每个元素一个固定规范的名称, 然后进行相关的数 ...
- vim 基础学习之替换
替换命令substitute可以用来查找跟替换操作. :[range]s[ubstitute]/{pattern}/{string}/[flags] [count] range-命令作用范围(缺省的情 ...
- 5.Maven之(五)Maven仓库
转自:https://blog.csdn.net/oonmyway1234/article/details/82315777 本地仓库 Maven一个很突出的功能就是jar包管理,一旦工程需要依赖哪些 ...
- 关于jquery的事件命名空间
在多人协作的前端开发中,或许会遇到一个问题:几个开发人员都给一个元素添加了同样的事件,但是又有开发人员想要解除掉元素身上的某个事件效果,这时候操作起来就有些麻烦,需要用到jquery给我们提供的事件命 ...