UDP客户端实现在不同端口上发送和接收数据
来源:互联网 发布:数据新闻的采编播优势 编辑:程序博客网 时间:2024/05/16 15:51
普通udp通信,客户端在发送完数据后,只需要在相同socket上,recvfrom即可
服务端给的回应,可以是同一端口,也可以是不同端口,客户端在接收时,需要指点一个本地端口进行接收,此端口也可以用bind和创建的socket绑定。
但是bind必须是在通过这个socket发送数据前绑定,在发送数据后再bind会失败。
下面给出代码:
#define SEND_PORT 8000#define RECV_PORT 8001int sendDataToServer(int iSocket, unsigned char* strSendBuf, int iBufLen){struct sockaddr_in struSendAddr;char strServerIp[16] = "192.168.1.1";bzero(&struSendAddr, sizeof(struSendAddr));struSendAddr.sin_family = AF_INET;inet_pton(AF_INET, strServerIp, &struSendAddr.sin_addr);struSendAddr.sin_port = htons(SEND_PORT);if(iBufLen != sendto(iSocket, (char*)strSendBuf, iBufLen, 0, (struct sockaddr*)&struSendAddr, sizeof(struct sockaddr)) ){printf("sendDeviceStatus send device status failed\n");return ERROR;}}int recvDataFromServer(int iSocket, struct sockaddr_in *pStruRecvAddr){unsigned char strRecvBuf[1024];struct timeval readTimeVal;fd_set readset;int iRet = 0;int iReadLen = 0;int i = 0;//阻塞接收的参数FD_ZERO(&readset);FD_SET(iSocket, &readset);readTimeVal.tv_sec = 1;readTimeVal.tv_usec = 0;iRet = select(iSocket+1, &readset, NULL, NULL, &readTimeVal);if( iRet < 0 ){printf("recv res error! errno=%d(%s)\n", errno, strerror(errno));return ERROR;}else if( 0 == iRet ){printf("recv res overtime!\n");return ERROR;}else{if( FD_ISSET(iSocket, &readset) ){iReadLen = recvfrom(iSocket, strRecvBuf, 1024, 0, (struct sockaddr*)pStruRecvAddr, sizeof(struct sockaddr) );printf("收到server响应 = %s\n", strRecvBuf);}}return OK;}int sendVioInfoToLed(TRAFFIC_RESULT *pTrafficData){int iRet = 0;int iSocket = -1;int iBufLen = -1; //发送数据长度unsigned char strSendBuf[1024]; //发送数据内容struct sockaddr_in struRecvAddr;iSocket = socket(AF_INET, SOCK_DGRAM, 0); //创建udpsocket,数据收、发共用此socketif( iSocket < 0 ){return ERROR;}//接收来自任意ip向端口RECV_PORT发送的数据bzero(&struRecvAddr, sizeof(struRecvAddr));struRecvAddr.sin_family = AF_INET;struRecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);struRecvAddr.sin_port = htons(RECV_PORT);//将接收地址与socket进行绑定,如果此socket在向端口SEND_PORT发送过数据后,bind会失败iRet = bind(iSocket, (struct sockaddr*)&struRecvAddr, sizeof(struct sockaddr_in)); if( iRet < 0){printf("bind recvAddr falied, errno=%d(s)\n", errno, strerror(errno));goto errExit;}iBufLen = strlen(iBufLen);iRet = sendDataToServer(iSocket, strSendBuf, iBufLen);if( iRet < 0){printf("send data to server failed!\n");goto errExit;}iRet = recvDataFromServer(iSocket, &struRecvAddr);if( iRet < 0){printf("recv data from server failed!\n");goto errExit;}close(iSocket);return OK;errExit:close(iSocket);return ERROR;}
0 0
- UDP客户端实现在不同端口上发送和接收数据
- C# WinForm实现UDP发送和接收数据
- UDP利用多线程实现数据的发送和接收
- [C#] 接收和发送UDP数据
- c#中UDP数据发送和接收
- 使用UDP协议发送和接收数据
- 使用UDP协议发送和接收数据
- 使用UDP协议发送和接收数据
- udp 发送和接收结构体数据
- udp发送接收数据
- C# UDP接收不同端口的数据报文
- android 实现UDP发送和接收
- 多线程实现UDP协议发送和接收
- C# UDP 接收客户端指令并发送数据
- UDP 发送和接收
- UDP指定客户端发送端口
- Java基础——实现UDP发送数据和接收数据
- UDP端口传递接收数据
- 贝叶斯
- 指针未被分配内存
- 获取SQL 下一条 将要插入数据 的 主键id 值
- c++串口小结
- noip2003 加分二叉树 (树形dp+分治法,已知中序,输出前序)
- UDP客户端实现在不同端口上发送和接收数据
- 绪论(0)--机器学习与模式识别 [PRML]
- 文章标题
- MCU之CRC计算
- [leetcode]Valid Sudoku C 语言
- 链表的两种实现方法
- 关于shell
- BZOJ 4003([JLOI2015]城池攻占-带标记可合并堆)[Template:带标记可合并堆]
- c# 下载网络图片到本地