⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udp_svr.cpp

📁 实现了C8051F340单片机依据UDP协议传输数据
💻 CPP
字号:
/* UDP echo server to be run against Silicon Laboratories MODEM-DK in UDP echo client mode.

	compile with: cl udp_svr.cpp wsedesc.cpp wsock32.lib

	PJB, 11/20/01
*/
#include <stdio.h>
#include <winsock.h>

// Function prototype
void DatagramServer(short nPort);

// Helper macro for displaying errors
LPCSTR WSErrorDescription(int);
#define PRINTERROR(s)	\
		fprintf(stderr,"\n%s: %s\n", s, WSErrorDescription(WSAGetLastError()))

////////////////////////////////////////////////////////////

void main(void)
{
	WORD wVersionRequested = MAKEWORD(1,1);
	WSADATA wsaData;
	int nRet;
	short nPort;


	nPort = 7;		// well known echo port
	
	//
	// Initialize WinSock and check version
	//
	nRet = WSAStartup(wVersionRequested, &wsaData);
	if (nRet != 0 || wsaData.wVersion != wVersionRequested)
	{	
		fprintf(stderr,"\nError: wrong WinSock version\n");
		return;
	}

	//
	// Do all the stuff a datagram server does
	//
	DatagramServer(nPort);
	
	//
	// Release WinSock
	//
	WSACleanup();
}

////////////////////////////////////////////////////////////

void DatagramServer(short nPort)
{
	//
	// Create a UDP/IP datagram socket
	//
	SOCKET theSocket;

	theSocket = socket(AF_INET,		// Address family
					   SOCK_DGRAM,  		// Socket type
					   IPPROTO_UDP);		// Protocol
	if (theSocket == INVALID_SOCKET)
	{
		PRINTERROR("socket()");
		return;
	}

	
	//
	// Fill in the address structure
	//
	SOCKADDR_IN saServer;

	saServer.sin_family = AF_INET;
	saServer.sin_addr.s_addr = INADDR_ANY; // Let WinSock assign address
	saServer.sin_port = htons(nPort);	   // Use port passed from user


	//
	// bind the name to the socket
	//
	int nRet;

	nRet = bind(theSocket,				// Socket descriptor
				(LPSOCKADDR)&saServer,  // Address to bind to
				sizeof(struct sockaddr)	// Size of address
				);
	if (nRet == SOCKET_ERROR)
	{
		PRINTERROR("bind()");
		closesocket(theSocket);
		return;
	}


	//
	// print out where the server is waiting
	//
	int nLen;
	nLen = sizeof(SOCKADDR);
	char szBuf[1500];

	nRet = gethostname(szBuf, sizeof(szBuf));
	if (nRet == SOCKET_ERROR)
	{
		PRINTERROR("gethostname()");
		closesocket(theSocket);
		return;
	}

	//
	// Show the server name and port number
	//
	printf("\nUDP Echo Server %s is waiting...\n",szBuf);

	long lPacket = 0L;

	while (1)
		{
		//
		// Wait for data from the client
		//
		SOCKADDR_IN saClient;

		memset(szBuf, 0, sizeof(szBuf));
		nRet = recvfrom(theSocket,				// Bound socket
					szBuf,							// Receive buffer
					sizeof(szBuf),					// Size of buffer in bytes
					0,									// Flags
					(LPSOCKADDR)&saClient,		// Buffer to receive client address 
					&nLen);							// Length of client address buffer
		if (nRet == SOCKET_ERROR)
			{
			PRINTERROR("recvfrom()");
			break;
			}

		//
		// Show that we've received some data
		//
		++lPacket;
		printf("\nReceived #%ld: %s",lPacket, szBuf);

		//
		// Send data back to the client
		//
		nRet = sendto(theSocket,		// Bound socket
		   szBuf,							// Send buffer
		   strlen(szBuf),					// Length of data to be sent
		   0,									// Flags
		   (LPSOCKADDR)&saClient,		// Address to send data to
		   nLen);							// Length of address
		if (nRet == SOCKET_ERROR)
			{
			PRINTERROR("sendto()");
			break;
			}

		}

	closesocket(theSocket);
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -