//////////////////////////////////////////////////////////////////////////
// BlockModeSrv.cpp
// 阻塞模式 — 服务端实现
// by Koma 2009-09-19 00:12
#include <iostream.h>
#include <winsock2.h>
#pragma comment(lib,"wsock32.lib")
#define SERVER_EXIT_OK 0 // 服务器正常退出
#define SERVER_DLL_ERROR 1 // 调用DLL失败
#define SERVER_API_ERROR 2 // 调用API失败
#define SERVERPORT 5555// 服务器端口
#define MAX_NUM_BUF 64 // 缓冲区最大值
char bufRecv[MAX_NUM_BUF]; // 接受数据
char bufSend[MAX_NUM_BUF]; // 发送数据
SOCKET sServer; // 服务器套接字
SOCKET sClient; // 客户端套接字
BOOL bConning; // 与客户端连接状态
void InitMember(); // 初始化函数
void ShowSocketMsg(char *str); // 显示错误信息
int ExitClient(int nExit); // 客户端结束连接
int HandleSocketError(char *str); // 调用API错误信息
BOOL RecvLine(SOCKET s, char* buf); // 接受数据
BOOL SendLine(SOCKET s, char* buf); // 发送数据
/************************************************************************/
/* 函数作用:程序入口main函数
/* 参数说明:无
/* 返 回 值:客户端退出代码
/* 备 注:
/************************************************************************/
int main(void)
{
InitMember(); // 初始化全局变量
WSADATA wsa; // Sockets DLL版本信息
int nRetVal;// 调用Sockets API返回值
// 初始化套接字
nRetVal = WSAStartup(MAKEWORD(1,1),&wsa);
if(0 != nRetVal)
{
ShowSocketMsg("无法找到Windows套接字核心Dll!");
return SERVER_DLL_ERROR;
}
// 判断是否支持1.1
if(LOBYTE(wsa.wVersion) != 1 || HIBYTE(wsa.wVersion) != 1)
{
ShowSocketMsg("无法找到Windows套接字核心Dll!");
return SERVER_DLL_ERROR;
}
// 创建套接字
sServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET == sServer)
{
return HandleSocketError("创建套接字失败!");
}
// 设置服务器选项
SOCKADDR_IN addrServ;
addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(SERVERPORT);
addrServ.sin_addr.S_un.S_addr = INADDR_ANY;
// 绑定套接字
nRetVal = bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN));
if(SOCKET_ERROR == nRetVal)
{
closesocket(sServer);
return HandleSocketError("绑定套接字失败!");
}
// 开始监听
nRetVal = listen(sServer,1);
if(SOCKET_ERROR == nRetVal)
{
closesocket(sServer);
return HandleSocketError("监听失败!");
}
// 等待客户端的连接
cout<<"服务器创建成功!"<<endl;
cout<<"正在等待客户端请求..."<<endl;
SOCKADDR_IN addrClient;
int addrClientLen;
// 接受客户端请求
addrClientLen = sizeof(addrClient);
sClient = accept(sServer,(sockaddr FAR*)&addrClient,&addrClientLen);
if(INVALID_SOCKET == sClient)
{
closesocket(sServer);
return HandleSocketError("连接失败!");
} else {
bConning = TRUE;
}
// 显示客户端的IP地址与端口
char *pClientIP = inet_ntoa(addrClient.sin_addr);
u_short clientPort = ntohs(addrClient.sin_port);
cout<<"已检测到连接一个客户端:"<<endl;
cout<<"IP地址:"<<pClientIP<<" 端口:"<<clientPort<<endl;
// 接受客户端数据
if(!RecvLine(sClient,bufRecv))
{
return ExitClient(SERVER_API_ERROR);
}
cout<<bufRecv<<endl;
// 向客户端发送数据
strcpy(bufSend,"Hello World !\n");
if(!SendLine(sClient,bufSend))
{
return ExitClient(SERVER_API_ERROR);
}
// 显示退出信息
cout<<"服务器退出..."<<endl;
// 程序退出
return ExitClient(SERVER_EXIT_OK);
}
/************************************************************************/
/* 函数作用:初始化各全局变量
/* 参数说明:无
/* 返 回 值:无
/* 备 注:
/************************************************************************/
void InitMember()
{
memset(bufRecv,0,MAX_NUM_BUF);
memset(bufSend,0,MAX_NUM_BUF);
sServer = INVALID_SOCKET;
sClient = INVALID_SOCKET;
bConning = FALSE;
}
/************************************************************************/
/* 函数作用:显示错误信息
/* 参数说明:错误信息
/* 返 回 值:无
/* 备 注:
/************************************************************************/
void ShowSocketMsg(char *str)
{
MessageBox(NULL,str,"Server Error",MB_OK);
}
/************************************************************************/
/* 函数作用:客户端结束连接
/* 参数说明:错误代码
/* 返 回 值:将参数作为返回值
/* 备 注:
/************************************************************************/
int ExitClient(int nExit)
{
closesocket(sServer); // 关闭监听套接字
closesocket(sClient); // 关闭连接客户端套接字
WSACleanup(); // 卸载Sockets Dll
return nExit; // 退出代码
}
/************************************************************************/
/* 函数作用:调用API错误信息
/* 参数说明:错误信息字符串
/* 返 回 值:SERVER_API_ERROR
/* 备 注:
/************************************************************************/
int HandleSocketError(char *str)
{
ShowSocketMsg(str); // 显示错误信息
WSACleanup(); // 卸载Sockets Dll
return SERVER_API_ERROR;// 退出应用程序
}
/************************************************************************/
/* 函数作用:接受数据
/* 参数说明:接收套接字、接收内容
/* 返 回 值:成功返回TRUE,失败返回FALSE
/* 备 注:
/************************************************************************/
BOOL RecvLine(SOCKET s, char* buf)
{
BOOL bnRetVal = TRUE; // 返回值
BOOL bLineEnd = FALSE; // 行结束
int nReadLen = 0; // 读入字节数
int nDataLen = 0; // 数据长度
while(!bLineEnd && bConning)
{
nReadLen = recv(s,buf + nDataLen,1,0); // 每次接收一个字节
if(SOCKET_ERROR == nReadLen)
{
int nErrCode = WSAGetLastError(); // 获取错误代码
if(WSAENOTCONN == nErrCode)
{
ShowSocketMsg("套接字没有连接!");
} else if(WSAESHUTDOWN == nErrCode)
{
ShowSocketMsg("套接字已经关闭!");
} else if(WSAETIMEDOUT == nErrCode)
{
ShowSocketMsg("请求超时,主机没有反应!");
} else if(WSAECONNRESET == nErrCode)
{
ShowSocketMsg("远程主机强迫关闭了现有的连接!");
} else {}
bnRetVal = FALSE; // 读取数据失败
break; // 跳出循环
}
if(0 == nReadLen) // 客户端关闭
{
bnRetVal = FALSE; // 读取数据失败
break; // 跳出循环
}
// 读入数据,检测是否输入换行符
if('\n' == *(buf + nDataLen))
{
bLineEnd = TRUE; // 接收数据结束
} else{ // 继续读入数据
nDataLen += nReadLen;
}
}
return bnRetVal;
}
/************************************************************************/
/* 函数作用:发送数据
/* 参数说明:发送套接字、发送内容
/* 返 回 值:成功返回TRUE,失败返回FALSE
/* 备 注:
/************************************************************************/
BOOL SendLine(SOCKET s, char* buf)
{
int nnRetVal; // 返回值
nnRetVal = send(s,buf,strlen(buf),0); // 发送数据
if(SOCKET_ERROR == nnRetVal) // 错误处理
{
int nErrCode = WSAGetLastError(); // 获取错误代码
if(WSAENOTCONN == nErrCode)
{
ShowSocketMsg("套接字没有连接!");
} else if(WSAESHUTDOWN == nErrCode)
{
ShowSocketMsg("套接字已经关闭!");
} else if(WSAETIMEDOUT == nErrCode)
{
ShowSocketMsg("请求超时,主机没有反应!");
} else {}
return FALSE; // 发送失败
}
return TRUE; // 发送成功
}
没有合适的资源?快使用搜索试试~ 我知道了~
VC套接字阻塞模式开发
共12个文件
opt:2个
plg:2个
dsw:2个
5星 · 超过95%的资源 需积分: 9 56 下载量 15 浏览量
2009-09-20
01:36:09
上传
评论
收藏 17KB RAR 举报
温馨提示
by Koma http://blog.csdn.net/wangningyu
资源推荐
资源详情
资源评论
收起资源包目录
Socket阻塞模式开发.rar (12个子文件)
BlokModeClient
BlokModeClient.cpp 5KB
BlokModeClient.dsw 553B
BlokModeClient.opt 53KB
BlokModeClient.dsp 4KB
BlokModeClient.ncb 41KB
BlokModeClient.plg 1KB
BlokModeSrv
BlokModeSrv.ncb 41KB
BlokModeSrv.plg 1KB
BlokModeSrv.dsw 547B
BlokModeSrv.dsp 4KB
BlokModeSrv.opt 53KB
BlockModeSrv.cpp 7KB
共 12 条
- 1
资源评论
- Robin_1112017-02-14谢谢好心人分享,非常感谢!
汪宁宇
- 粉丝: 752
- 资源: 42
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功