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