运行截图:

客户端

  • 创建通信套接字
 //通信套接字,用于创建TCP连接
SOCKET socket_send;
  • 创建tcp通信

     //创建tcp通信
    socket_send = socket(AF_INET, SOCK_STREAM, );
  • 创建服务器端结构体保存ip地址以及端口号,用于连接服务器
     //创建服务器端结构体保存ip地址以及端口号
    SOCKADDR_IN sever_addr;
  • 设置通信模式
     //设置通信模式
    sever_addr.sin_family = AF_INET;
    sever_addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.104");
    //端口
    sever_addr.sin_port = htons();
  • 通过套接字连接服务器
         //通过套接字连接到服务器
    connect(socket_send, (SOCKADDR*)&sever_addr, sizeof(SOCKADDR));

    连接到服务器后就可以对服务器进行发送或者接受数据

  • 通过套接字发送信息
     sendlength = send(socket_send, sendbuf, , );
  • 通过套接字接收信息
     receivelength = recv(socket_send, receivebuf, , );
  • 关闭网络
     //关闭网络
    closesocket(socket_send);
    WSACleanup();//关闭

客户端完整代码

 #define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
//网络通信
#include<winsock.h>
#pragma comment(lib,"ws2_32.lib") void main()
{
//发送的消息
char sendbuf[] = { };
//收到的消息
char receivebuf[] = { };
//发送的长度
int sendlength = ;
//接收的长度
int receivelength = ; //通信套接字,用于创建TCP连接
SOCKET socket_send;
//创建服务器端结构体保存ip地址以及端口号
SOCKADDR_IN sever_addr; //版本,2,2版本
WORD wversion = MAKEWORD(, );
//版本
WSADATA wsadata;
//获取版本对比,开始通信
int error = WSAStartup(wversion, &wsadata);
if (error != )
{
printf("error");
return;
}
//取出低八位,高八位,对比版本
if (LOBYTE(wsadata.wVersion) != || HIBYTE(wsadata.wVersion) != )
{
printf(" version error");
return;
}
//设置通信模式
sever_addr.sin_family = AF_INET;
sever_addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.104");
//端口
sever_addr.sin_port = htons(); //创建tcp通信
socket_send = socket(AF_INET, SOCK_STREAM, ); //通过套接字连接到服务器
connect(socket_send, (SOCKADDR*)&sever_addr, sizeof(SOCKADDR)); while ()
{
printf("客户端要说什么:");
scanf("%s", sendbuf);
//通过套接字发送到服务器
sendlength = send(socket_send, sendbuf, , );
memset(receivebuf, , );//清零 //通过套接字接收
receivelength = recv(socket_send, receivebuf, , );
printf("服务器说:%s\n", receivebuf);
memset(sendbuf, , );//清零 }
//关闭网络
closesocket(socket_send);
WSACleanup();//关闭
}

服务器端

  • 创建服务器套接字

     //服务器套接字
    SOCKET socket_server;
  • 创建tcp通信
     //创建服务器套接字,接受消息  SOCK_STREAM流
    socket_server = socket(AF_INET, SOCK_STREAM, );//创建
  • 创建服务器端结构体保存ip地址以及端口号
     //服务器结构体信息
    SOCKADDR_IN sever_addr;
  • 设置服务器结构体信息
     //设置服务器结构体信息
    sever_addr.sin_family = AF_INET;//通信
    sever_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//获取本地址
    sever_addr.sin_port = htons();//端口
  • 把服务器结构体和服务器套接字绑定
     //把套接字与服务器结构体绑定 (绑定的是地址,端口)
    bind(socket_server, (SOCKADDR*)&sever_addr, sizeof(SOCKADDR));
  • 服务器套接字监听
     //服务器套接字监听
    listen(socket_server, );//最大等待数目为5
  • 获取SOCKADDR结构体大小用于接受连接
     length = sizeof(SOCKADDR);
  • 通过服务器套接字接受连接并初始化套接字sorket_receive,把连接者的信息存放在结构体client_addr中
     //客户端结构体信息
    SOCKADDR_IN client_addr;
  •  sorket_receive = accept(socket_server, (SOCKADDR*)&client_addr, &length);
  • 通过套接字sorket_receive向客户端接受或发送消息
     //接收数据
    receivelength = recv(sorket_receive, receivebuf, , );
    printf("客户端说:%s\n", receivebuf);
    memset(receivebuf, , );//清零 //返回发送数据
    printf("服务器要说什么:");
    //接收信息
    scanf("%s", sendbuf);
    //通过连接传递消息到连接
    sendlength = send(sorket_receive, sendbuf, , );
    memset(sendbuf, , );//清零
  • 释放网络
     //释放网络
    closesocket(sorket_receive);//关闭网络
    closesocket(socket_server);
    WSACleanup();//关闭

服务器端完整代码

 #define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
//网络通信
#include<winsock.h>
#pragma comment(lib,"ws2_32.lib") void main()
{
//发送的消息
char sendbuf[] = { };
//收到的消息
char receivebuf[] = { };
//发送的长度
int sendlength = ;
//收到的长度
int receivelength = ;
// SOCKADDR结构体长度
int length; //服务器套接字
SOCKET socket_server;
//连接的套接字
SOCKET sorket_receive; //服务器结构体信息
SOCKADDR_IN sever_addr;
//客户端结构体信息
SOCKADDR_IN client_addr; //版本,2,2版本
WORD wversion = MAKEWORD(, );
//当前版本
WSADATA wsadata;
//获取版本对比,开始通信
int error = WSAStartup(wversion, &wsadata);
if (error != )
{
printf("error");
return;
}
//取出低八位,高八位,对比版本
if (LOBYTE(wsadata.wVersion) != || HIBYTE(wsadata.wVersion) != )
{
printf(" version error");
return;
} //设置服务器结构体信息
sever_addr.sin_family = AF_INET;//通信
sever_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//获取本地址
sever_addr.sin_port = htons();//端口 //创建服务器套接字,接受消息 SOCK_STREAM流
socket_server = socket(AF_INET, SOCK_STREAM, );//创建
//把套接字与服务器结构体绑定 (绑定的是地址,端口)
bind(socket_server, (SOCKADDR*)&sever_addr, sizeof(SOCKADDR));
//服务器套接字监听
listen(socket_server, );//最大等待数目为5
length = sizeof(SOCKADDR);
//通过服务器套接字接受连接,初始化套接字sorket_receive,把连接者的信息存放在结构体client_addr中
sorket_receive = accept(socket_server, (SOCKADDR*)&client_addr, &length); while ()
{
//接收数据
receivelength = recv(sorket_receive, receivebuf, , );
printf("客户端说:%s\n", receivebuf);
memset(receivebuf, , );//清零 //返回发送数据
printf("服务器要说什么:");
//接收信息
scanf("%s", sendbuf);
//通过连接传递消息到连接
sendlength = send(sorket_receive, sendbuf, , );
memset(sendbuf, , );//清零
} //释放网络
closesocket(sorket_receive);//关闭网络
closesocket(socket_server);
WSACleanup();//关闭
system("pause");
}

97.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. Weka中数据挖掘与机器学习系列之Weka简介(二)

    不多说,直接上干货! Weka简介 Weka是怀卡托智能分析环境(Waikato Environment for Knowledge Analysis)的英文字首缩写,官方网址为:http://www ...

  2. Multi-process Resource Loading

    For Developers‎ > ‎Design Documents‎ > ‎ Multi-process Resource Loading 目录 1 This design doc n ...

  3. python yield学习

    yield的功能类似于return,但是不同之处在于它返回的是生成器. 生成器生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器). 如果一个函数包 ...

  4. HTML中常用的部分标签(一)

    [常见的块级标签] 标题标签<h1></h1>...<h6></h6> 水平线<hr/> 段落<p></p> 换行& ...

  5. b模式处理文件

    1.读 f=open('cheng','rb') date=f.read() print(date.decode()) 2.写 f=open('cheng','ab') f.write('chengz ...

  6. javafx drag

    public class EffectTest extends Application { @Override public void start(Stage stage) { stage.setTi ...

  7. centos7基础配置

    记录虚拟机安装完成后的初始配置: 1.网络: 桥接方式,设置静态ip,与物理机同一网段 Ip配置 配置完成 service network restart ,重启网络后 物理机可ssh连接虚拟机系统. ...

  8. IntelliJ IDEA基于maven构建的web项目找不到jar包

    基于maven构建的springMVC项目,下载好jar包import后,运行提示ClassNotFoundException: java.lang.ClassNotFoundException: o ...

  9. 深入具体解释SQL中的Null

    NULL 在计算机和编程世界中表示的是未知,不确定.尽管中文翻译为 "空", 但此空(null)非彼空(empty). Null表示的是一种未知状态.未来状态,比方小明兜里有多少钱 ...

  10. POJ 2828 线段树单点更新 离线搞

    Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...