97.TCP通信
运行截图:

客户端
- 创建通信套接字
//通信套接字,用于创建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通信的更多相关文章
- TCP通信
//网络套接字编程实例,服务器端,TCP通信. #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib") #inc ...
- 清晰易懂TCP通信原理解析(附demo、简易TCP通信库源码、解决沾包问题等)C#版
目录 说明 TCP与UDP通信的特点 TCP中的沾包现象 自定义应用层协议 TCPLibrary通信库介绍 Demo演示 未完成功能 源码下载 说明 我前面博客中有多篇文章讲到了.NET中的网络编程, ...
- JAVASE02-Unit010: 多线程基础 、 TCP通信
多线程基础 . TCP通信 * 当一个方法被synchronized修饰后,那么 * 该方法称为同步方法,即:多个线程不能同时 * 进入到方法内部执行. package day10; /** * 当多 ...
- 艺萌文件上传下载及自动更新系统(基于networkComms开源TCP通信框架)
1.艺萌文件上传下载及自动更新系统,基于Winform技术,采用CS架构,开发工具为vs2010,.net2.0版本(可以很容易升级为3.5和4.0版本)开发语言c#. 本系统主要帮助客户学习基于TC ...
- NetworkComms V3 使用TCP通信传递IList<T>类型的数据
客户端从服务器获取一组IList<T>类型的数据非常常见(通常从数据库中获取) 我们用NeworkComms V3来演示一下(NetworkcommsV2.x版本也同样支持) [ 使用pr ...
- [C语言]一个很实用的服务端和客户端进行TCP通信的实例
本文给出一个很实用的服务端和客户端进行TCP通信的小例子.具体实现上非常简单,只是平时编写类似程序,具体步骤经常忘记,还要总是查,暂且将其记下来,方便以后参考. (1)客户端程序,编写一个文件clie ...
- ACE_linux:TCP通信
1.涉及类 ACE_INET_Addr//ACE网络地址ACE_SOCK_Acceptor//ACE网络服务器ACE_SOCK_Connector//ACE网络客户端ACE_SOCK_Stream// ...
- 异步tcp通信——APM.Server 消息推送服务的实现
消息推送服务 服务器推送目前流行就是私信.发布/订阅等模式,基本上都是基于会话映射,消息对列等技术实现的:高性能.分布式可以如下解决:会话映射可采用redis cluster等技术实现,消息对列可使用 ...
- 异步tcp通信——APM.ConsoleDemo
APM测试 俗话说麻雀虽小,五脏俱全.apm虽然简单,但是可以实现单机高性能消息推送(可以采用redis.kafka等改造成大型分布式消息推送服务器). 测试demo: using System; u ...
随机推荐
- C#解决System.Security.Cryptography.MD5.Create()调用的目标发生了异常)的问题
今天搭建微信扫码支付环境的时候,一样的配置参数,调用连接提示错误 错误:调用的目标发生了异常 然后跟踪到执行 MD5 md5 = System.Security.Cryptography.MD5.Cr ...
- noip 2018 day1 T3 赛道修建 贪心_树上问题_multiset
Code: // luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; #define maxn 5000 ...
- mpvue 开发小程序
转换成vue语法, 小程序中原生的事件用@ 原生的属性用:
- Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型
1.基础知识 1.1.数据库概述 简单地说:数据库(Database或DB)是存储.管理数据的容器: 严格地说:数据库是"按照某种数据结构对数据进行组织.存储和管理的容器". 总结 ...
- swift菜鸟入门视频教程-12-21讲
前段时间录制的swift教程.一直懒就没有发出来,有些教程是在xcode beta2的时候录制的,所以可能如今不太适合了,可是还是会有点帮助,懒了不想写太多的东西了,基本上就是依照官方文档上面的章节做 ...
- UML图和C#
这段时间学习了楚光明老师解说的C#视频,接触这个学习材料的第一感觉就是老师解说的通俗易懂,非常easy让人去接受:再有就是在学习到UML图和C#的一节时非常有收获,之前自己也学习过UML图的一 ...
- 变量get、set设置
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- js函数的属性和方法
js函数的属性和方法 前面的话 函数是javascript中特殊的对象,可以拥有属性和方法,就像普通的对象拥有属性和方法一样.甚至可以用Function()构造函数来创建新的函数对象.本文是深入理解j ...
- vue 打包成 apk 文件(修改路径)
第一个坑:文件引用路径 现在项目我们什么都没动,是初始化之后直接打包的状态,打开dist/index.htmnl文件整个网页都是一片空白的. 爬坑: 打开 config文件夹/index.js文件 a ...
- System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接
System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接