服务端: BlockTcpServer
/**************************** begin ************************/
// BlockServer.app
// class : BlockTcpServer
// Init,Bind,Listen,Accept,Recv,Send....
#include <iostream>
#include <WINSOCK2.H>
#pragma comment(lib, "wsock32.lib")
using namespace std;
class BlockTcpServer{
enum{
SERVER_EXIT_OK = 0 , //服务器正常退出
SERVER_API_OK = 0 , //调用 Socket API 成功
SERVER_DLL_ERROR = 1 , //调用Windows sockets DLL失败
SERVER_API_ERROR = 2 , //调用 Socket API 失败
SERVERPORT = 5555, //定义服务器 TCP 端口
MAX_NUM_BUF = 64 , //缓冲区尺寸
SOCKET_VERSION = MAKEWORD(2,2)
};
private:
int InitMember(void); //初始化成员变量
int ExitClient(int nExit); //客户端退出
BOOL RecvLine(SOCKET s, char* buf); //读取一行数据
BOOL SendLine(SOCKET s, char* buf); //发送一行数据
int HandleSocketError(char *str); //对Windows sockets API调用错误处理
void ShowSocketMsg(char* str); //显示错误信息
public:
int ServerRun(void);
private:
char bufRecv[MAX_NUM_BUF]; //读缓冲区
char bufSend[MAX_NUM_BUF]; //写缓冲区
SOCKET sServer; //服务器监听套接字
SOCKET sClient; //接受客户端套接字
BOOL bConning; //与客户端的连接状态
};
/**************************/
int main(int argc, char* argv[])
{
BlockTcpServer bts;
while(1){
bts.ServerRun();
Sleep(50);
}
return 1;
}
/**************************/
int BlockTcpServer::ServerRun(void)
{
if(SERVER_API_OK != InitMember()){
ShowSocketMsg(" InitMember 失败 /n ");
return -1;
}
//创建套接字
sServer= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(INVALID_SOCKET == sServer)
{
return HandleSocketError("Failed socket()!");
}
//服务器套接字地址
SOCKADDR_IN addrServ;
addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(SERVERPORT);
addrServ.sin_addr.s_addr = INADDR_ANY;
//绑定套接字
int retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));
if(SOCKET_ERROR == retVal)
{
closesocket(sServer); //关闭套接字
return HandleSocketError("Failed bind()!"); //错误处理
}
//开始监听
retVal = listen(sServer, 1);
if(SOCKET_ERROR == retVal)
{
closesocket(sServer); //关闭套接字
return HandleSocketError("Failed listen()!");//错误处理
}
//等待客户端的连接
cout << "Server succeeded!" << endl;
cout << "Waiting for new clients..." << e