基本信息
源码名称:TCP并发服务器(server3.cpp)
源码大小:6.77KB
文件格式:.cpp
开发语言:C/C++
更新时间:2020-11-03
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

实现并发服务器,将图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;
}