tcp/ip 全双工会话(windows)

2024-06-21 20:38
文章标签 tcp ip 全双工 windows 会话

本文主要是介绍tcp/ip 全双工会话(windows),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


1.服务器端

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <WinSock2.h>
#pragma  comment(lib,"WS2_32.lib")
#define MAX_BUFFER 256   //对于收发的数据有限  有必要考虑封装数据收发函数
int _tmain(int argc, _TCHAR* argv[])
{
 WSADATA wsaData;
 WORD sockVersion = MAKEWORD(2,2);  //设置版本号
 if(::WSAStartup(sockVersion,&wsaData))  //初始化网络资源
  exit(0);
 SOCKET sock = ::socket(AF_INET, SOCK_STREAM, 0);
 if(sock == SOCKET_ERROR)
 {
  cout<<"Fail socket()."<<endl;
  return 0;
 }
sockaddr_in addr;
 addr.sin_family = AF_INET;
 addr.sin_port = htons(6000);
 addr.sin_addr.S_un.S_addr = INADDR_ANY;
if(::bind(sock,(SOCKADDR*)&addr, sizeof(addr)) == SOCKET_ERROR)  //绑定
 {
  cout<<"Failed bind()."<<endl;
  return 0;
 }
if(::listen(sock,5) == SOCKET_ERROR) //监听
 {
  cout<<"Failed listen()."<<endl;
  return 0;
 }
sockaddr_in clientAddr;
 SOCKET clientSock;
 int len = sizeof(clientAddr);
 char szTest[MAX_BUFFER]={0};
clientSock = ::accept(sock,(SOCKADDR*)&clientAddr,&len);  //接受
 if(clientSock == INVALID_SOCKET)
 {
  cout<<"Failed accept()!"<<endl;
  return 0;
 }
 else
 {
  cout<<"接受到一个连接:  "<<inet_ntoa(clientAddr.sin_addr)<<endl;
 }
while(true)
 {
  cout<<"请输入数据:   ";
  cin>>szTest;
  ::send(clientSock, szTest, strlen(szTest),0);
  char szBuf[256] = {0}; 
  int len = ::recv(clientSock, szBuf,256,0);
  if(len > 0)
  {
   szBuf[len] = 0;
   cout<<"客户端说:   "<<szBuf<<endl;
  }
  Sleep(100);
 }
::closesocket(clientSock);
 ::closesocket(sock);   //关闭套接字
 ::WSACleanup();   //释放网络资源
 getchar();
 return 0;
}

//WSAStartup socket accept bing listen 等函数详见帮助文档

客户端:
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <WinSock2.h>
#pragma  comment(lib,"WS2_32.lib")
#define MAX_BUFFER 256
int _tmain(int argc, _TCHAR* argv[])
{
 WSADATA wsaData;
 WORD sockVersion = MAKEWORD(2,2);
 if(::WSAStartup(sockVersion,&wsaData))
  exit(0);
 SOCKET sock = ::socket(AF_INET, SOCK_STREAM, 0);
 if(sock == SOCKET_ERROR)
 {
  cout<<"Fail socket()."<<endl;
  return 0;
 }
sockaddr_in addr;
 addr.sin_family = AF_INET;
 addr.sin_port = htons(6000);
 addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if(::connect(sock,(SOCKADDR*)&addr, sizeof(addr)) == -1)
 {
  cout<<"Failed connect()!"<<endl;
  return 0;
 }
 char szTest[MAX_BUFFER]={0};
 while(true)
 {
  char szBuf[256] = {0}; 
  int len = ::recv(sock, szBuf,256,0);
  if(len > 0)
  {
   szBuf[len] = 0;
   cout<<"服务器说:   "<<szBuf<<endl;
  }
  cout<<"请输入数据:   ";
  cin>>szTest;
  ::send(sock, szTest, strlen(szTest),0);
  Sleep(100);
 }
 
 ::closesocket(sock);
 ::WSACleanup();
 getchar();
 return 0;
}

由于:accept,recv,send等函数式阻塞式的,所指只能你一句,我一句那样通话

这篇关于tcp/ip 全双工会话(windows)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1082281

相关文章

问题-windows-VPN不正确关闭导致网页打不开

为什么会发生这类事情呢? 主要原因是关机之前vpn没有关掉导致的。 至于为什么没关掉vpn会导致网页打不开,我猜测是因为vpn建立的链接没被更改。 正确关掉vpn的时候,会把ip链接断掉,如果你不正确关掉,ip链接没有断掉,此时你vpn又是没启动的,没有域名解析,所以就打不开网站。 你可以在打不开网页的时候,把vpn打开,你会发现网络又可以登录了。 方法一 注意:方法一虽然方便,但是可能会有

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents

Windows中,.net framework 3.5安装

安装.net framework,目前已知2种方法,如下: 一、在MSDN下载对应的安装包,安装,这种可能无法安装成功,概率很大,不成功使用第二种方法,基本上没问题。 二、win8/8.1/10 下安装 .net framework 3.5.1: 1. 打开 win8/8.1/10 安装盘(这里指系统安装镜像文件),提取 sources\sxs 文件夹到 X:\sources\sxs (X代

Windows 可变刷新率是什么?如何开启?

在现代计算设备中,显示屏的刷新率对用户体验起着至关重要的作用。随着显示技术的不断进步,固定刷新率显示器逐渐被支持可变刷新率(Variable Refresh Rate, VRR)技术的显示器所取代。 可变刷新率定义 可变刷新率是什么?可变刷新率(VRR)是一种显示技术,它允许显示器的刷新率动态调整,以匹配显卡输出的帧率。传统的显示器通常具有固定的刷新率(如60Hz、75Hz等),这意味着显示器

[vivado][IP核]FFT

刘东华的IP核详解: 1、 2、

[vivado][IP核]DDS

刘东华的IP核详解: 1、 这里的是指IP核配置中的相位数据的宽度。 2、 实际使用此IP核时并没有“频率分辨率”可以配,是靠改变来变的。 3、 4、 5、 数据输出的ready在数据正式输出时才会有。 自己仿真: 使用SIN/COS LUT only的模式,使用一个累加器作为相位输入,不知怎么,输出为X。

[ip核][vivado]aurora

Xapp1193:  discovered:1)并不是所有芯片都支持aurora.xc7z010就没有。                     2)XDC文件的指令-允许未约束的引脚的存在:                 set_property BITSTREAM.General.UnconstrainedPins {Allow} [current_design] PG046

[ip核][vivado]Block Menory Gennerator 学习

<刘东华的xilinx系列FPGA芯片IP核详解>读书摘录: 1. 2. 3.

[ip核][vivado]FIFO 学习

<xlinx FPGA应用进阶 通用IP核详解和设计开发>读书摘录: 1.        2.3.仿真模型 特点总结:1)复位后会有busy状态,需要等待wr_rst_busy信号低电平后才能正常写入                  2)prog_full信号的高电平长度可调                  3)仿真中的读状态很奇怪,并没有正常读取,都是XXX的状态。 所用的te

如何设置windows计划任务

如何设置windows计划任务 前言:在工作过程中写了一个python脚本,用于调用jira接口查询bug单数量,想要在本地定时任务执行,每天发送到钉钉群提醒,写下操作步骤用于记录。 1. 准备 Python 脚本 确保你的 Python 脚本已经保存到一个文件,比如 jira_reminder.py。 2. 创建批处理文件 为了方便任务计划程序运行 Python 脚本,创建一个批处理文