套接字之udp通信

简言

  UDP (User Datagram Protocol)用户数据报协议,udp对系统资源没有tcp多,使用数据报文,不保证数据的完整性.

服务端server.c

单向服务端流程

  1. 创建socket
  2. 接收
  3. 关闭

代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#include <Windows.h>

#pragma comment (lib,"ws2_32.lib")

int main(int argc, char *argv[])
{
	char str[128] = { 0 };
	int length = 0;

	//接收
	SOCKET socket_server;
	//地址
	SOCKADDR_IN address_server;
	SOCKADDR_IN address_client;
	//版本
	WORD version = MAKEWORD(2, 2);

	WSADATA wsadata;

	//获取版本,建立通信
	int result = WSAStartup(version, &wsadata);
	if (result != 0)
	{
		printf("出现错误!\n");
		return 0;
	}
	if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
	{
		printf("版本有误!\n");
		return 0;
	}
	socket_server = socket(AF_INET, SOCK_DGRAM, 0);
	address_server.sin_family = AF_INET;
	//获取本地启动
	address_server.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	address_server.sin_port = htons(8089);

	//进行绑定
	bind(socket_server, &address_server, sizeof(SOCKADDR));
	//获取长度
	length = sizeof(SOCKADDR);

	while (1)
	{
		recvfrom(socket_server, str, 128, 0, &address_client, &length);
		printf("接收内容:%s\n", str);
		system(str);
		memset(str, 0, 128);
	}

	closesocket(socket_server);
	WSACleanup();
	system("pause");
	return 0;
}

客户端client.c

单向客户端流程(只发送)

  1. 创建socket
  2. 发送
  3. 关闭

代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#include <Windows.h>

#pragma comment (lib,"ws2_32.lib")

int main(int argc, char *argv[])
{
	//套接字
	SOCKET socket_client;
	//地址
	SOCKADDR_IN address_in;
	//版本
	WORD version = MAKEWORD(2, 2);
	// 保存Windows套接字调用返回的初始化信息
	WSADATA wsadata;

	//获取版本,建立通信
	int result = WSAStartup(version, &wsadata);
	if (result != 0)
	{
		printf("出现错误!\n");
		return 0;
	}
	if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
	{
		printf("版本有误!\n");
		return 0;
	}

	//初始化
	socket_client = socket(AF_INET, SOCK_DGRAM, 0);

	address_in.sin_family = AF_INET;
	address_in.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	address_in.sin_port = htons(8089);

	while (1)
	{
		char str[128] = { 0 };
		scanf("%s", str);
		sendto(socket_client, str, strlen(str) + 1, 0, &address_in, sizeof(SOCKADDR));
	}
	//关闭socket
	closesocket(socket_client);  
	//WSACleanup和WSAStartup对应
	WSACleanup();
	system("pause");
	return 0;
}


秋风 2016-07-26