socket多人聊天程序多人聊天程序C语言版语言版(一一)
主要为大家详细介绍了socket多人聊天程序C语言版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
首先,不要一步登天直接解决多人聊天这个问题,先把问题化简。
1.多人聊天的核心问题是服务器如何标识不同的客户端,如何根据客户端的需求转发消息给指定客户端。
2.多人聊天转化为C-C聊天,但是不再是直接C-C,而是通过server转发消息,所以变成==>C-S-C。
3.server如何允许2个client同时连接,设置listen函数的第二个参数,最大连接数。
4.server如何标识两个client,用一个结构体数组来存放两个client的信息。
5.server如何转发消息给client,很简单,先接收到的发送给还没接收到的。如图:
6.server如何管理两个client的连接状态,连接成功很简单,就是accpet成功后就是连接成功了。但是怎么判断连接断开呢?这个涉及到的
select函数的使用,有点复杂~,所以我就简单的用了一个send函数发送一个空消息来判断是否断开连接,这个不严谨,容易出BUG,但是实
践起来简单就使用了它。
7.要用线程来管理接收消息、发送消息、接受请求、管理连接状态。
技术要点:C语言线程函数的使用。
_beginthreadex函数原型
_ACRTIMP uintptr_t __cdecl _beginthreadex
( _In_opt_ void* _Security,//安全属性,NULL为默认安全属性
_In_ unsigned _StackSize,//线程堆栈的大小。如果为0,则线程堆栈大小和创建它的线程的相同。一般用0
_In_ _beginthreadex_proc_type _StartAddress, //线程函数的地址
_In_opt_ void* _ArgList, //传进线程的函数
_In_ unsigned _InitFlag, //线程初始状态,0:立即运行;CREATE_SUSPEND:悬挂(如果出事状态定义为悬挂,就要调用ResumeThread(HANDLE) 来激活线程的运行)
_Out_opt_ unsigned* _ThrdAddr //用于记录线程ID的地址
)
例子:
#include <process.h>
#include <stdio.h>
unsigned __stdcall Thread(void* param)
{
printf("%d", *(int*)param); //这里必须先要强行转换为int*,不然void* 直接解引用会出错。
return 0;
}
int main()
{
int i = 0;
_beginthreadex(NULL, 0, Thread, &i, 0, NULL);
return 0;
}
1V1,C-S-C聊天例子:
编写环境:win10,VS2015
效果图:
评论0