运行截图:

客户端

  • 创建通信套接字
 //通信套接字,用于创建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. 父子间通信四 ($dispatch 和 $broadcast用法)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. DELL T110 II 系统安装总结

    DELL T110 II  系统安装总结 1.RAID制作:https://jingyan.baidu.com/article/a3aad71ac4ce98b1fb0096bc.html 2.系统安装 ...

  3. vue+ webpack中的animate.css实现的执行多个连续的动画

    1.安装 npm install animate.css 2.使用方法 入口文件App中进行引入 import animate from 'animate.css' 3.多个连续的动画 实现的效果:实 ...

  4. centos yum 安装php7.2

    yum -y remove php* rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm r ...

  5. php自定义加密和解密

    <?php function _authcode($string, $operation = 'DECODE', $expiry = 0) { $key = 'c5s1t6o';    $cke ...

  6. 【Codeforces Round #459 (Div. 2) C】The Monster

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 左括号看成1 右括号看成-1 设置l,r表示前i个数的和的上下界 遇到 左括号 l和r同时加1 遇到右括号 同时减1 遇到问号 因为 ...

  7. 【例题 7-11 UVA - 12325】Zombie's Treasure Chest

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 1.N/s1 < 1e6 枚举1的个数 2.N/s2<1e6 枚举2的个数 3.s1和s2的值较小 假设买了s2个1和s ...

  8. php 图片局部打马赛克

    php 图片局部打马赛克 原理: 对图片中选定区域的每一像素,添加若干宽度及高度,生成矩型.而每一像素的矩型重叠在一起.就形成了马赛克效果. 本例使用GD库的imagecolorat获取像素颜色,使用 ...

  9. jQuery08源码 (5140 , 6057) DOM操作 : 添加 删除 获取 包装 DOM筛选

    jQuery.fn.extend({ //$('ul').find('li').css('background','red'); //$('ul').find( $('li') ).css('back ...

  10. JCameraView 仿微信拍照Android控件(点击拍照,长按录小视频)

    JCameraView 控件介绍 这是一个模仿微信拍照的Android开源控件,主要的功能有如下: 点击拍照. 前后摄像头的切换. 长按录视频(视频长度为10秒内). 长按录视频的时候,手指上滑可以放 ...