⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 01server.cpp

📁 演示win32的socket 通讯 八皇后的改进算法 并发Concurrency的JAVA实现 applet演示鼠标的点击时间和显示图象 手机J2ME的多线程演示
💻 CPP
字号:
/**(Echo)回声服务器的Win32控制台程序
     --接收客户数据并返回前20个字节

     socket原型为:
     SOCKET socket(int af, int type, int protocol),
     参数:
         af       指定网络地址类型,一般用AF_INET,表示在Internet中通信;
         type     为套接字类型:SOCK_STREAM为流(TCP)套接字,而SOCK_DGRAM是数据报(UDP)套接字;
         protocol 为网络协议:0表示默认为TCP/IP协议    
   作业:

**/

#include "iostream.h"
#include "assert.h"
#include "winsock.h"
#pragma comment(lib, "wsock32")  //编译连接时使用静态连接库wsock32.lib

UINT	m_nPort;     //服务器端口号--16位整数
SOCKET m_hSocket;    //服务器进程套接字类
SOCKADDR_IN m_addr;  //套接字地址结构


void StartUp();       //初始化Winsock的函数:启动Winsock
void CreateSocket();  //使用socket函数建立服务器进程的流(TCP)套接字
void BindSocket();    //使用bind函数绑定IP地址到套接字,使网络上可识别该套接字
void Listen_Recv();   //将套接字置入监听模式并准备接受连接进行通信
void CleanUp();       //终止对Winsock DLL的使用,释放资源

void main(){
  /**
    1  应用程序初始化:注册wsock.dll
  **/   
	StartUp();
  /**
    2  使用socket函数建立服务器进程的流(TCP)套接字:
  **/   
        CreateSocket();
  /**
    3  使用bind函数绑定IP地址到套接字,使网络上可识别该套接字,bind原型为
          int bind(SOCKET s, const struct sockaddr* name, int namelen)
          其中:s为等待连接的未绑定套接字,name为套接字地址结构,更为有用的是
		SOCKADDR_IN,用来标识TCP/IP协议下的地址,这时通过强制类型转换可将
		SOCKADDR_IN结构转换为sockaddr结构
  **/
    
	BindSocket();
	
        //UpdateData();//更新用户在编辑框里对端口的改变,MFC对话框用  
  /**
    4  将套接字置入监听模式并准备接受连接进行通信:bind只是将套接字与地址关联在一起;
	而使套接字进入等候连接则由函数listen完成,listen的原型为:
  **/     
         Listen_Recv();
  /**
	5	关闭套接字,终止对Winsock DLL的使用,释放资源
  **/
         CleanUp();
}


//初始化Winsock的函数:启动Winsock
void StartUp()
{
	//初始化全局变量
    m_nPort = 2350;
	m_hSocket = NULL;
    //初始化winsock
	WSADATA wsaData;
	WORD version = MAKEWORD(2, 0); //
        //调用WSAStartup函数对Winsock DLL进行初始化,协商Winsock版本,分配资源
	int ret = WSAStartup(version, &wsaData);
	if(ret != 0)cout<<"初始化错误!\n";
}

void CreateSocket(){
       //先关闭已经建立的套接字
       if(m_hSocket != NULL){  
		closesocket(m_hSocket);
		m_hSocket = NULL;
	}
       //用socket(构造)函数建立流类型(TCP)套接字
	if(m_hSocket == NULL){
		m_hSocket = socket(AF_INET, SOCK_STREAM,0);
		assert(m_hSocket != NULL); //C语言函数,进行判断,若不真,则做出错处理
	}

}
void BindSocket(){	
	//给服务器结构地址m_addr赋值:
	m_addr.sin_family = AF_INET;  //表示该socket处于Internet域
	m_addr.sin_port = htons(m_nPort);  //指定服务端口
	//sin_addr把一个IP地址保存为4字节的无符号整数,
	m_addr.sin_addr.S_un.S_addr = INADDR_ANY; //本机测试时可用,即127.0.0.1
        //若使用实际IP地址,可用函数inet_addr将其转换为4字节的无符号整数
  	//  m_addr.sin_addr.S_un.S_addr=inet_addr("210.40.7.131");

	int error = 0;
 	int ret = bind(m_hSocket, (LPSOCKADDR)&m_addr, sizeof(m_addr)); 
	if(ret == SOCKET_ERROR){
		cout<<"Bind Error!\n";//, (error = WSAGetLastError()));
		return ;
	} 

}

void Listen_Recv(){
	cout<<"请按一键开始运行服务器";
        char cc;cin>>cc;  
	
	while(1){//服务器永远循环服务
		//侦听
		int ret = listen(m_hSocket, 2);
		if(ret == SOCKET_ERROR){
			cout<<"Listen Error: %d \n";//, (error = WSAGetLastError()));
			return ;
		}
		//
		SOCKET s = accept(m_hSocket, NULL, NULL);
		if(s == SOCKET_ERROR){
			cout<<"Accept Error: %d \n";//, (error = WSAGetLastError()));
			return ;
		}
		cout<<"客户连接成功!\n";
		
		//接受客户数据
		char buff[256];
		ret = recv(s, buff, 256, 0);
		if(ret == 0 || ret == SOCKET_ERROR ){
			cout<<"Recv data error: %d\n";//, WSAGetLastError());
			return ;
		}
		/**
			4   处理客户消息
		**/
		///**  回声服务:向客户返回消息(20个字节) 
		ret = send(s, buff, 20, 0);
 		//**/
		//
		cout<<"处理完成;服务器重新等待客户连接!\n";
     }

}

//应用程序关闭套接字后,终止对Winsock DLL的使用,释放资源
void CleanUp()
{
	if (WSACleanup() != 0){
		cout<<"UnInitilize Error:%d\n";//, WSAGetLastError());
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -