完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我想创建一个TCP服务器能够被多个客户端连接,所以程序做了如下尝试。 1)第一种方法:在TCP_perform_receive函数中,如果以函数的形式调用TCP_server_connect_handle,该TCP服务器能够被连接,且能够正常接发数据,但是仅限于一个Socket建立成功,如果第二个客户端想连接TCP服务器,能够连接成功,但是不能正常接发数据。 2)第二种方法:在TCP_perform_receive函数中,如果accept成功,我则建立一个线程,并把socket地址传到这个线程函数TCP_server_connect_handle中,结果是,客户端能连接成功,但是都不能正常接发数据,通过仿真器,我也确认了在TCP_server_connect_handle中,stcp_child这个Socket的地址接收成功啦。想不通为什么不能正常接发数据? 我知道要想建立TCP服务器被多个客户端相连,要用第二种方法,可是我想不通为什么不能正常接发数据,难道单纯传Socket地址不行吗? void TCP_server_connect_handle(unsigned int UArg0,unsigned int UArg1) { char *pBuf; HANDLE hBuffer; int32_t bytes; // SOCKET stcp_child; // printf("TCP_server_connect_handle: %d,%d n",UArg0,UArg1); stcp_child =(SOCKET*) UArg1; while(1) { // There is data available on the active connection 接收客户端发送过来的数据 bytes = (int)recvnc(stcp_child, (void **)&pBuf, 0, &hBuffer); // if(bytes > 0) // { bytes = send(stcp_child, pBuf, (int)TCP_SERVER_BUFSIZE, 0 ); if(bytes < 0) { printf("Failed tcp server send!n"); } bytes = 0; // recvncfree(hBuffer); // } TaskSleep(20); } } static void TCP_perform_receive() //做为TCP_server模式并接收TCP_client的接入,接收数据并统计接收速率 { int32_t size; struct sockaddr_in sin1; int8_t iClientNum = 0; SOCK *ps = (SOCK *)stcp_child; Task_Params TaskParams; char *pBuf; HANDLE hBuffer; int32_t bytes; printf("TCP server Task startedn"); /* Allocate the file environment for this task */ fdOpenSession(TaskSelf()); /* Create the main TCP listen socket 绑定IP和网络端口*/ stcp = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //SOCK_STREAM SOCK_STREAMNC if(stcp == INVALID_SOCKET) { printf( "Fail socket, %dn", fdError()); goto leave; } /* Set Port = 10001, IP address = IPAddrSend */ bzero(&sin1, sizeof(struct sockaddr_in)); sin1.sin_family = AF_INET; sin1.sin_len = sizeof(sin1); sin1.sin_addr.s_addr = inet_addr(LocalIPAddr); sin1.sin_port = htons(TCP_SERVER_PORT); if(bind(stcp, (struct sockaddr *)&sin1, sizeof(sin1)) < 0) { fdClose( stcp); stcp = INVALID_SOCKET; printf("Fail to bind socket, %dn", fdError()); goto leave; } /* If the socket is bound and TCP, start listening */ if(listen(stcp, 20) < 0) { fdClose( stcp ); printf("Fail to listen on socket, %dn", fdError()); stcp = INVALID_SOCKET; goto leave; } while(1) { size = sizeof(sin1); bzero( &sin1, sizeof(struct sockaddr_in) ); stcp_child = accept(stcp, (PSA)&sin1, &size); //阻塞等待客户端连接 ps = (SOCK *)stcp_child; if(stcp_child == INVALID_SOCKET) { printf("Failed accept due to error: %d n", fdError()); goto leave; } else { printf("successfully got a connection from: %d n",ps->FIP); //创建多线程 Task_Params_init(&TaskParams); TaskParams.priority = 8; TaskParams.stackSize = 0x1000; TaskParams.arg0 = ps->FIP; TaskParams.arg1 = *(xdc_UArg*)&stcp_child; Task_create((Task_FuncPtr)TCP_server_connect_handle, &TaskParams, NULL); // TCP_server_connect_handle(ps->FIP,0); } } leave: if(stcp_child != INVALID_SOCKET) fdClose(stcp_child); if(stcp != INVALID_SOCKET) fdClose(stcp); TaskSleep(2000); fdCloseSession(TaskSelf()); TaskDestroy(TaskSelf()); } |
|
相关推荐
1 条评论
1个回答
|
|
已解决,原因是在NDK系统中,建立一个socket task任务,需要一个文件描述符,加入进去后,用第二种方法就可以正常接发了,也可以连接多个客户端。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
基于 DSP5509 进行数字图像处理中 Sobel 算子边缘检测的硬件连接电路图
2368 浏览 0 评论
684 浏览 0 评论
普中科技F28335开发板中,如何使用aic23播放由代码生成的正弦波
2803 浏览 0 评论
3565 浏览 1 评论
1197 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 06:08 , Processed in 0.599809 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号