C语言实现-----网络通信
文章目录
- C语言实现-----网络通信
- 网络编程就是编写程序使两台联网的计算机相互交换数据。
- 一 、基本原理
- 二、流程图:
- 三、核心函数包含:
- 四、函数介绍
- 1、socket 函数(套接字)
- 2、bind 函数(绑定数据对象)
- 3、listen 函数(监听)
- 4、accept 函数(接收)
- 5、connect 函数(连接服务器)
- 6、send 函数(数据发送)
- 7、recv 函数(数据接收)
- 8、sockaddr_in 结构体
- 五、 服务器端通信
- 1、基本流程步骤
- (1) 关联库及驱动
- (2) 初始化 DLL
- (3) 创建 Socket(套接字)
- (4) 设置服务器端基本信息
- (5) 绑定在本地端口
- (6) 监听端口
- (7) 循环监听(阻塞式)
- (8) 等待客户端连接
- (9) 接收客户端消息
- (10) 服务器端向客户端发消息
- (11) 关服务器
- (12) 退出服务器
- 代码实现
- 六、 客户端通信
- 1、基本流程步骤
- (1) 关联库及驱动
- (2) 初始化 DLL
- (3) 创建 Socket(套接字)
- (4) 设置服务器端基本信息
- (5) (8080)
- (6) 向服务器端发送消息
- (7) 接收服务器端推送的消息
- (8) 关闭客户端与服务器端通信
- (9) 退出客户端
C语言实现-----网络通信
网络编程就是编写程序使两台联网的计算机相互交换数据。
一 、基本原理
- 服务器端步骤:建立 socket,绑定 socket 和地址信息,开启监听,
收到请求后发送数据。 - 客户端步骤:建立 socket,连接服务器端,接收并打印服务器给
的数据。
二、流程图:
三、核心函数包含:
- socket:创建一个 socket;
- bind:用于绑定 IP 地址和端口号到 socket;
- listen: 设置能处理的最大连接要求,listen()并未开始接收连线,
- 只是设置 socket 为 listen 模式;
- accept:用来接受 socket 连接。
- connect: 该函数用于绑定之后的 client 端与服务器建立连接;
四、函数介绍
1、socket 函数(套接字)
socket 的原意是“插座”,在计算机通信领域,Socket 被翻译
为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通
过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可
以向其他计算机发送数据。
基本语法:SOCKET socket(int af, int type, int protocol);参数说明:af:地址族,值包含 AF_INET(IPv4)、AF_INET6(IPv6 );type:数据传输方式/套接字类型,值包含 SOCK_STREAM(流格式套接字/面向连接的套接字)、SOCK_DGRAM(数据报套接字/无连接的套接字);protocol:传输协议,值包含 IPPROTO_TCP(TCP 传输协议)、IPPROTO_UDP(UDP 传输协议);
2、bind 函数(绑定数据对象)
将套接字与特定的IP地址和端口绑定起来,只有这样,流经该 IP
地址和端口的数据才能交给套接字处理。
基本语法:int bind(SOCKET sock, const struct sockaddr *addr,int addrlen);参数说明:
socket:服务器套接字对象;
addr:sockaddr 结构体变量的指针;
addrlen:为 addr 变量的大小;
3、listen 函数(监听)
让套接字进入被动监听状态。
基本语法:int listen(SOCKET socket,int backlog);参数说明:
socket:服务器套接字对象(进入监听状态);
backlog:请求队列的最大长度;
4、accept 函数(接收)
当套接字处于监听状态时,可以通过 accept() 函数来接收客户
端请求。accpet()函数返回一个新的套接字来和客户端通信.
基本语法:SOCKET accept(SOCKET sock, struct sockaddr *addr,int *addrlen);参数说明:
socket:服务器套接字对象;
addr:sockaddr_in 结构体变量;
addrlen: addr 的长度;
5、connect 函数(连接服务器)
将套接字与服务器端的 IP 地址和端口绑定起来建立连接。
基 本 语 法 :int connect(SOCKET sock, const struct sockaddr*servaddr, int addrlen));参数说明:
sock:客户端套接字对象;
servaaddr:sockaddr 结构体变量的指针;
addrlen:为 addr 变量的大小;
6、send 函数(数据发送)
专门的发送数据的函数。
基本语法:int send(SOCKET sock, const char *buf, int len, int flags);参数说明:
sock:要发送数据的套接字对象;
buf:要发送的数据的缓冲区地址;
len:为要发送的数据的字节数;
flags:为发送数据时的选项,参数值一般设置为 0 或 NULL;
7、recv 函数(数据接收)
专门的接收数据的函数。
基本语法:int recv(SOCKET sock, const char *buf, int len, int flags);
参数说明:
sock:要接收数据的套接字对象;
buf:要接收的数据的缓冲区地址;
len:为要接收的数据的字节数;
flags:为接收数据时的选项,参数值一般设置为 0 或 NULL;
8、sockaddr_in 结构体
struct sockaddr_in 结构体用来处理网络通信的地址。
基本语法:
struct sockaddr_in{sa_family_t sin_family; //地址族(Address Family),也就是地址类型
uint16_t sin_port; //16 位的端口号
struct in_addr sin_addr; //32 位 IP 地址
char sin_zero[8]; //不使用,一般用 0 填充
};
五、 服务器端通信
1、基本流程步骤
(1) 关联库及驱动
#include <winsock2.h>
/*1-加载驱动库*/
#pragma comment (lib, "ws2_32.lib") //加载 ws2_32.dll
(2) 初始化 DLL
/*2-初始化 DLL*/
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
(3) 创建 Socket(套接字)
/*3-创建套接字*/
SOCKET servSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
(4) 设置服务器端基本信息
/*4-设置服务端信息*/
SOCKADDR_IN saddr;
saddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//IP 地 址 ,
INADDR_ANY 值为任意地址即本地之地
saddr.sin_family = AF_INET; //协议类型
saddr.sin_port = htons(8080);//端口号
(5) 绑定在本地端口
/*5-绑定在本地端口*/
bind(servSock, (SOCKADDR *)&saddr, sizeof(SOCKADDR));
(6) 监听端口
/*
(6) 监听端口
/*6-监听端口,进入监听状态*/
listen(servSock, 20);
(7) 循环监听(阻塞式)
/*7-循环监听*/
int len = sizeof(SOCKADDR);
while(true){}
(8) 等待客户端连接
/*8-等待客户端连接,处于阻塞状态,直到有客户端连接。*/
SOCKADDR_IN caddr;
SOCKET clntSock = accept(servSock, (SOCKADDR*)&caddr, &len);
(9) 接收客户端消息
/*9-接收消息*/
char recvBuf[1000] = "";
recv(clntSock, recvBuf, 1000, 0);
printf("%s\n", recvBuf);
(10) 服务器端向客户端发消息
/*10-发送消息*/
char sendBuf[1000] = "";
sprintf(sendBuf, "服务器接收到你消息!");
send(clntSock, sendBuf, strlen(sendBuf) + 1, 0);
(11) 关服务器
/*11-关闭套接字*/
closesocket(clntSock);
closesocket(servSock);
(12) 退出服务器
/*12-终止 DLL 使用*/
WSACleanup();
代码实现
#include <stdio.h>
#include <winsock2.h>//1、加载驱动库
#pragma comment(lib,"ws2_32.lib") //加载 ws2_32.libddlint main()
{//2、初始化 DLLWSADATA wsaData;WSAStartup(MAKEWORD(2,2) ,&wsaData); //版本号2.2//3、创建Socket (套接字)//ipv4 面向连接的套接字 TCP协议SOCKET servSock = socket(AF_INET , SOCK_STREAM, IPPROTO_TCP);//4、设置服务器端基本信息SOCKADDR_IN saddr;//INADDR_ANY 为任意地址本地的saddr.sin_addr.S_un.S_addr = htons(INADDR_ANY); //IP地址saddr.sin_family = AF_INET; //ipv4协议类型saddr.sin_port = htons(8082); //端口号//5、绑定在本地端口bind(servSock, (SOCKADDR*)&saddr, sizeof(SOCKADDR));printf("服务器端启动成功!等待连接中!\n");//6、监听端口listen(servSock , 10);//7、循环监听int len = sizeof(SOCKADDR);//8、等待客户端连接//处于阻塞状态,直到有客户端连接SOCKADDR_IN caddr;SOCKET clntSock = accept(servSock, (SOCKADDR*)&caddr, &len);printf("客户端连接成功!\n");9、接收客户端消息char recvBuf[1000] = "";recv(clntSock, recvBuf, 1000, 0);printf("%s\n", recvBuf);//10、服务器端向客户端发消息char sendBuf[1000] = "";sprintf_s(sendBuf, "服务器接收到你信息!");send(clntSock, sendBuf, strlen(sendBuf) + 1, 0);//11、关闭服务器closesocket(clntSock);closesocket(servSock);//12、退出服务器WSACleanup();printf("服务器关闭!\n");return 0;
}
六、 客户端通信
1、基本流程步骤
(1) 关联库及驱动
#include <winsock2.h>
/*1-加载驱动库*/
#pragma comment (lib, "ws2_32.lib") //加载 ws2_32.dll
(2) 初始化 DLL
/*2-初始化 DLL*/
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
(3) 创建 Socket(套接字)
/*3-创建套接字*/
SOCKET servSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
(4) 设置服务器端基本信息
/*4-设置连接服务端信息*/
SOCKADDR_IN saddr;
saddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
saddr.sin_family = AF_INET;
saddr.sin_port = htons(8080);
(5) (8080)
/*5-发起连接请求*/
connect(sock, (SOCKADDR*)&saddr, sizeof(SOCKADDR));
(6) 向服务器端发送消息
/*6-发送消息*/
char sendBuf[1000] = "";
sprintf(sendBuf, "你好,我是小明!");
send(sock, sendBuf, strlen(sendBuf) + 1, 0);
(7) 接收服务器端推送的消息
/*7-接收消息*/
char recvBuf[1000] = "";
recv(sock, recvBuf, 1000, 0);
printf("消息内容:%s\n", recvBuf);
(8) 关闭客户端与服务器端通信
/*8-关闭套接字*/
//closesocket(sock);/*8-关闭套接字*/
(9) 退出客户端
/*9-终止 DLL 使用*/
//WSACleanup();
#include<stdio.h>
#include<winsock2.h>
#include <string.h>
//1、加载驱动库
#pragma comment(lib , "ws2_32.lib") //加载 ws2_32 dllint main()
{//2、初始化DLLWSADATA wsaData;WSAStartup(MAKEWORD(2,2) , &wsaData); //版本号//3、创建套接字//ipv4 模式 协议SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//4、设置连接服务端信息SOCKADDR_IN saddr;saddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");saddr.sin_family = AF_INET;saddr.sin_port = htons(8082);//5、发起连接请求bool flag = connect(sock, (SOCKADDR*)&saddr, sizeof(SOCKADDR));//printf("%d\n", flag);if (flag == 0){printf("客户端连接成功!");}else {printf("客户端连接失败!");}//6、向服务端发送消息char sendBuf[1000] = "";sprintf(sendBuf, "你好,我是老王!\n");send(sock, sendBuf, strlen(sendBuf) + 1, 0);//7、接收服务器端推送的消息char recvBuf[1000] = "";recv(sock, recvBuf, 1000, 0);printf("消息内容:%s\n", recvBuf);//8、关闭套按字closesocket(sock);//9、终止 DLL使用WSACleanup();printf("客户端关闭!\n");return 0;
}
C语言实现-----网络通信相关推荐
- java c语言 socket_网络通信 C语言 Socket TCP Select Server
前言 工作中遇到各种各样的网络通信.有MQTT和CoAP这样的物联网应用层协议,也有各种自定义的TCP或UDP协议.使用各种不同的计算机语言和框架开发网络通信,例如Java的Netty框架,C语言原始 ...
- java对象与c网络语言通信,JAVA与C语言的网络通信代码案例.pdf
java socket 与linux c 通信问题 97w211 : 2010-2-09 18:08 : 发表于 来源 科技复兴 如题,用java 做客户端,linux 的c 程序做服务器端.目前客户 ...
- 使用C(或C++)语言编写网络通信模拟程序
1.变量定义: (1)需要定义套接字类型变量,因为套接字存在于地址族中,可以将通过套接字通信的进程的公有特性综合在一起.套接字通常只与同一区域的套接字交换数据.Windows Sockets只支持AF ...
- 【自学Java】Java语言特点
Java语言特点 Java语言特点教程 简单性 Java 看起来的设计很像 c++ ,但是为了使语言小和容易熟悉,设计者们把 c++ 语言中的需要可用的特征都去掉了.Java 中没有指针.Java 能 ...
- 满足多语言环境的拼多多API接口调用销量/详情数据
在PHP.JAVA和C#环境下,API接口调用都可以使用对应语言的网络通信库实现.以下是各个语言常用的网络通信库: 1.PHP:curl库是PHP中使用最广泛的网络通信库之一,它支持HTTP/HTTP ...
- 基于Flutter+FaaS的业务框架思考与实践
来自:闲鱼技术 闲鱼将使用Flutter和FaaS来建设未来的技术开发体系,这是一项长期的规划,新的技术在现在看来犹如雾里看花,需要我们不断的思考,探索,实践才能渐渐描绘出它的轮廓.本文对此提供一种思 ...
- 计算机网络 网络设备命令 数据链路层解析
目录 计算机网络 计算机网络的功能 计算机网络发展阶段 网络标准 标准化组织 WAN和LAN 网络拓扑结构 网络通信参考模型 分层思想: 什么是协议? 协议数据单元(PDU) 网络设备命令行视图 交换 ...
- 计算机专业英语第2版郭涛翻译,计算机专业英语
计算机专业英语 作 者:郭涛 主编 出版时间:2007年01月 定 价:21.60 I S B N :9787560939209 所属分类: 大中专教材 > 研究生/本科/专科教材 & ...
- 计算机类毕业参考文献(java开发)
[1]袁伟华. Java线程池的研究与实现[J].电脑编程技巧与维护,2015,01:28-29. [2]李博,徐云杰,翁丹. 基于Java的汽车企业产能管理系统设计[J]. 汽车实用技术,2015, ...
最新文章
- 强化学习应用于组合优化问题
- 比特现金网络升级之争:1个CPU=1票
- JMJS系统总结系列----Jquery分页扩展库(五)
- Map .NET Concepts to the Lightning Platform——list,set,map
- web服务器配置(静态页面)
- 【lua学习】6.函数,闭包,错误处理
- 倍福(Beckhoff)嵌入式控制器PLC
- 通过init-connect + binlog 实现MySQL审计功能
- 机器学习基础--一些基本的概念
- C#.Net工作笔记019---葡萄城控件FlexGrid自定义风格_比如给某列设置某个颜色_该颜色不受选择行的影响
- 轻量级linux iso,antiX 17.2 发布,基于Debian的轻量级Linux发行版
- 一些数据链路层的题目
- [转载] python对列表单词排序_计算列表中单词的频率并按频率排序
- 神经网络用作分类器(附代码matlab)
- 2021期中考试总结
- 给大家推荐一本书:你只是看起来很努力
- 手把手逆向Playcanvas天空盒编码(一次乌龙的任务)
- 尚硅谷todolist案例
- 统计本段话的高频词汇——报错:KeyError
- UEFI-win10-EDK2搭建