server.cpp

来自「操作系统内核编程TCP通讯的服务器端与客户端的C语言源码」· C++ 代码 · 共 103 行

CPP
103
字号
#include "iostream.h"
#include "winsock.h"

#define DEFAULT_PORT 4000                  //默认端口号
DWORD WINAPI ThreadFunc(LPVOID pParam);    //服务器端socket接收线程函数
DWORD WINAPI ReadIn(LPVOID pParam);        //服务器端控制台(console)接受函数
char info[255];                            //服务器端控制台输入字符串
bool isConnect;                            //是否有客户端连接

int main()
{
	WORD wVersionRequested=MAKEWORD(2,2);  //初始化Winsock
	WSADATA wsaData;
	WSAStartup(wVersionRequested,&wsaData);

	SOCKET sServSock=socket(AF_INET,SOCK_STREAM,0);//建立面向连接的套接字
	
	sockaddr_in addr;
	int nSockErr;
	int nNumConns=0;                       //当前连接数目
	SOCKET sConn;
	sockaddr ConnAddr;
	int nAddrLen=sizeof(sockaddr);

	addr.sin_family=AF_INET;
    addr.sin_port=htons(DEFAULT_PORT);
	addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
	//绑定套接字到一个已知地址
	if(bind(sServSock,(LPSOCKADDR)&addr,sizeof(addr))==SOCKET_ERROR)
		nSockErr=WSAGetLastError();
	//将套接字置入监听模式
	if (listen(sServSock,5)==SOCKET_ERROR)
		nSockErr=WSAGetLastError();
	cout << "*****************Wait Client to Connect**********************" << endl;
	while (strcmp(info,"bye"))  //如果没有给出退出请求
	{
		cin.delbuf();
		while (nNumConns<1)
		{
			//完成接受客户端连接准备
			sConn=accept(sServSock,&ConnAddr,&nAddrLen);
			if (sConn==INVALID_SOCKET) nSockErr=WSAGetLastError();
			else
			{
				isConnect=true;
				CreateThread(NULL,0,ThreadFunc,&sConn,0,NULL);
				//创建服务器的接受线程
				cout << "*****************Accpet successfull.*****************"<<endl;
				nNumConns++;
			}
		}
		if (nNumConns>=1)     //这个处理过程表明每次只能处理一个客户,直到客户或服务器发出bye为止
			ReadIn(&sConn);  //处理控制台输入并执行相应操作
		nNumConns=0;
		closesocket(sConn);
	}
	return 0;
}

//服务器接受函数
DWORD WINAPI ThreadFunc(LPVOID pParam)
{
	SOCKET *s=(SOCKET *)pParam;
	char in[255];
	while(strcmp(info,"bye"))        //退出
	{
		if(recv(*s,in,255,0)!=SOCKET_ERROR)  //接受成功
		{
			cout << "\b" << in << endl << ">";
			cout.flush();
		}
		else                         //接受失败,客户端退出
		{
			cout<<"*****************Client Exit*****************\n";
			cout<<"*****************Press Enter*****************"<<endl;
			isConnect=false;
			return 0;
		}
	}
	return 0;
}

//服务器从控制台接受输入函数
DWORD WINAPI ReadIn(LPVOID pParam)
{
	SOCKET *sConn=(SOCKET *)pParam;
	cin.clear();
	cout << ">";
	cin.getline(info,255);
	while(strcmp(info,"bye")&&isConnect)        //输入不是"bye"就send
	{
		send(*sConn,info,255,0);
		cout << ">";
		cin.getline(info,255);
	}
	isConnect=false;                //当服务器发出bye时,所有的客户都要退出了。而当客户发出bye时,服务器侦听下一个客户
	if(!strcmp(info,"bye"))          //如果是服务器端发出的bye,就退出程序
		exit(0);
	cout<<"*****************Wait Another*****************"<<endl;
	return 0;
}

⌨️ 快捷键说明

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