TCP网络通信服务器端简单示例

2024-09-07 08:08

本文主要是介绍TCP网络通信服务器端简单示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

服务器端:

#include <stdio.h>
#include <winsock2.h> //和网络通信相关的函数的声明,类型的声明,常量的定义等都在此头文件中

#pragma comment(lib,"ws2_32.lib")

int main()
{
//第一步:初始化Socket函数库
WSADATA wsaData;
//向系统请求使用2.2版本的Socket函数库,wsaData用于接收winsocket详细信息
WSAStartup(MAKEWORD(2,2),&wsaData); 


//第二步:创建流式套接字,相当于买部手机
//AF_INET:使用英特网地址家族,即TCP/IP协议族
//三种常用的套接字类型:
//流(式)套接字:SOCK_STREAM ,用于实现基于TCP协议的通信,数据的传输采用字节流的方式传输
//数据报套接字:SOCK_DATAGRAM, 用于实现基于UDP协议的通信,数据采用数据报的方式传输
//原始套接字:SOCK_RAW, 用于实现基于IP协议的通信,较底层的通信,用的较少,一般用于实现抓包等网络嗅探功能
//0:默认协议编号,
SOCKET sockListen=socket(AF_INET,SOCK_STREAM,0);

if(INVALID_SOCKET == sockListen)
{
printf("创建监听套接字失败!\n");
return 1;
}

//第三步:绑定地址,相当于给手机上号
//通过socketaddr_in结构体指定要绑定的地址,相当于选号
sockaddr_in myaddr;
myaddr.sin_family=AF_INET;
myaddr.sin_addr.S_un.S_addr=INADDR_ANY; //指定IP地址为本机当前的任意IP地址
//myaddr.sin_addr.s_addr=INADDR_ANY; //指定IP地址为本机当前的任意IP地址
//myaddr.sin_addr.s_addr=inet_addr("128.0.37.13"); //指定IP地址为当前本机的某个IP地址
myaddr.sin_port = htons(8888); //指定端口号为8888

//绑定地址,相当于将SIM卡插入手机中
if(SOCKET_ERROR==bind(sockListen,(sockaddr*)&myaddr,sizeof(myaddr)))
{
printf("绑定地址失败!\n"); //端口号可能被其他进程所占用
return 1;
}


//第四步:监听,即将套接字设置为监听状态,相当于将手机待机
//5:监听等待队列的长度为5
listen(sockListen,5);

while(1)
{
//第五步:接收客户端连接请求,相当于接听别人的来电
//accept函数返回的套接字称为连接套接字,用于实现在一条连接上的通信
sockaddr_in addrClient;
int iAddrLen=sizeof(addrClient);
SOCKET sockConn=accept(sockListen,(sockaddr*)&addrClient,&iAddrLen);

printf("客户%s:%d已经连接!\n",inet_ntoa(addrClient.sin_addr),ntohs(addrClient.sin_port));

//第六步:收发数据,相当于互相说话
//发送数据
char szMsg[1024]="hello";
scanf("%s",szMsg);
send(sockConn,szMsg,strlen(szMsg),0);

//接收数据
memset(szMsg,0,sizeof(szMsg));
if(SOCKET_ERROR ==recv(sockConn,szMsg,sizeof(szMsg)-1,0))
{
printf("failed!\n");
}
printf("客户端说:%s\n",szMsg);

//第七步:关闭连接套接字,断开连接,相当于通话完毕挂机
closesocket(sockConn);
}

//如果不需要再接收客户端连接请求,可以关闭监听套接字,相当于将手机关机或设置为飞行模式
closesocket(sockListen);

//第八步:释放Socket函数库
WSACleanup();

return 0;
}

这篇关于TCP网络通信服务器端简单示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144530

相关文章

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

HTML5 data-*自定义数据属性的示例代码

《HTML5data-*自定义数据属性的示例代码》HTML5的自定义数据属性(data-*)提供了一种标准化的方法在HTML元素上存储额外信息,可以通过JavaScript访问、修改和在CSS中使用... 目录引言基本概念使用自定义数据属性1. 在 html 中定义2. 通过 JavaScript 访问3.

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值

MyBatis与其使用方法示例详解

《MyBatis与其使用方法示例详解》MyBatis是一个支持自定义SQL的持久层框架,通过XML文件实现SQL配置和数据映射,简化了JDBC代码的编写,本文给大家介绍MyBatis与其使用方法讲解,... 目录ORM缺优分析MyBATisMyBatis的工作流程MyBatis的基本使用环境准备MyBati

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对