socket實現UDP通信

UDP與TCP不同,是一種無連接的通信方式,相比TCP而言更加靈活。

利用socket實現UDP的方式相比TCP而言也更加簡單。

發送方:

1.初始化套接字

2.創建socket

3.利用sendto發送數據(TCP是send)

4.關閉socket

接收方:

1.初始化套接字

2.創建socket並與本機進行綁定

3.利用recvfrom接收數據

4.關閉socket


有以下兩個函數是UDP通信獨有的

1.int sendto(SOCKET 發送的套接字,char* 發送的字符串,int 緩衝區長度,int 函數調用方式一般爲0,sockaddr* 目標地址結構體指針,int 地址長度)

sendto是UDP專門的數據發送方式,send()用於TCP SOCK_STREAM,sendto()用於UDP SOCK_DGRAM,返回發送字節的數目,失敗返回SOCKET_ERROR

2.int recvfrom(SOCKET 接收的socket,char* 接收的字符串,int 緩衝區長度,int 函數調用方式一般爲0,sockaddr* 源地址結構體指針,int 地址長度)


UDP發送方程序:

#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#include <string>
#include <iostream>
#pragma comment(lib,"WS2_32.lib")

int main()
{
	int retval;
	std::string str;
	char buf[20];
	WSADATA wsa;
	SOCKET s;
	sockaddr_in addr_in;
	WSAStartup(MAKEWORD(2, 2), &wsa);
	s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	addr_in.sin_family = AF_INET;
	addr_in.sin_port = htons(9000);
	printf("input an ip address: \n");
	scanf("%s", buf);
	addr_in.sin_addr.S_un.S_addr = inet_addr(buf);
	getchar();
	while (1)
	{
		printf("input the content:\n");
		memset(buf, 0, sizeof(buf));
		std::getline(std::cin, str);
		strcpy(buf, str.c_str());
		retval = sendto(s, buf, sizeof(buf), 0, (sockaddr*)&addr_in, sizeof(addr_in));
		if (retval == SOCKET_ERROR)
		{
			printf("send failed\n");
			closesocket(s);
			WSACleanup();
			return -1;
		}
		printf("send succeeded\n\n");
	}
	closesocket(s);
	WSACleanup();
	return 0;
}

接收方程序:

#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"WS2_32.lib")

int main()
{
	char buf[20];
	sockaddr_in addr_in;
	SOCKET s;
	WSADATA wsa;
	int len;
	WSAStartup(MAKEWORD(2, 2), &wsa);
	s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	addr_in.sin_family = AF_INET;
	addr_in.sin_port = htons(9000);
	addr_in.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	bind(s, (sockaddr*)&addr_in, sizeof(addr_in));
	len = sizeof(addr_in);
	while (1)
	{
		memset(buf, 0, sizeof(buf));
		recvfrom(s, buf, sizeof(buf), 0, (sockaddr*)&addr_in, &len);
		printf("from: %s\n", inet_ntoa(addr_in.sin_addr));
		printf("content: %s\n", buf);
	}
	closesocket(s);
	WSACleanup();
    return 0;
}

運行結果如下:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章