socket如何用多线程实现同时能接收和发送消息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket如何用多线程实现同时能接收和发送消息相关的知识,希望对你有一定的参考价值。

我先用伪代码写下我的想法
DWORD WINAPI ClientThreadRecv(LPVOID lpParameter)//写好接收消息线程

main()

ServerSocket = socket(AF_INET, SOCK_STREAM, 0)
设置struct sockaddr_in
bind()
listen()//监听
while(1)

accpet()//建立连接
send()
recv()//这里创建线程接收


这样写我运行还是没法实现同时接收和发送消息 只能发一条就必须等客户端回复才行 到底该如何写呀

单IP,多线程监听相同端口,不能实现,详见UNPV1,不过使用一个线程监听端口,把结果存入一个对象,然后多线程并发访问这个对象倒是可以实现的 参考技术A 把accept()提到while()外面,然后while()里面创建两个线程分别send和recv。
失误了,应该是主函数里只创建两个线程,while(1)放到线程里,send和recv放到while(1)里追问

刚才线程没放while里面 可放了后 由于大量循环创建线程导致线程创建全部失败

本回答被提问者采纳

TCP socket 多线程 并发服务器(发送)与客户端(接收)

实现功能:Ubuntu上通过多线程实现服务器并发给客户端发送文件,携带包头,根据包头信息命名新文件。适用于短连接。

问题小结:

01. 调用嵌套在结构体中的结构体char 数组成员时,需要动态分配内存。

02. 使用select() 监听socket变化。select() 其中三个参数分别监听读,写,出错。

03. 每条线程在同时发送文件时,需要使用独立的变量,如accept(), FILE *fd, *buff 等,用结构数组 + 标号实现。

04. struct stat stat_buff.st_size 可得到文件的字节大小。

05. 文件使用“wb+” 创建之后写数据用“rb+" 。

*06. 由于可能接收缓冲区存满,本一次接收1096字节数据,结果分成两次819和277字节,导致错误接收和解析,处理办法为判断每次接收到的数据是否携带包头。

07. 多线程中,在主线程中某一动态分配的对象同时被两个线程使用,一个线程释放了该对象,而另一个线程继续对该对象进行操作,会造成使用了无效指针错误。

08. 函数中的局部指针变量不可返回,只有静态变量,全局变量,动态分配的指针变量可以返回。

总结:熟悉了socket 创建以及收发过程;对c 语言中数组,指针,字符串操作,多线程理解加深;动态开辟的空间,创建的资源在程序退出(包括非正常)时要全部释放;提高效率。

  渺小如蝼蚁,学习永无止境。

  渴望把程序写成艺术品,哈哈。

以上是关于socket如何用多线程实现同时能接收和发送消息的主要内容,如果未能解决你的问题,请参考以下文章

Python Socket - 同时发送/接收消息

Socket入门笔记 用TcpClient实现一个简易聊天室

如何用Qt的Qudpsocket传输图片文件?

C# 多线程 大量数据实时接收\解析\存储 问题

如何用c语言编写socket套接字

如何用 Python 给你喜欢的女生发消息