在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例C/C++网络编程 → TCP并发服务器(server3.cpp)

TCP并发服务器(server3.cpp)

C/C++网络编程

下载此实例
  • 开发语言:C/C++
  • 实例大小:6.77KB
  • 下载次数:18
  • 浏览次数:175
  • 发布时间:2020-11-03
  • 实例类别:C/C++网络编程
  • 发 布 人:rootying
  • 文件格式:.cpp
  • 所需积分:2
 相关标签: 服务器 tcp 并发 服务

实例介绍

【实例简介】

实现并发服务器,将图2、图3和图4的服务器任选一个改造为并发服务器。要求并发服务器的实现采用创建线程或子进程的方式实现。

主线程/主进程:

创建套接字并将其绑定到服务器所使用的熟知地址上。

重复调用accept接收客户端的请求,并且创建子线程/子进程处理响应。

子线程/子进程:

与客户端进行交互:接收请求并发回应答;

关闭连接并退出。子线程/子进程在处理完来自一个客户端的所有请求后退出。


【实例截图】


【核心代码】

int recvn(SOCKET s, char* recvbuf, unsigned int fixedlen)
{
int iResult;    //存储单次recv操作的返回值
int cnt;         //用于统计相对于固定长度,剩余多少字节尚未接收
cnt = fixedlen;
while (cnt > 0) {
iResult = recv(s, recvbuf, cnt, 0);
if (iResult < 0) {
//数据接收出现错误,返回失败
printf("接收发生错误: %d\n", WSAGetLastError());
return -1;
}
if (iResult == 0) {
//对方关闭连接,返回已接收到的小于fixedlen的字节数
printf("连接关闭\n");
return fixedlen - cnt;
}
//printf("接收到的字节数: %d\n", iResult);
//接收缓存指针向后移动
recvbuf = iResult;
//更新cnt值
cnt -= iResult;
}
return fixedlen;
}


int recvvl(SOCKET s, char* recvbuf, unsigned int recvbuflen)
{
int iResult;//存储单次recvn操作的返回值
unsigned int reclen; //用于存储报文头部存储的长度信息
//获取接收报文长度信息
iResult = recvn(s, (char*)&reclen, sizeof(unsigned int));
if (iResult != sizeof(unsigned int))
{
//如果长度字段在接收时没有返回一个整型数据就返回(连接关闭)或-1(发生错误)
if (iResult == -1) {
printf("接收发生错误: %d\n", WSAGetLastError());
return -1;
}
else {
printf("连接关闭\n");
return 0;
}
}
//转换网络字节顺序到主机字节顺序
reclen = ntohl(reclen);
if (reclen > recvbuflen)
{
printf("reclen>recvbuflen: %d>%d\n", reclen, recvbuflen);
//如果recvbuf没有足够的空间存储变长消息,则接收该消息并丢弃,返回错误
while (reclen > 0) {
iResult = recvn(s, recvbuf, recvbuflen);
if (iResult != recvbuflen) {
//如果变长消息在接收时没有返回足够的数据就返回(连接关闭)或-1(发生错误)
if (iResult == -1) {
printf("接收发生错误: %d\n", WSAGetLastError());
return -1;
}
else {
printf("连接关闭\n");
return 0;
}
}
reclen -= recvbuflen;
//处理最后一段数据长度
if (reclen < recvbuflen)
recvbuflen = reclen;
}
printf("可变长度的消息超出预分配的接收缓存\r\n");
return -1;
}
//接收可变长消息
iResult = recvn(s, recvbuf, reclen);
if (iResult != reclen)
{
//如果消息在接收时没有返回足够的数据就返回(连接关闭)或-1(发生错误)
if (iResult == -1) {
printf("接收发生错误: %d\n", WSAGetLastError());
return -1;
}
else {
printf("连接关闭\n");
return 0;
}
}
return iResult;
}

实例下载地址

TCP并发服务器(server3.cpp)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警