关于socket的管理

news/2025/2/24 17:20:55/文章来源:https://www.cnblogs.com/baldermurphy/p/18734509

1.发送指定地址和端口的数据

bool WRTAudioTransStart(UInt32 remoteIP, UInt32 samp) {LOGD("WRTAudioTransStart %x %d\r\n", remoteIP, samp);//samp采样率if (m_bAudioTransRun) {LOGE("WRTAudioTransStar is running. m_transAudioSocket : %d\r\n", m_bAudioTransRun, m_transAudioSocket);return false;}m_transAudioSocket = socket(AF_INET, SOCK_DGRAM, 0);if (m_transAudioSocket < 0) {LOGE("WRTAudioTransStar create socket error %d\r\n", errno);return false;}//允许端口重用,防止bind errn:98int on;on = 1;int ret = setsockopt(m_transAudioSocket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));if (ret != 0) {close(m_transAudioSocket);m_transAudioSocket = -1;LOGE("Socket setsockopt SO_REUSEADDR error %d\r\n", errno);return false;}struct sockaddr_in sin;memset(&sin, 0, sizeof(sin));sin.sin_family = AF_INET;sin.sin_addr.s_addr = INADDR_ANY;sin.sin_port = htons(AUDIO_PORT);//接收的本地端口if (bind(m_transAudioSocket, (struct sockaddr *) &sin, sizeof(sin)) < 0) {LOGE("WRTAudioTransStar bind error %d\r\n", errno);close(m_transAudioSocket);m_transAudioSocket = -1;return false;}memset(&remoteAddr, 0, sizeof(remoteAddr));remoteAddr.sin_family = AF_INET;remoteAddr.sin_addr.s_addr = remoteIP;remoteAddr.sin_port = htons(AUDIO_PORT);//对方接收的端口m_bAudioTransRun = true;
CreateDetachedThread(threadAudioRecv, NULL, true);        //接收播放return true;}


发送数据(线程里面)

    while (audioSendBufferLength >= 384) {if (m_transAudioSocket > 0) {int ret = sendto(m_transAudioSocket, (char *) pbuf, 384, 0, (struct sockaddr *) &remoteAddr,sizeof(struct sockaddr_in));if (ret < 0)LOGE("send audio data errno %d\r\n", errno);} elsebreak;}

 

 

接收数据

void *threadAudioRecv(void *lpparam) {struct sockaddr_in from;int addrlen, recvlen;char recvBuffer[1024];short audioBuffer[2048];int audioBufferLength = 0;UInt32 curVolume = 0;struct timeval tv_out;fd_set fR;tv_out.tv_sec = 1;tv_out.tv_usec = 0;
LOGD("threadAudioRecv start\r\n");
while (m_bAudioTransRun) {tv_out.tv_sec = 1;tv_out.tv_usec = 0;FD_ZERO(&fR);FD_SET(m_transAudioSocket, &fR);if (select(m_transAudioSocket + 1, &fR, NULL, NULL, &tv_out) <= 0)    //出错或超时
        {LOGE("audio select timeout or error. errno = %d, time : %d s", errno, tv_out.tv_sec);continue;}//LOGD("threadAudioRecv m_bAudioTransRun = %d,m_transAudioSocket = %d",m_bAudioTransRun,m_transAudioSocket);if (!m_bAudioTransRun||(-1==m_transAudioSocket))break;//LOGD("threadAudioRecv FD_ISSET %d %p \r\n",m_transAudioSocket,&fR);if (!FD_ISSET(m_transAudioSocket,&fR)){//LOGE("audio select socket is not set");continue;}addrlen = sizeof(struct sockaddr_in);int receiveCount = 1024;recvlen = recvfrom(m_transAudioSocket, recvBuffer, receiveCount, 0, (struct sockaddr *) &from, &addrlen);//LOGE("threadAudioRecv recvfrom audio ret %d", recvlen);if (recvlen < 0) {LOGE("recv audio data recvfrom error:%d\r\n", errno);break;}}LOGE("threadAudioRecv end\r\n");return 0;
}

 

 

 

 

2.主动监听新来的连接

/////////////////////////////////////////////////////////////////////////////////
//1:监听任务
//2:主动连接任务
/////////////////////////////////////////////////////////////////////////////////
static int  StartListen(){struct sockaddr_in serveraddr;int connected_len = 0;unsigned long flag = 1;int g_listensocket=-1;       g_listensocket = socket( AF_INET ,SOCK_STREAM, 0);    if(g_listensocket == -1){LOGD("create g_listensocket error 0x%x",errno);return  -1;}serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = INADDR_ANY;serveraddr.sin_port   = htons(20200);//允许端口重用,防止bind errn:98int on;on = 1;int ret = setsockopt(g_listensocket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));if(ret != 0){close(g_listensocket);LOGE( "Socket setsockopt SO_REUSEADDR error %d\r\n", errno);return -1;}ret = bind(g_listensocket, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr));LOGD("bind ret=%d",ret);if(ret >= 0){listen(g_listensocket,5); } else{LOGD("bind g_listensocket error 0x%x",errno);closesocket(g_listensocket);g_listensocket = -1;return  -1;}
#ifdef LJW_DEBUG_LISTENioctlsocket( g_listensocket,FIONBIO,(char*)&flag);
#endifreturn  g_listensocket;}/**
*socket 监听任务
*/
int  socket_listen_task(void* param){struct sockaddr_in dstaddr;int listensocket = -1;socklen_t addlen = (socklen_t)sizeof(struct sockaddr_in);unsigned long msg[4];unsigned long t_count = 0;listensocket = StartListen();if(listensocket == -1){LOGD("socket_listen_task start error,reboot");system("reboot -f ");return 0;}while(1){int tmp_sock = -1;memset(msg,0,sizeof(unsigned long)*4);  LOGD("socket_listen_task  wait accept ");if((tmp_sock = accept(listensocket, (struct sockaddr*)&dstaddr,&addlen)) != -1){int ret = 0;msg[0] =tmp_sock; //shr_socket(tmp_sock,socketmanager_task_id);msg[1] = dstaddr.sin_addr.s_addr ;msg[2] = 0;msg[3] =0; t_count++;//发送有新的connect 到socketmanager;if(m_pSocketManager){int ret =0;int type= MSG_NODE_NEW_SOCKET_CLIENT;LOGD("=========MSG_NODE_NEW_SOCKET_CLIENT TYPE===== %d",type);ret = m_pSocketManager->Send_msg(type,(unsigned char*)msg,sizeof(unsigned long)*4);LOGD("接收到网络连接 socket  = %lu    addr=%lu",msg[0] ,msg[1]);}} else{LOGD("accept ERROR 0x%x",errno);}     SDL_Delay(200); //休息200MS,防止连接快速连续。
        }closesocket(listensocket);listensocket = -1;return 0;// tmosalTaskExit();
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/889094.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis低版本客户端Jedis2.9.0兼容高版本redis(比如redis6)不支持ACL的问题(亲测可用)

redis6版本及以上使用了acl认证 就是通过账号密码去认证,但是在之前版本都是只需要密码的,这种如果要适配,可能就要升级jedis客户端依赖的,但是一些老项目都不能随便升级的 之前的代码可能就不适配了 如果就要考虑使用现有的jedis版本 如:2.9.0 去支撑redis6的连接 以下有…

Linux 中sed命令的整行替换

Linux 中sed命令的整行替换.001、基本用法[root@PC1 test2]# ls a.txt [root@PC1 test2]# cat a.txt ## 测试文件 a UU i a UU i b q j c q y [root@PC1 test2]# sed /b/ s/.*/QQ/ a.txt ## 将匹配b的行全部替换为Q…

高科战神拨号精灵app下载设置方法

高科战神拨号助手、拨号健、全家软件下载,高科拨号精灵app使用设置方法说明:首先用安卓手机安装拨号助手app【联系图片上的V信 2081003456下载】。安装好后拨12345678进行蓝牙连接,蓝牙连接好后就可以进行操作。1拨号 2拨号 3拨号 4拨号 5拨号 关闭程序 12345678拨号设置。

Spherical Linear Interpolation and Text-Anchoring for Zero-shot Composed Image Retrieval

目录概Spherical Linear Interpolation (Slerp)Text-Anchored-Tuning (TAT)代码Jiang Y. K., Huynh D., Shah A., Chen W. and Lim S. Spherical linear interpolation and text-anchoring for zero-shot composed image retrieval. ECCV, 2024.概 本文提出了一种非常简单的 Ze…

uniapp + 微信小程序:新版canvas常用api及注意事项

关于新旧canvas的比较我以前写过一篇博客 :https://www.cnblogs.com/sunshine233/p/17014701.html ,这里就不重复了。 但在正文开始之前,我不得不再说一遍微信的文档写的真垃圾。很多问题的答案都是在微信开发者社区里找到的。一、新版canvas 基础用法:<template><…

Java 实现 Excel(XLS/ XLSX)和 HTML 格式之间的转换

Excel 是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,以便更好地利用和展示数据。本文将介绍如何通过 Java 实现 Excel 与 HTML 格式之间的相互转换。将Exce…

Python异步编程终极指南:用协程与事件循环重构你的高并发系统

title: Python异步编程终极指南:用协程与事件循环重构你的高并发系统 date: 2025/2/24 updated: 2025/2/24 author: cmdragon excerpt: 🚀 深入剖析Python异步编程的核心机制。你将掌握:\n 事件循环的底层实现原理与调度算法\n async/await协程的6种高级用法模式\n 异步H…

Uniapp开发安卓app之使用360加固加壳处理

Uniapp开发安卓app之使用360加固加壳处理 注:360加固只针对Android App免费。360加固助手官方下载 1.流程 安卓加固 》 签名APK 2.前提 先使用Hbuilder完成app打包,得到apk文件。 3.安卓加固1)安装、登录360加固软件并打开 2)在安卓加固》APK加固》添加任务,选择hbi…

用python画五角星

import turtle turtle.setup(500,500) turtle.bgcolor("white") turtle.pensize(3) turtle.color("red") turtle.begin_fill() for _ in range(5): turtle.forward(200) turtle.right(144) turtle.end_fill() turtle.hideturtle() turtle.done()

win10忘记开机密码怎么办?

下面我们来看看win10笔记本电脑开机密码忘记了怎么办_ 方法一、重置电脑,但是数据可能会丢失 1、开机,在看到Windows10Logo,下面有个圆圈在转的时候,数5秒。然后直接按下电源键关机。2.桌面,如果您的台式机有重新启动键,也可以直接按重新启动键。这样重复2~3次。 三、鼠标…