UDP服务器端程序(C语言)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hxxjxw/article/details/84986225

UDP服务器端程序,与UDP客户端程序配合使用

Visual Stdio 运行

// UDP服务器端.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<stdio.h>
#include<winsock2.h>
#pragma comment (lib,"ws2_32")
int main()
{
	//WSA是web server API的简写
	WSADATA wsaData;

	printf("init socket ...\n");

	WSAStartup(MAKEWORD(2, 2), &wsaData);
	//在使用winsock相关函数时需要对winsock库进行初始化,而在使用完成后需要对winsock库进行释放
	//需要初始化winsock库的版本号
	//一个指向WSADATA的指针。该函数的返回值为0,说明函数调用成功。如果调用失败,则返回其他值
	//MAKEWORD是合成一个字,用来表示版本信息的
	
	printf("init successfully\n");
	printf("create TCP socket...\n");

	SOCKET sServer = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
	//创建套接字
	//指定地址族  AF表示地址族,PF表示协议族
	//指定新套接字描述符的类型
	//指定应用程序所使用的通信协议	
	//sServer就成了一个套接字描述符

	printf("socket create successfully\n");

	struct sockaddr_in ServerAddr;
	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	//ServerAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	ServerAddr.sin_port = htons(1234);
		//htons() 转换字节序
	//对sockaddr_in结构体填充地址、端口等信息


	bind(sServer, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr));
	//绑定套接字与地址信息
	//新创建的套接字描述符
	//一个sockaddr结构体,提供套接字一个地址和端口信息
	//sockaddr结构体大小

	printf("bind successfully\n");

	char szMsg[MAXBYTE] = { 0 };
	struct sockaddr_in ClientAddr;
	int nSize = sizeof(ClientAddr);
	recvfrom(sServer, szMsg, MAXBYTE, 0, (SOCKADDR*)&ClientAddr, &nSize);
	//该函数是UDP协议双方用来接受数据的函数
	//套接字描述符
	//要发送数据的缓冲区
	//指定第二个参数的长度
	//通常赋0值
	//一个指向sockaddr结构体的指针,这里给出接受消息的地址信息    
	//指定第五个参数的长度
	//之后ClientAddr存的就是接收到的地址信息
	printf("Client Msg: %s \r\n", szMsg);
	printf("ClientIP=%s:%d\r\n", inet_ntoa(ClientAddr.sin_addr), ntohs(ClientAddr.sin_port));

	lstrcpy(szMsg, "Hello Client!\r\n");
	nSize = sizeof(ClientAddr);
	sendto(sServer, szMsg, strlen(szMsg) + sizeof(char), 0, (SOCKADDR*)&ClientAddr, nSize);
	//该函数是用在UDP协议通信双方进行发送数据的函数,用法与recvfrom相同


	WSACleanup();//释放winsock库
	
	
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/hxxjxw/article/details/84986225