套接字阻塞模式

本文展示了如何使用C++在Windows环境下实现一个阻塞模式的TCP服务器和客户端。服务器通过`BlockTcpServer`类进行初始化、监听、接受连接、接收和发送数据。客户端`BlockTcpClient`类完成连接服务器、发送和接收数据的操作。代码包括错误处理和套接字API的使用。
摘要由CSDN通过智能技术生成

服务端: 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值