要解决全双工通信需要开两个线程,一个发送线程,要监听键盘的输入,另一个是接收线程,要监听接收队列。

c++的多线程编程问题在此不在这里叙述了,以后可能会单独写一篇总结一下。

由于是全双工通信,所以两个客户端应该是对等的关系,A的发送端口要对应于B的接收端口。比如A的发送端口是8000,接收端口是9000,那么B就应该是发送端口是9000,接收端口是8000。

两个客户端的代码如下:

// UDP-2.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
#include <string>
#include <iostream>
#pragma comment(lib,"WS2_32.lib")WSADATA wsa;DWORD WINAPI recv(LPVOID p)
{char buf[20];sockaddr_in addr_in;SOCKET s;int len;s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (s == INVALID_SOCKET){printf("socket failed\n");return -1;}addr_in.sin_family = AF_INET;addr_in.sin_port = htons(8000);addr_in.sin_addr.S_un.S_addr = htonl(INADDR_ANY);if (bind(s, (sockaddr*)&addr_in, sizeof(sockaddr)) == SOCKET_ERROR){printf("bind failed\n");return -1;}len = sizeof(addr_in);while (1){memset(buf, 0, sizeof(buf));if (recvfrom(s, buf, sizeof(buf), 0, (sockaddr*)&addr_in, &len) == SOCKET_ERROR){printf("recvfrom error\n");return -1;}printf("from: %s:%d\n", inet_ntoa(addr_in.sin_addr), ntohs(addr_in.sin_port));printf("content: %s\n\n", buf);if (strcmp(buf, "quit") == 0){break;}}closesocket(s);return 0;
}DWORD WINAPI send(LPVOID p)
{int retval;std::string str;char buf[20];SOCKET s;sockaddr_in addr_in;s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);addr_in.sin_family = AF_INET;addr_in.sin_port = htons(9000);addr_in.sin_addr.S_un.S_addr = inet_addr("10.36.110.62");//***************while (1){//printf("input the content:\n");memset(buf, 0, sizeof(buf));std::getline(std::cin, str);strcpy(buf, str.c_str());retval = sendto(s, buf, sizeof(buf), 0, (sockaddr*)&addr_in, sizeof(addr_in));if (retval == SOCKET_ERROR){printf("sendt0 failed\n");closesocket(s);WSACleanup();return -1;}printf("send succeeded\n\n");if (strcmp(buf, "quit") == 0){break;}}closesocket(s);return 0;
}int main()
{HANDLE recvh, sendh;DWORD recv_id, send_id, recv_excode, send_excode;if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0){printf("startup failed\n");return -1;}recvh = CreateThread(NULL, 0, recv, 0, 0, &recv_id);sendh = CreateThread(NULL, 0, send, 0, 0, &send_id);while (1){Sleep(1000);GetExitCodeThread(recvh, &recv_excode);GetExitCodeThread(sendh, &send_excode);if (recv_excode != STILL_ACTIVE || send_excode != STILL_ACTIVE){break;}}printf("\n*****end*****\n");getchar();system("pause");return 0;
}
另一个客户端直接复制粘贴就可以了,只不过要注意修改IP地址和端口号

UDP全双工通信的实现相关推荐

  1. udp 全双工通信 linux,客户端和服务器实现全双工通信(基于线程)

    客户端和服务器实现全双工通信(基于线程) 1. 基于多线程实现一个服务器和一个客户端实现全双工通信 服务器端创建两个线程:一个用于接收客户端发送过来的信息:一个用来给客户端发送信息. 客户端也创建两个 ...

  2. 客户端和服务器实现全双工通信(基于线程)

    http://blog.sina.com.cn/s/blog_87766e4a0100yp7a.html 1. 基于多线程实现一个服务器和一个客户端实现全双工通信 服务器端创建两个线程:一个用于接收客 ...

  3. 基于Linux用C语言实现TCP半双工通信和UDP半双工通信

    文章目录 TCP协议/UDP协议介绍 三种通信方式 实现TCP半双工通信 所用到的结构体与函数 源代码 运行结果 实现UDP半双工通信 源代码 运行结果 参考文章 TCP协议/UDP协议介绍 TCP/ ...

  4. java socket 全双工客户端_JavaSocket全双工通信 问题 待解决

    之前发了一个JavaSocket全双工通信的随笔,今天又看了一边之后发现了很多问题,于是决定重新写一下 写的途中遇到了个问题客户端在等待键盘写入的时候如果服务器下发了下线指令(exit),只有客户端键 ...

  5. 单工、半双工和全双工通信的区别

    单工数据传输只支持数据在一个方向上传输:在同一时间只有一方能接受或发送信息,不能实现双向通信,举例:电视,广播和UDP协议的传输过程 半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数 ...

  6. c语言socket+全双工,用Winsock实现语音全双工通信使用

    二.主要函数的使用要点 通过建立双套接字,可以很方便地实现全双工网络通信. 1.套接字建立函数: SOCKET socket(int family,int type,int protocol) ...

  7. java socket 全双工客户端_java socket实现全双工通信

    单工.半双工和全双工的定义 如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工. 如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输. 如果 ...

  8. zeroc-ice的全双工通信策略

    在项目中,往往很多时候涉及全双工通信要求,zeroc-ice样例介绍很多异步通信的策略, 但我最近项目需求中,不仅是要全双工通信,还要求服务端需要明确每个客户端及区别对待, 所以需要给每个客户端做标记 ...

  9. android udp定时发送,Android Socket基于UDP协议通信

    首先我们要知道UDP通信协议是Socket通信的一种实现方式,Socket通信一般有两种通信方式:基于TCP协议.基于UDP协议.这两者的差别和优缺点就不说了,这里主要讲一下基于UDP协议的实现. 基 ...

最新文章

  1. 大家有没有推荐不错开源的小程序商城?这几个不要错过
  2. Unbutu下安装mysql服务并允许远程登录
  3. 中国煤炭行业十四五投资战略与供需形势分析报告2022版
  4. centos下svn与mysql_centos下SVN搭建
  5. openstack中swift和cinder中的区别
  6. js和ajax点赞功能代码_FANUC数控机床:你会用“M代码”调用“系统程式”吗
  7. ajax用get刷新页面元素在IE下无效解决~~
  8. 新硬盘显示有储存空间但无法分区_容量更足高速无忧,奥睿科迅龙V500 NVME硬盘体验...
  9. 从excel读取数据到datatable
  10. 使用Crash工具查看一个TCP listen sock内存布局实例
  11. 课程管理系统(面向对象python)
  12. 【java学习】多线程之高并发编程
  13. php中理解print EOT分界符和echo EOT的用法区别
  14. CSS解构系列之-新浪页面解构-01
  15. (十二)幸福之家 - 2
  16. 考研英语二计算机词汇,考研英语词汇84分的一些经验
  17. react中使用enzyme.mount和sinon
  18. android源码结构分析
  19. 前端xlsx插件简单说明
  20. 龙与地下城用户名_多用户地下城如何教我编程

热门文章

  1. TCPIP四层模型和OSI七层模型对应表
  2. Python爬虫从入门到精通——解析库pyquery的使用
  3. 闲鱼跳转源码+独立后台
  4. css实现保持元素宽高比
  5. educoder 数据库系统概论2022 SQLServer 储存过程的创建与使用
  6. 【云原生之Docker实战】部署轻量级容器云管理平台Humpback
  7. 这几个解压方法你值得拥有!
  8. 孙权以刘备的方式占据了刘备的荆州
  9. windows mysql增量备份_关于window下mysql数据库增量备份
  10. GPU 计算 - GPU 优化简介