《零基础看得懂的C语言入门教程 》——(十三)socket服务端编写

一、学习目标

  1. 了解C语言的socket的概念
  2. 了解C语言socket的使用方法
  3. 完成C语言socket服务端

目录

C语言真的很难吗?那是你没看这张图,化整为零轻松学习C语言。

第一篇:(一)脱离学习误区
第二篇:(二)C语言没那么难简单开发带你了解流程
第三篇:(三)轻轻松松理解第一个C语言程序
第四篇:(四)语言的基本数据类型及变量
第五篇:(五)C语言的变量、常量及运算
第六篇:(六)轻轻松松了解C语言的逻辑运算
第七篇:(七)C语言的循环分分钟上手
第八篇:(八)了解基本数组还不是那么简单
第九篇:(九)C语言二维数组与循环嵌套
第十篇:(十)C语言的指针原来是这样
第十一篇:(十一)C语言自定义函数真的很简单
第十二篇:(十二)原来结构体是这么回事
第十三篇:(十三)socket服务端编写

C语言新手的100个报错解法

推荐

欢迎大家关注公众号,公众号每满1024及1024倍数则会抽奖赠送机械键盘一份+IT书籍2份哟~
在这里插入图片描述

二、了解socket 套接字的使用方法

打个预防针:听不懂概念也会用的,现在不理解以后肯定会理解。若读者是通过我的基础教程开始学到这一篇,我个人建议尽量多熟悉其中知识点再学习socket,socket设计别的知识内容,并且要熟悉基础语法和特性,不然会导致一些问题。若确实学习了有什么问题可以加群问我~

socket也叫做套接字,是在计算机网络中,不同主机监听与发送小心的端点,这个端点是抽象的概念,跟所有不在物理上存在的设计一样,是一中规则下诞生的存在。

2.1 使用socket

以下代码是在网络上找到的代码,自己进行了部分修改。(懒的写了,哈哈哈)这篇内容只注重使用流程,偏向应用,过多的理论知识不再强调。对于新手学习socket我个人建议是先知道如何“掉包”,先做一个“掉包侠”完成了整个流程后才更好的理解其中的问题,而且对于新手来说,一些额外的扩展知识并不是每一个新手都知道的,如果真的需要讲解socket的通信,会设计很多网络层方面的内容,所以我们就先学会如何使用socket,之后再来对这些知识进行梳理。

由于socket的实践内容对于一部分新手步骤过于繁琐,在此则分为上下两片,一篇为服务端,一篇为客户端进行通信,相比各位学习了服务端后再次查看客户端代码会觉得眼前一亮,socket就是用起来麻烦而已嘛~祝各位码运昌隆!

socket是基于TCP/IP的,想必一部分的同学可能对TCP/IP有所耳熟。确实TCP/IP字样在我们学习编程时很常见,他是一种协议,而协议是什么呢?协议是指我们在做某一件事情的时候,我们规定一些细则、标准,方便交流通信,而TCP/IP是协议的一种,再次我们只需要socket是基于TCP/IP协议即可,因为在当前教程中,谈论协议可能对于某一部分读者会有阅读上的障碍,这是很正常的。其实我们在不了解TCP/IP协议的情况下也能进行socket通信,因为我们使用的socket函数是基于TCP/IP的,意思是说我们只需要知道socket如何使用即可。

编写C语言Windows下的socket需要经过几个步骤,首先对WSAStartup 进行初始化,初始化对socket 套接字进行创建,随后配合绑定信息,接着进行配置信息的bind 绑定;绑定了信息后,通过该信息进行isten 监听,监听后若有链接则connect 连接,再接下来开始使用accept 接收请求,得到请求后可以选择接受recv或者send发送数据,最后closesocket 关闭 socket,WSACleanup 最终关闭。

2.2 WSAStartup 初始化

首先对WSAStartup 进行初始化,WSAStartup 方法接收2个参数,1个是WinSock2 的版本号,另一个是WSADATA 的指针。那么我们需要先创建一个WSADATA 类型的对象,代码为:

WSADATA wsaData;

WSADATA 结构用于存储 WSAStartup 初始化后返回的信息,该信息由于使用的是指针,换句话说是传址,那么所存储的信息将会保存在WSAStartup 初始化后。

WSAStartup 接收的第一个参数为版本号,版本号直接可以使用MAKEWORD 生成,MAKEWORD(1, 1)表示选择版本号为1。那么WSAStartup 初始化代码可以写成:

WSAStartup(MAKEWORD(1, 1), &wsaData)

由于WSAStartup等于0则表示初始化失败,初始化失败则退出程序,我们可以写成:

WSADATA wsaData;
if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
{return 0;
}

2.3 socket创建

socket的创建使用socket方法,socket接收3个参数,分别是IP类型、通信类型、以及最后一个参数可以通过之前传递的参数使用默认类型的配合。IP类型通常使用PF_INET 表示IPV4,通信类型使用TCP,最后一个参数使用0表示通过之前设置的IP类型与通信类型完成匹配的默认选项,代码为:

SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

创建完毕后,判断socket是否创建成功,不成功返回-1:

if (slisten == -1){printf("socket error !");return 0;}

2.4 IP绑定

接下来开始绑定监听的IP地址。创建sockaddr_in结构体变量。

struct sockaddr_in sin;

随后开始绑定端口、IP类型,其中INADDR_ANY表示本机、6666表示监听端口:

sin.sin_family = AF_INET;
sin.sin_port = htons(8888);
sin.sin_addr.S_un.S_addr = INADDR_ANY;

随后使用bind进行绑定;bind接收3个参数,一个是创建的socket、一个是绑定的IP信息、一个是IP信息的长度,绑定失败则返回-1,代码为:

struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(8888);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{printf("bind error !");return 0;
}

随后使用listen进行监听,listen接收2个值,一个是socket、一个是队列数量写个10就ok了。代码为:

if (listen(slisten, 5) == SOCKET_ERROR)
{printf("listen error !");return 0;
}

2.5 信息接收

accept 接收3个参数,第一个为socket、第二个为 sockaddr变量的指针的指针、第三个为接收sockaddr的长度。代码为:

struct sockaddr_in remoteAddr;
int nAddrlen = sizeof(remoteAddr);
sClient = accept(s, (SOCKADDR *)&remoteAddr, &nAddrlen);

使用accpet后将会进行等待,直到有链接才会执行之后的代码。
随后使用recv接收客户端发送过来的文本信息。recv接收4个参数,第一个是建立的通信、随后是一个数组,接收数据存放的地方、之后会缓存大小,最后一个参数一般设置为0即可。代码为:

char revData[255];
int ret = recv(sClient, revData, 255, 0);
printf(revData);

以上recv函数中,sClient为使用accpet建立的通信,revData为接收信息的缓存区、255为长度。

随后发送一个数据给客户端,用户响应客户端的信息请求。使用send可以往已经建立的通信通道发送数据,send函数接收4个参数,第一个为已经建立的通信、第二个位需要发送的数据、第三个为发送的数据长度、最后一个一般设置为0。代码为:

char * sendData = "你好鸭,我是CSDN 1_bit ,ID是A757291228~\n";
send(sClient, sendData, strlen(sendData), 0);

以上recv函数中,sClient为使用accpet建立的通信,sendData为需要发送的数据、255为长度。
最后调用方法关闭建立的通信即可:

closesocket(sClient);
closesocket(slisten);
WSACleanup();

由于是一次性的通信,程序运行完后则会关闭,在此我们在代码return0前添加停止命令:

system("pause");

所有的依赖引用头文件如下:

#include <winsock2.h>
#include <windows.h>
#include<stdio.h>
#include<stdlib.h>

完整代码如下:

#include <winsock2.h>
#include <windows.h>
#include<stdio.h>
#include<stdlib.h>int main(int argc, char* argv[])
{//初始化WSADATA WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){return 0;}//创建scoketSOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (slisten == -1){printf("socket error !");return 0;}//绑定端口ip信息struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(8888);sin.sin_addr.S_un.S_addr = INADDR_ANY;if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR){printf("bind error !");return 0;}//监听失败则返回if (listen(slisten, 5) == SOCKET_ERROR){printf("listen error !");return 0;}SOCKET sClient;struct sockaddr_in remoteAddr;int nAddrlen = sizeof(remoteAddr);sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);char revData[255];int ret = recv(sClient, revData, 255, 0);printf(revData);//发送信息char * sendData = "你好鸭,我是CSDN 1_bit ,ID是A757291228~\n";send(sClient, sendData, strlen(sendData), 0);closesocket(sClient);closesocket(slisten);WSACleanup();system("pause");return 0;
}

若使用devc复制代码都报错,则点击编译->编译选项:
在这里插入图片描述
随后在出现的窗口中添加如下参数:
在这里插入图片描述

总结

1.了解了C语言socket基本编写流程
2.了解了编写C语言Windows下的socket需要经过几个步骤,首先对WSAStartup 进行初始化,初始化对socket 套接字进行创建,随后配合绑定信息,接着进行配置信息的bind 绑定;绑定了信息后,通过该信息进行isten 监听,监听后若有链接则connect 连接,再接下来开始使用accept 接收请求,得到请求后可以选择接受recv或者send发送数据,最后closesocket 关闭 socket,WSACleanup 最终关闭。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

古董来了:1999年的物件,香港已经回归了,我都上初中了,那么你出生了吗?

受疫情的影响&#xff0c;哪都去不了&#xff0c;只能在家憋着&#xff08;为社会做贡献&#xff09;这种状态已经持续了将近两个月了。无聊至极的我&#xff0c;一天无所事事&#xff0c;只能是在家这儿瞅瞅&#xff0c;那儿看看&#xff0c;用一句诗经里面的话来形容我最合适…

.NET性能优化-为结构体数组使用StructLinq

前言本系列的主要目的是告诉大家在遇到性能问题时&#xff0c;有哪些方案可以去优化&#xff1b;并不是要求大家一开始就使用这些方案来提升性能。在之前几篇文章中&#xff0c;有很多网友就有一些非此即彼的观念&#xff0c;在实际中&#xff0c;处处都是开发效率和性能之间取…

《假如编程是魔法之零基础看得懂的Python入门教程 》——(七)我把魔法变成了积木

学习目标 了解魔法积木的使用——自定义函数了解魔法积木的结果反馈——自定义函数返回值了解魔法积木的原料传递——自定义函数传参了解魔法积木的类型分类——类与对象 推荐 1.《备受好评的看得懂的C语言入门教程》 目录 第一篇&#xff1a;《假如编程是魔法之零基础看得…

关于Activity的getReferrer():如何在Activity中获取调用者?

http://blog.csdn.net/u013553529/article/details/53856800 关于Activity的getReferrer()之一&#xff1a;如何在Activity中获取调用者&#xff1f; http://blog.csdn.net/u013553529/article/details/53882440 关于Activity的getReferrer()之二&#xff1a;调用者的包名是如何…

【遥感数字图像处理】实验:Erdas 软件的认识与使用

Erdas软件下载地址:《GISer福音来了:测绘地理信息类专业软件版本大全汇总下载!》 1.1 简介 ERDAS IMAGINE 是美国 ERDAS(Earth Resource Data Analysis System)公司开发的遥感图像处理系统,它以其先进的图像处理技术,友好、灵活的用户界面和操作方式,面向广阔应用领域…

import 别名_Python基础找茬系列09--import和from-import的引用区别

一、语法区别二、两种导包在内存上的区别一图看懂import与from-import的区别无论是使用import隐式导包还是form-import显示导包&#xff0c;整个模块都会被加载到内存中例如&#xff1a;from test import b,整个模块依旧进入内存&#xff0c;因为如果只有函数b进入内存&#xf…

设计一个限速器

限速器 (Rate Limiter) 相信大家都不会陌生&#xff0c;在网络系统中&#xff0c;限速器可以控制客户端发送流量的速度&#xff0c;比如 TCP, QUIC 等协议。而在 HTTP 的世界中&#xff0c; 限速器可以限制客户端在一段时间内发送请求的次数&#xff0c;如果超过设定的阈值&…

C语言新手的100个报错解法 已更新11个错误

学习目标 收藏文章报错可以过来查 [更新数据] 此文将会持续更新&#xff0c;收录错误信息&#xff0c;若本文没有收录记得联系我~ CSDN 1_bit 持续更新中… [发布日期&#xff1a;2020年11月16日 14:55:00] 更新&#xff1a; 暂无 C语言教程 C语言真的很难吗&#xff1f;那…

【遥感数字图像处理】实验:遥感图像显示与数据输入/输出(Erdas版)

一、实验平台&#xff1a;Erdas 9.1 二、实验内容&#xff1a;视窗功能简介、图形和图像显示操作、实用菜单操作、显示操作、AOI菜单操作、矢量和栅格菜单、数据的输入输出等。 三、实验目的&#xff1a;初步了解Erdas的主要功能模块&#xff0c;在此基础上&#xff0c;掌握视…

在Windows Server2016中安装SQL Server2016(转)

在Windows Server2016中安装SQL Server2016&#xff08;转&#xff09; 转自&#xff1a; http://blog.csdn.net/yenange/article/details/52980135 参考&#xff1a; SQL Server2016企业版 附全版本key - moonpure的专栏 - CSDN博客 http://blog.csdn.net/moonpure/article/d…

Unity3D 之UGUI 滑动条(Slider)

这里来讲解下UGUI 滑动条(Slider)的用法 控件下面有三个游戏对象 Background -->背景 Fill Area --> 前景区域 Handle Slide Area --> 滑动条 Slider的属性 其他几个设置和其他控件都差不多&#xff0c;这里来讲解几个特有的属性。 Direction -->方向 Whole Number…

C语言真的很难吗?那是你没看这张图,化整为零轻松学习C语言。

真不难 C语言难不难&#xff1f;这个问题是相对的&#xff0c;对于找到合适方法学习C语言的同学想必是觉得很简单&#xff1b;但对于一部分同学来说&#xff0c;没有众观全局就会误以为刚入门就需要学习庞大的知识&#xff0c;学着学着开始看不懂&#xff0c;由于心理作怪&…

【中间件】.net Core中使用HttpReports进行接口统计,分析, 可视化, 监控,追踪等...

HttpReports 基于.Net Core 开发的APM监控系统&#xff0c;使用MIT开源协议&#xff0c;主要功能包括&#xff0c;统计, 分析, 可视化&#xff0c; 监控&#xff0c;追踪等&#xff0c;适合在微服务环境中使用。官方地址&#xff1a;https://www.yuque.com/httpreports/docs/u…

【遥感数字图像处理】实验:遥感影像辐射纠正(大气纠正)完整操作图文教程(Erdas版)

一、实验平台:Erdas 9.1 二、实验数据:dmtm.img 三、实验内容:利用回归分析法校正影像 四、实验原理:大气散射只影响短波波段,长短波进行对比,找出影响短波的程辐射值,将其减去 五、实验目的:掌握回归分析法校正影像的方法及步骤,能熟练地对影像进行校正 六、实…

Acitivty生命周期

为什么80%的码农都做不了架构师&#xff1f;>>> Acitivty 有七个生命周期&#xff1a; onCreate&#xff1a;当第一次调用一个Activity就会执行onCreate方法 onStart&#xff1a;当Activity处于可见状态的时候就会调用onStart方法 onResume&#xff1a;当Activity可…

还不懂你现在学习的编程语言能做什么?还不懂如何进阶?过来看图

前言说七说八 本篇文章的配图标注、内容并不代表仅有&#xff1b;本篇仅以个人经验及当前大学&#xff08;大专、本科&#xff09;相关课程作对比&#xff0c;列出比较常规的语言发展走向及相关技术&#xff1b;再次重申&#xff0c;本图及本文所涉及的技术发展走向并不代表着…

【遥感数字图像处理】实验:遥感影像几何纠正完整操作流程(Erdas版)

☆☆☆ 几何纠正预备知识 ☆☆☆ 1、几何变形误差的影响因素 遥感器本身引起的畸变外部因素引起的畸变处理过程中引起的畸变2、需要做精纠正的情况 景与景之间作比较GIS建模之前监督分类时提取样本创建高精度比例尺的影像地图与矢量数据叠加源于不同比例尺的地图之间比较提取精…

openid 钉钉_钉钉开发入门,微应用识别用户身份,获取用户免登授权码code,获取用户userid,获取用户详细信息...

最近有个需求,在钉钉内,点击微应用,获取用户身份,根据获取到的用户身份去企业内部的用户中心做校验,校验通过,相关子系统直接登陆;就是在获取这个用户身份的时候,网上的资料七零八落的,找的人烦躁的很,所以自己记录一下;实现这个要求,有好几种方式,使用ISV方式相对来说比较简单…

趣味二维码生成

1背景介绍 最近在 Github 看到了一个有趣的项目 amazing-qr&#xff0c;它支持生成普通二维码&#xff0c;带图片的艺术二维码&#xff0c;动态二维码。项目是用 python 编写的&#xff0c;以命令行的方式运行生成&#xff0c;不太方便调用&#xff0c;因此&#xff0c;我…

《零基础看得懂的C++入门教程 》——(1)第一个C++程序就让你知其所以然

一、学习目标 了解第一个C程序了解第一个C程序结构了解什么是注释了解什么是命名空间了解C语言的输出&#xff08;如何在程序运行时显示内容&#xff09;了解语句结束后需要使用什么符号表示结束 了解程序入口 目录 预备第一篇&#xff0c;使用软件介绍在这一篇&#xff0c;…