运行截图:

客户端

  • 创建通信套接字
 //通信套接字,用于创建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. 2015北京网络赛 Couple Trees 倍增算法

    2015北京网络赛 Couple Trees 题意:两棵树,求不同树上两个节点的最近公共祖先 思路:比赛时看过的队伍不是很多,没有仔细想.今天补题才发现有个 倍增算法,自己竟然不知道.  解法来自 q ...

  2. HDU 5438 Ponds dfs模拟

    2015 ACM/ICPC Asia Regional Changchun Online 题意:n个池塘,删掉度数小于2的池塘,输出池塘数为奇数的连通块的池塘容量之和. 思路:两个dfs模拟就行了 # ...

  3. 在Navicat中如何新建数据库和表并做查询

    上一篇文章,小编给大家分享了在Navicat中如何远程连接数据库,没有来得及上车的小伙伴可以戳这篇文章:在Ubuntu14.04中配置mysql远程连接教程.今天小编给大家分享一下如何在Navicat ...

  4. 【 正确使用vim编辑器的姿势】

    vi:可视化接口(Visual Interface) vim:是vi的增强版(vi iMprove) vi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样 ...

  5. pycharm 添加注册码

    https://blog.csdn.net/u014044812/article/details/78727496

  6. HypericHQ

    https://sourceforge.net/projects/hyperichq-zh-cn/?source=typ_redirect

  7. 【Tika基础教程之中的一个】Tika基础教程

    一.高速入门 1.Tika是一个用于文本解释的框架.其本身并不提供不论什么的库用于解释文本,而是调用各种各样的库,如POI,PDFBox等. 使用Tika.能够提取文件里的作者.标题.创建时间.正文等 ...

  8. Template template parameter(模板參数) example

    /********************************************************************************* Copyright (C), 19 ...

  9. awk依照多个分隔符进行切割

    我们知道awk能够进行类似于cut之类的操作.如一个文件data例如以下 zhc-123|zhang hongchangfirst-99|zhang hongchang-100|zhang 假设我们 ...

  10. select选择框实现跳转

    select选择框实现跳转 零.启示 1.启示把bom里面的几个对象稍微有点印象,那么主干有了,学其它的就感觉添置加瓦,很简单 就是关注树木的主干 2.万能的百度,不过当然要你基础好学得多才能看得懂, ...