• 客户端代码

     #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");
    }

最新文章

  1. js为空的几种情况
  2. salesforce 零基础开发入门学习(十二)with sharing 、without sharing 、无声明区别
  3. bzoj 1588: [HNOI2002]营业额统计 treap
  4. 中文Ubuntu系统根目录文件夹名称变为英文
  5. Flex 日期选择器控件
  6. Hdu 4312-Meeting point-2 切比雪夫距离,曼哈顿距离,前缀和
  7. 使用Sass和Compass组合写CSS
  8. [C# 基础知识系列]专题六:泛型基础篇——为什么引入泛型
  9. composite template 组合模式
  10. Android中Bitmap, Drawable, Byte之间的转化
  11. 让这三个月来的更猛烈些吧,前端react同构项目
  12. redis在spring-boot中的应用
  13. 原生态的ajax代码
  14. Android自定义Button的“款式”
  15. ECMAScript 6 学习(一)generator函数
  16. 字节码操作JAVAssist
  17. 【转】Linux查看系统是32位还是64位方法总结
  18. Android Studio 上传GitHub项目失败后的一些问题
  19. 【转】mysql优化步骤
  20. ADO.Net1

热门文章

  1. Zookeeper的单节点集群详细启动步骤
  2. Codefroces 822C Hacker, pack your bags!
  3. 推荐《深入浅出深度学习原理剖析与python实践》PDF+代码
  4. wc---计算字数。
  5. HTML5贪吃蛇源代码
  6. 在gridview里查找模板里的button控件
  7. 5个jvm命令
  8. Stacked Autoencoders
  9. HDU 2633 Getting Driving License(模拟)
  10. sparksql不支持hive中的分区名称大写