VC UDP接收 傳送 廣播

路過人間本尊發表於2020-11-05

測試環境:

Visual Studio 2013 

Windows 10

VC MFC

UDP遠端:ARM Linux C語言程式

效果:

win程式,button1單擊向192.168.168.255傳送字串:"{"Cmd":"GetDeviceInfo"}" ARM板收到返回裝置資訊

ARM板上程式列印資訊:

VC程式碼:

全域性變數

int UDP_Sock_FD = -1;// 套接字
struct sockaddr_in remote_addr;// 遠端,即要傳送到的地方
struct sockaddr_in local_addr;// 本地,本地的IP埠

初始化部分,放在程式初始化中

    // 建立套接字 
	UDP_Sock_FD = socket(AF_INET, SOCK_DGRAM, 0);
	if (UDP_Sock_FD < 0){
		printf("建立套接字失敗\n");
	}else{
		printf("建立套接字成功%d\n", UDP_Sock_FD);
	}
	int optval = 1;//這個值一定要設定,否則可能導致sendto()失敗
	setsockopt(UDP_Sock_FD, SOL_SOCKET, SO_REUSEADDR, (const char *)&optval, sizeof(int));

	// 本地埠和地址
	memset(&local_addr, 0, sizeof(struct sockaddr_in));
	memset(&local_addr, 0, sizeof(local_addr));
	local_addr.sin_family = AF_INET;
	local_addr.sin_port = htons(1257);
	local_addr.sin_addr.s_addr = INADDR_ANY;

	// 目標埠和地址
	memset(&remote_addr, 0, sizeof(struct sockaddr_in));
	remote_addr.sin_family = AF_INET;
	remote_addr.sin_port = htons(1258);
	remote_addr.sin_addr.s_addr = inet_addr("192.168.168.255");//htonl(INADDR_BROADCAST);
	memset(remote_addr.sin_zero, 0, sizeof(remote_addr.sin_zero));
	printf("建立套接字成功%d\n", remote_addr.sin_addr.s_addr);

	// 繫結
	int ret = bind(UDP_Sock_FD, (struct sockaddr *)&local_addr, sizeof(struct sockaddr));
	if (ret < 0){
		printf("繫結失敗\n");
	}else{
		printf("繫結成功 %d\n", ret);
	}

 

傳送函式,放在按鈕事件函式或其它觸發函式

	int sendBytes = 0;
	char msg[128] = "{\"Cmd\":\"GetDeviceInfo\"}";
	if (sendBytes = sendto(UDP_Sock_FD, (char*)msg, strlen(msg), 0, (sockaddr*)&remote_addr, sizeof(remote_addr)) == SOCKET_ERROR){
		printf("sendto fail, errno=%d\n", errno);
		return;
	}
	printf("msg=%s, msgLen=%d, sendBytes=%d\n", msg, strlen(msg), sendBytes);

UDP接收部分,放線上程中

	// 接收位元組數,快取定義
    int recvbytes;
	char recvbuf[1024];
    // 接收部分,放在while中
	memset(recvbuf, 0, sizeof(recvbuf));
	int addrLen = sizeof(struct sockaddr_in);
	if ((recvbytes = recvfrom(UDP_Sock_FD, recvbuf, 1024, 0,(struct sockaddr *)&local_addr, &addrLen)) != -1){
		recvbuf[recvbytes] = '\0';
		printf("Receive UDP Msg Port:%d IP:%s Messgse:%s\n", ntohs(local_addr.sin_port), inet_ntoa(local_addr.sin_addr), recvbuf);
	}else{
		printf("recvfrom fail\n");
	}

相關文章