/*
模拟用户进入聊天室
1,S接受所有C的连接
2,C向S连接后,把自己的ID(学号)通过TCP发送给S端
3,S向C返回已进入聊天室的所有ID
4,S把新用户ID通知其他用户
5,结束
*/
#include "iostream"
#include <winsock2.h>
#include <windows.h>
#include <process.h>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable : 4996)
#pragma warning(disable : 4995)
using namespace std;
#define Const_BufLength 1024
#define MAX_THREAD_LEGTH 64
#define Const_Port 12345
BOOL InitSocket(void);
WSADATA wsaData;
sockaddr_in SerAdd,CliAdd;
SOCKET m_socket,AcceptSocket;
unsigned threadID[MAX_THREAD_LEGTH]={0};
HANDLE hThread[MAX_THREAD_LEGTH];
static unsigned threadCount=0;
class CStudent
{
public:
CStudent()
{
memset(StudentID,0,10);
memset(IP,0,20);
StudentThread=0;
Port=0;
}
char StudentID[10];
int StudentThread;
char IP[20];
int Port;
};
CStudent Student[MAX_THREAD_LEGTH];
BOOL ThreadEnable[MAX_THREAD_LEGTH];
BOOL StudentEnable[MAX_THREAD_LEGTH];
struct RECVPARAM
{
SOCKET sock;
CStudent StudentTemp;
};
unsigned __stdcall RecvProc(LPVOID lpParameter)
{
threadCount++;
BOOL flag=FALSE;
int iLength=sizeof(CliAdd);
char strSendMsg[Const_BufLength];
char strRecvMsg[Const_BufLength];
SOCKET AcceptSocket=((RECVPARAM*)lpParameter)->sock;
CStudent StudentTemp=((RECVPARAM*)lpParameter)->StudentTemp;
memset(strSendMsg,0,sizeof(strSendMsg));
strcpy(strSendMsg,"聊天室已在的用户:\n");
for(int i=0;i<MAX_THREAD_LEGTH;i++)
{
if(StudentEnable[i]==TRUE)
{
char buf[20]={0};
strcpy(buf,Student[i].IP);
strcat(strSendMsg,buf);
sprintf(buf," :%d ",Student[i].Port);
strcat(strSendMsg,buf);
strcpy(buf,Student[i].StudentID);
strcat(strSendMsg,buf);
sprintf(buf," 线程号为:%d\n",Student[i].StudentThread);
strcat(strSendMsg,buf);
flag=TRUE;
}
}
if(flag==FALSE)
strcpy(strSendMsg,"聊天室内没有用户:\n");
int retval=send(AcceptSocket,strSendMsg,sizeof(strSendMsg),0);
if(retval==SOCKET_ERROR)
{
cout<<"发送失败,错误ID为:"<<WSAGetLastError()<<endl;
threadCount--;
closesocket(AcceptSocket);
_endthreadex(0);
return -1;
}
else
{
cout<<"正在等待接收该用户的学号:"<<endl;
}
////////////////////////////////////接收学号
memset(strRecvMsg,0,sizeof(strRecvMsg));
retval=recv(AcceptSocket,strRecvMsg,sizeof(strRecvMsg),0);
if(retval==SOCKET_ERROR)
{
cout<<"该线程接受失败,错误ID为:"<<WSAGetLastError()<<endl;
threadCount--;
closesocket(AcceptSocket);
delete lpParameter;
_endthreadex(0);
return -1;
}
else if(strcmp(strRecvMsg,"exit")==0)
{
cout<<"该线程已退出"<<endl;
ThreadEnable[StudentTemp.StudentThread]=FALSE;
StudentEnable[StudentTemp.StudentThread]=FALSE;
threadCount--;
closesocket(AcceptSocket);
delete lpParameter;
_endthreadex(0);
return -1;
}
else
{
cout<<"学号为"<<strRecvMsg<<"已经注册"<<endl;
strcpy(StudentTemp.StudentID,strRecvMsg);
Student[StudentTemp.StudentThread]=StudentTemp;
StudentEnable[StudentTemp.StudentThread]=TRUE;
}
/////////////////////////////////
while(1)
{
cout<<"等待该学号"<<StudentTemp.StudentID<<"回应"<<endl;
memset(strRecvMsg,0,sizeof(strRecvMsg));
retval=recv(AcceptSocket,strRecvMsg,sizeof(strRecvMsg),0);
if(retval==SOCKET_ERROR)
{
cout<<"学号为:"<<StudentTemp.StudentID<<"接受失败,错误ID为:"<<WSAGetLastError()<<endl;
break;
}
else if(strcmp(strRecvMsg,"exit")==0)
{
cout<<"学号为:"<<StudentTemp.StudentID<<"已经下线"<<endl;
ThreadEnable[StudentTemp.StudentThread]=FALSE;
StudentEnable[StudentTemp.StudentThread]=FALSE;
break;
}
else
{
cout<<strRecvMsg<<endl;
}
}
threadCount--;
closesocket(AcceptSocket);
delete lpParameter;
_endthreadex(0);
return 0;
}
int main()
{
if(!InitSocket())
{
cout<<"套接字初始化出错,即将退出"<<endl;
WSACleanup();
system("pause");
return -1;
}
if(listen(m_socket,SOMAXCONN)==SOCKET_ERROR)
{
cout<<"监听失败,错误ID为:"<<WSAGetLastError()<<endl;
return -1;
}
for(int i=0;i<MAX_THREAD_LEGTH;i++)
{
ThreadEnable[i]=FALSE;
StudentEnable[i]=FALSE;
}
int iLength=sizeof(CliAdd);
int retval;
char strSendMsg[Const_BufLength];
char strRecvMsg[Const_BufLength];
while(TRUE)
{
cout<<"等待客户回应"<<endl;
AcceptSocket=accept(m_socket,(SOCKADDR*)&CliAdd,&iLength);
if(AcceptSocket==INVALID_SOCKET)
{
cout<<"接受失败,错误ID为:"<<WSAGetLastError()<<endl;
return -1;
}
else
{
int i;
for(i=0;i<MAX_THREAD_LEGTH;i++)
{
if(ThreadEnable[i]==FALSE)
break;
}
ThreadEnable[i]=TRUE;
CStudent StudentTemp;
StudentTemp.StudentThread=i;
StudentTemp.Port=ntohs(CliAdd.sin_port);
strcpy(StudentTemp.IP,inet_ntoa(CliAdd.sin_addr));
cout<<"IP:"<<StudentTemp.IP<<"\t端口:"<<StudentTemp.Port<<"已经连接"<<endl;
RECVPARAM *pRecvParam=new RECVPARAM;
pRecvParam->StudentTemp=StudentTemp;
pRecvParam->sock=AcceptSocket;
//hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);
hThread[i] = (HANDLE)_beginthreadex( NULL, 0, &RecvProc,(LPVOID)pRecvParam, 0, (unsigned*)&i);
}
}
WaitForMultipleObjects(threadCount, hThread, TRUE, INFINITE);
for(int i=0;i<MAX_THREAD_LEGTH;i++)
CloseHandle(hThread);
closesocket(m_socket);
WSACleanup();
return 0;
}
BOOL InitSocket(void)
{
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
cout<<"加载winsock失败,错误ID为:"<<WSAGetLastError()<<endl;
return FALSE;
}
m_socket=socket(AF_INET,SOCK_STREAM,0);
if(INVALID_SOCKET==m_socket)
{
cout<<"套接字创建失败!错误ID为:"<<WSAGetLastError()<<endl;
return FALSE;
}
SerAdd.sin_family=AF_INET;
SerAdd.sin_port=htons(Const_Port);
SerAdd.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
int retval;
retval=bind(m_socket,(SOCKADDR*)&SerAdd,sizeof(SOCKADDR));
if(SOCKET_ERROR==retval)
{
closesocket(m_socket);
cout<<"端口绑定失败! 错误ID为:"<<WSAGetLastError()<<endl;
return FALSE;
}
return TRUE;
}
没有合适的资源?快使用搜索试试~ 我知道了~
tcp server &client源码c++
共71个文件
tlog:18个
gif:4个
user:4个
4星 · 超过85%的资源 需积分: 40 136 下载量 158 浏览量
2015-09-06
12:57:00
上传
评论 3
收藏 29.23MB RAR 举报
温馨提示
tcp的server和client端源码,c++开发的,可以帮助不懂通讯的孩子们了解他的基本通信方法。
资源推荐
资源详情
资源评论
收起资源包目录
ConsleTCP.rar (71个子文件)
ConsleTCP
ConsleTCP
MyTcpClient
ipch
mytcpclient-a743e996
mytcpclient-f8bae6d8.ipch 42.94MB
MyTcpClient.suo.old 8KB
MyTcpClient.sdf 29.83MB
MyTcpClient.vcxproj 3KB
MyTcpClient.cpp 3KB
_UpgradeReport_Files
UpgradeReport.xslt 12KB
UpgradeReport_Plus.gif 71B
UpgradeReport.css 3KB
UpgradeReport_Minus.gif 69B
MyTcpClient.vcproj 3KB
MyTcpClient.vcxproj.user 143B
Debug
link.read.1.tlog 3KB
MyTcpClient.log 2KB
vc100.pdb 268KB
link.command.1.tlog 1KB
MyTcpClient.obj 80KB
CL.write.1.tlog 496B
MyTcpClient.exe.intermediate.manifest 381B
BuildLog.htm 5KB
cl.command.1.tlog 646B
mt.read.1.tlog 864B
mt.dep 67B
mt.write.1.tlog 392B
MyTcpClient.lastbuildstate 96B
CL.read.1.tlog 21KB
vc80.idb 163KB
mt.command.1.tlog 576B
MyTcpClient.exe 14KB
link.write.1.tlog 564B
MyTcpClient.sln.old 886B
MyTcpClient.suo 11KB
MyTcpClient.sln 888B
MyTcpClient.vcproj.E619786E140942F.Administrator.user 1KB
UpgradeLog.XML 3KB
MyTcpClient.vcxproj.filters 936B
MyTcpSer
MyTcpSer.vcxproj.user 143B
ipch
mytcpser-54b0750c
mytcpser-3feb2843.ipch 43MB
MyTcpSer.vcxproj.filters 933B
_UpgradeReport_Files
UpgradeReport.xslt 12KB
UpgradeReport_Plus.gif 71B
UpgradeReport.css 3KB
UpgradeReport_Minus.gif 69B
MyTcpSer.vcproj.E619786E140942F.Administrator.user 1KB
MyTcpSer.sdf 26.96MB
Debug
link.read.1.tlog 3KB
vc100.pdb 260KB
link.command.1.tlog 1KB
CL.write.1.tlog 466B
MyTcpSer.log 2KB
BuildLog.htm 5KB
MyTcpSer.obj 73KB
cl.command.1.tlog 622B
mt.read.1.tlog 840B
mt.dep 67B
MyTcpSer.exe.intermediate.manifest 381B
mt.write.1.tlog 368B
CL.read.1.tlog 22KB
vc80.idb 171KB
mt.command.1.tlog 546B
MyTcpSer.exe 12KB
link.write.1.tlog 528B
MyTcpSer.lastbuildstate 93B
MyTcpSer.vcxproj 3KB
MyTcpSer.ncb 6.99MB
MyTcpSer.cpp 6KB
UpgradeLog.XML 3KB
MyTcpSer.sln 882B
MyTcpSer.sln.old 880B
MyTcpSer.suo.old 20KB
MyTcpSer.vcproj 3KB
MyTcpSer.suo 23KB
共 71 条
- 1
资源评论
- 瑾_Julia2018-08-15还可以吧,可以学习
- Parmyty2017-09-17一般般吧,可惜不是我想要的异步通信模式。
- beautifulmouse2018-07-15了解了,学习了,可用
- Alaiiverson2017-09-21试试看,再来评论
qq_25032973
- 粉丝: 1
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功