• 客户端代码

     #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通信实现远程控制的更多相关文章

  1. TCP通信

    //网络套接字编程实例,服务器端,TCP通信. #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib") #inc ...

  2. 清晰易懂TCP通信原理解析(附demo、简易TCP通信库源码、解决沾包问题等)C#版

    目录 说明 TCP与UDP通信的特点 TCP中的沾包现象 自定义应用层协议 TCPLibrary通信库介绍 Demo演示 未完成功能 源码下载 说明 我前面博客中有多篇文章讲到了.NET中的网络编程, ...

  3. JAVASE02-Unit010: 多线程基础 、 TCP通信

    多线程基础 . TCP通信 * 当一个方法被synchronized修饰后,那么 * 该方法称为同步方法,即:多个线程不能同时 * 进入到方法内部执行. package day10; /** * 当多 ...

  4. 艺萌文件上传下载及自动更新系统(基于networkComms开源TCP通信框架)

    1.艺萌文件上传下载及自动更新系统,基于Winform技术,采用CS架构,开发工具为vs2010,.net2.0版本(可以很容易升级为3.5和4.0版本)开发语言c#. 本系统主要帮助客户学习基于TC ...

  5. NetworkComms V3 使用TCP通信传递IList<T>类型的数据

    客户端从服务器获取一组IList<T>类型的数据非常常见(通常从数据库中获取) 我们用NeworkComms V3来演示一下(NetworkcommsV2.x版本也同样支持) [ 使用pr ...

  6. [C语言]一个很实用的服务端和客户端进行TCP通信的实例

    本文给出一个很实用的服务端和客户端进行TCP通信的小例子.具体实现上非常简单,只是平时编写类似程序,具体步骤经常忘记,还要总是查,暂且将其记下来,方便以后参考. (1)客户端程序,编写一个文件clie ...

  7. ACE_linux:TCP通信

    1.涉及类 ACE_INET_Addr//ACE网络地址ACE_SOCK_Acceptor//ACE网络服务器ACE_SOCK_Connector//ACE网络客户端ACE_SOCK_Stream// ...

  8. 异步tcp通信——APM.Server 消息推送服务的实现

    消息推送服务 服务器推送目前流行就是私信.发布/订阅等模式,基本上都是基于会话映射,消息对列等技术实现的:高性能.分布式可以如下解决:会话映射可采用redis cluster等技术实现,消息对列可使用 ...

  9. 异步tcp通信——APM.ConsoleDemo

    APM测试 俗话说麻雀虽小,五脏俱全.apm虽然简单,但是可以实现单机高性能消息推送(可以采用redis.kafka等改造成大型分布式消息推送服务器). 测试demo: using System; u ...

随机推荐

  1. UVALive - 6269 Digital Clock 模拟

    UVALive - 6269 Digital Clock 题意:时钟坏了,给你一段连续的时间,问你现在可能的时间是多少. 思路:直接模拟,他妈的居然这场就跪在了这题,卧槽,他妈的就在111行,居然多打 ...

  2. JS--处理重复元素

    1.Js找出在数组中出现过的元素,即删除重复元素最后只留一个 <script> function findEleOnly(arr){ for(var i=arr.length-1;i> ...

  3. SQLHelper--java类

    package richard; import java.beans.Statement; import java.sql.Connection; import java.sql.DriverMana ...

  4. 2018 NOIP备战计划

    2018 NOIP目标 (1)刷完紫书数论习题 (2)听51nod讲座和习题,根据其知识结构来备战. (3)刷完紫书动规 (4)初赛前两个星期左右开始复习 刷紫书动规的时候感觉偏难,进步缓慢.应该自己 ...

  5. hzwer 模拟题 祖孙询问

    祖孙询问 题目描述 已知一棵n个节点的有根树.有m个询问.每个询问给出了一对节点的编号x和y,询问x与y的祖孙关系. 输入输出格式 输入格式: 输入第一行包括一个整数n表示节点个数. 接下来n行每行一 ...

  6. [C/C++标准库]_[0基础]_[使用fstream合并文本文件]

    场景: 1. 就是合并文本文件,而且从第2个文件起不要合并第一行. 2. 多加了一个功能,就是支持2个以上的文件合并. 3. 问题: http://ask.csdn.net/questions/192 ...

  7. js--11对象的创建方式

    <html> <head> <title>Object</title> </head> <body> <script ty ...

  8. 使用PHP来压缩CSS文件

    这里将介绍使用PHP以一种简便的方式来压缩你的CSS文件.这种方法不需要命名你的.css文件和.php文件. 当前有许多方法需要将.css文件重命名成.php文件,然后在所有PHP文件中放置压缩代码. ...

  9. C#变量引用与全局变量

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. CentOS下编译安装Apache

    与Apache 2.2.x相比,Apache 2.4.x提供了很多性能方面的提升,包括支持更大流量.更好地支持云计算.利用更少的内存处理更多的并发等.除此之外,还包括性能提升.内存利用.异步 I/O的 ...