文章目录

  • 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,连接服务器端,接收并打印服务器给
    的数据。

二、流程图:

三、核心函数包含:

  1. socket:创建一个 socket;
  2. bind:用于绑定 IP 地址和端口号到 socket;
  3. listen: 设置能处理的最大连接要求,listen()并未开始接收连线,
  4. 只是设置 socket 为 listen 模式;
  5. accept:用来接受 socket 连接。
  6. 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语言实现-----网络通信相关推荐

  1. java c语言 socket_网络通信 C语言 Socket TCP Select Server

    前言 工作中遇到各种各样的网络通信.有MQTT和CoAP这样的物联网应用层协议,也有各种自定义的TCP或UDP协议.使用各种不同的计算机语言和框架开发网络通信,例如Java的Netty框架,C语言原始 ...

  2. java对象与c网络语言通信,JAVA与C语言的网络通信代码案例.pdf

    java socket 与linux c 通信问题 97w211 : 2010-2-09 18:08 : 发表于 来源 科技复兴 如题,用java 做客户端,linux 的c 程序做服务器端.目前客户 ...

  3. 使用C(或C++)语言编写网络通信模拟程序

    1.变量定义: (1)需要定义套接字类型变量,因为套接字存在于地址族中,可以将通过套接字通信的进程的公有特性综合在一起.套接字通常只与同一区域的套接字交换数据.Windows Sockets只支持AF ...

  4. 【自学Java】Java语言特点

    Java语言特点 Java语言特点教程 简单性 Java 看起来的设计很像 c++ ,但是为了使语言小和容易熟悉,设计者们把 c++ 语言中的需要可用的特征都去掉了.Java 中没有指针.Java 能 ...

  5. 满足多语言环境的拼多多API接口调用销量/详情数据

    在PHP.JAVA和C#环境下,API接口调用都可以使用对应语言的网络通信库实现.以下是各个语言常用的网络通信库: 1.PHP:curl库是PHP中使用最广泛的网络通信库之一,它支持HTTP/HTTP ...

  6. 基于Flutter+FaaS的业务框架思考与实践

    来自:闲鱼技术 闲鱼将使用Flutter和FaaS来建设未来的技术开发体系,这是一项长期的规划,新的技术在现在看来犹如雾里看花,需要我们不断的思考,探索,实践才能渐渐描绘出它的轮廓.本文对此提供一种思 ...

  7. 计算机网络 网络设备命令 数据链路层解析

    目录 计算机网络 计算机网络的功能 计算机网络发展阶段 网络标准 标准化组织 WAN和LAN 网络拓扑结构 网络通信参考模型 分层思想: 什么是协议? 协议数据单元(PDU) 网络设备命令行视图 交换 ...

  8. 计算机专业英语第2版郭涛翻译,计算机专业英语

    计算机专业英语 作 者:郭涛 主编 出版时间:2007年01月 定 价:21.60 I S B N :9787560939209 所属分类: 大中专教材  >  研究生/本科/专科教材 & ...

  9. 计算机类毕业参考文献(java开发)

    [1]袁伟华. Java线程池的研究与实现[J].电脑编程技巧与维护,2015,01:28-29. [2]李博,徐云杰,翁丹. 基于Java的汽车企业产能管理系统设计[J]. 汽车实用技术,2015, ...

最新文章

  1. 强化学习应用于组合优化问题
  2. 比特现金网络升级之争:1个CPU=1票
  3. JMJS系统总结系列----Jquery分页扩展库(五)
  4. Map .NET Concepts to the Lightning Platform——list,set,map
  5. web服务器配置(静态页面)
  6. 【lua学习】6.函数,闭包,错误处理
  7. 倍福(Beckhoff)嵌入式控制器PLC
  8. 通过init-connect + binlog 实现MySQL审计功能
  9. 机器学习基础--一些基本的概念
  10. C#.Net工作笔记019---葡萄城控件FlexGrid自定义风格_比如给某列设置某个颜色_该颜色不受选择行的影响
  11. 轻量级linux iso,antiX 17.2 发布,基于Debian的轻量级Linux发行版
  12. 一些数据链路层的题目
  13. [转载] python对列表单词排序_计算列表中单词的频率并按频率排序
  14. 神经网络用作分类器(附代码matlab)
  15. 2021期中考试总结
  16. 给大家推荐一本书:你只是看起来很努力
  17. 手把手逆向Playcanvas天空盒编码(一次乌龙的任务)
  18. 尚硅谷todolist案例
  19. 统计本段话的高频词汇——报错:KeyError
  20. UEFI-win10-EDK2搭建

热门文章

  1. 创业开始_我的锦誉德工作室成立
  2. Centos7 Mondo 制作系统iso镜像文件
  3. KVM 虚拟化管理平台 VManagePlatform
  4. 什么技术和应用赚钱?
  5. 用html做一个拍拍网界面视频,html制作网页必做入门练习题一教程文件.ppt
  6. 什么是REST-ful,以及REST-ful的实现
  7. 采用H5多屏直播时,H.264和H.265视频流混合播放导致的卡顿问题解析
  8. starrocks部署准备
  9. 关于生产者消费者模式的C#实现
  10. springcloud熔断机制