雅乐网

计算机技术、学习成长

编程 » Web » 多客户端socket服务简单例子,多线程实现。

多客户端socket服务简单例子,多线程实现。

对于socket通讯,网上有很多教程,我就简单的说一下socket通讯步骤,便于理解下面的代码。

服务器端:

首先,应该初始化套接字库,初始化套接字socket()

然后,绑定socket套接字到一个端口上,bind()

接着,将套接字设为监听状态listen()

此时,可以用accept()接受连接请求,它也会返回一个socket套接字,这是对每个连接的套接字。

现在,可以使用rec(),send()进行消息的收发

最后,结束连接,关闭套接字closesocket(),对于当前连接的套接字和服务端的总套接字要分别关闭。清理套接字库。

 

客户端:

加载套接字库,创建套接字socket();

向服务器发出连接请求connect();

和服务器端进行通信send()/recv();

关闭套接字closesocket(),关闭加载的套接字库。

2007628073341_2

网络通信中,大多数情况应该有多个客户端,多个客户端同时连接服务端。可以有多种解决方案,比如IOCP模型。

这里我采用最简单的创建多线程,为每个连接创建一个线程,结束连接时关闭此线程。

按照网上说法,创建线程最好使用_beginthreadex而不要使用createthread。

服务端代码:

这里有一处需要特别注意,就是把args结构体作为参数传入线程参数,这里有两种实现:

一种是我现在使用的方法,在main中,while(1)表示一直等待连接接入,每次连接,就会把sClient结构体指针传进去。这里传进去的是一个void * 类型,传进去后转换成args*类型,再把内容赋值给新的args结构体ap。

另一种办法是把 main中声明args arg改成args arg = new args;然后传入arg,这样相当于为每个连接new一个结构体,不过要记得在结束连接时释放内存。

我之前采用了传的结构体指针,内部却忘了把它赋值给一个新的结构体,导致每次连接的信息会覆盖旧连接,导致旧连接卡死。

目前的程序没有写如何结束服务端的死循环,暂时就这样吧。

 

客户端代码:

 

如果文章对你有帮助,欢迎点赞或打赏(金额不限)。你的打赏将全部用于支付网站服务器费用和提高网站文章质量,谢谢支持。

版权声明:

本文由 原创,商业转载请联系作者获得授权。
非商业转载请注明作者 雅乐网 ,并附带本文链接:
https://www.yalewoo.com/an_example_for_c_socket_programming_with_multithreading.html

上一篇:

下一篇:

我要评论

验证码*: 0 + 1 =