UDP套接字---windows

1.服务端

#pragma comment(lib,"ws2_32.lib")//动态链接库

#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>

void main(void)
{
	WSADATA       wsaData;
	SOCKET        ReceivingSocket;
	SOCKADDR_IN   ReceiverAddr;
	SOCKADDR_IN   SenderAddr;
	int           SenderAddrSize;
	int           Port = 5150;
	int           Ret;

	SenderAddrSize = sizeof(SenderAddr);

	if((Ret = WSAStartup(MAKEWORD(2,2),&wsaData)) != 0)//使用2.2版本
	{
		printf("WSAStartup failed with error %d\n", Ret);
		return;
	}
	else
	{
		if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)//检查实际初始化的是否就是2.2版本
		{
		   printf("Error: not winsock 2.2\n");
           WSACleanup();
		   return;
		}
	}
	if((ReceivingSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)) == INVALID_SOCKET)
	{
	    printf("socket failed with error %d\n", WSAGetLastError());
		WSACleanup();
		return;
	}

	ReceiverAddr.sin_family = AF_INET;
	ReceiverAddr.sin_port = htons(Port);
	ReceiverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	if(bind(ReceivingSocket,(SOCKADDR*)&ReceiverAddr,sizeof(ReceiverAddr)) == SOCKET_ERROR)
	{
		printf("bind failed with error %d\n", WSAGetLastError());
		closesocket(ReceivingSocket);
		WSACleanup();
		return;
	}

	while(1)
	{
	    char buffer[1024] = "\0";
		printf("waiting for message from others ... \n");
		if((Ret = recvfrom(ReceivingSocket,buffer,sizeof(buffer),0,(SOCKADDR*)&SenderAddr,&SenderAddrSize)) == SOCKET_ERROR)
		{/*
		int  recvfrom( SOCKET s, char FAR* buf, int len, int flags,struct sockaddr FAR* from, int FAR* fromlen)
 		s:标识一个已连接套接口的描述字。
  		buf:接收数据缓冲区。
  		len:缓冲区长度。
  		flags:调用操作方式。
  		from:(可选)指针,指向装有源地址的缓冲区。
  		fromlen:(可选)指针,指向from缓冲区长度值
		 */
		    printf("Error:recvfrom failed with error %d\n",WSAGetLastError());
			closesocket(ReceivingSocket);
			WSACleanup();
		    return;
		}
		else
		{
		    printf("Received datagram from %s -- %s\n", inet_ntoa(SenderAddr.sin_addr),buffer);
			sendto(ReceivingSocket,buffer,sizeof(buffer),0,(SOCKADDR*)&SenderAddr,SenderAddrSize);
			/*
			sendto函数:指向一指定目的地发送数据,sendto()适用于发送未建立连接的UDP数据包
			sockfd: 套接字
			buf: 待发送数据的缓冲区
			len: 缓冲区长度
			flags:调用方式标志位, 一般为0, 改变Flags,将会改变Sendto发送的形式:阻塞
			addr:(可选)指针,指向目的套接字的地址
			addr:lenaddr所指地址的长度
			*/
		
		}
		Sleep(500);
	}
	closesocket(ReceivingSocket);
	WSACleanup();
	
	system("pause");

}

2.客户端

#pragma comment(lib,"ws2_32.lib")//动态链接库

#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>

void main(int argc, char **argv)
{
	WSADATA       wsaData;
	SOCKET        SendingSocket;
	SOCKADDR_IN   ReceiverAddr;
	int           Port = 5150;
	int           ReceiverAddrSize =sizeof(ReceiverAddr);

	if(argc <= 1)
	{
		printf("USAGE: UDPClinet <receiver IP address>. \n");
		system("pause");
		return;
	}

	WSAStartup(MAKEWORD(2,2),&wsaData);
	SendingSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
	
	ReceiverAddr.sin_family = AF_INET;
	ReceiverAddr.sin_port = htons(Port);
	ReceiverAddr.sin_addr.S_un.S_addr = inet_addr(argv[1]);
	
	while(1)
	{
	    char buffer[1024] = "\0";
		printf("Input message\n");
		scanf("%s",buffer);
		if(strcmp(buffer,"bye") ==0)
			break;
		if(sendto(SendingSocket,buffer,sizeof(buffer),0,(SOCKADDR*)&ReceiverAddr,sizeof(ReceiverAddr))!=SOCKET_ERROR)
		{
		    if(recvfrom(SendingSocket,buffer,sizeof(buffer),0,(SOCKADDR*)&ReceiverAddr,&ReceiverAddrSize)!=SOCKET_ERROR)
			{
				printf("Received from server: %s\n",buffer);
		    
		    }
	  }
	}
	    closesocket(SendingSocket);
	    WSACleanup();
		system("pause");

}

在这里插入图片描述

发布了10 篇原创文章 · 获赞 0 · 访问量 2356

猜你喜欢

转载自blog.csdn.net/qq_42250189/article/details/104612966