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 + -
显示快捷键?