【socket】Windows中VC運行的UDP

二、無連接編程(對等編程UDP)
》》服務器編程
1-UDP套接字創建(socket)
2-地址與端口的綁定(bind)
3-數據的收發(sendto/recvfrom)
4-套接字關閉(close)
》》客戶端編程
1-UDP套接字創建(socket)
2-地址與端口的綁定(bind)
3-套接字關閉(close)
server-------------

#include<iostream>
#include<windows.h>
using namespace std;

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

void main()
{
	////////////////////// WSAStartup//////////////////////////
	//該程序功能是讓程序能在Windows上面運行,使之和Linux之上運行一樣
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
 
	wVersionRequested = MAKEWORD( 2, 2 );
 
	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) {
		/* Tell the user that we could not find a usable */
		/* WinSock DLL.                                  */
		return;
	}
 
	/* Confirm that the WinSock DLL supports 2.2.*/
	/* Note that if the DLL supports versions greater    */
	/* than 2.2 in addition to 2.2, it will still return */
	/* 2.2 in wVersion since that is the version we      */
	/* requested.                                        */
 
	if ( LOBYTE( wsaData.wVersion ) != 2 ||
			HIBYTE( wsaData.wVersion ) != 2 ) {
		/* Tell the user that we could not find a usable */
		/* WinSock DLL.                                  */
		WSACleanup( );
		return; 
	}
///////////////////////////////////////////////////////////
	SOCKET sockSer;
	sockSer=socket(AF_INET,SOCK_DGRAM,0);

	SOCKADDR_IN addrSer,addrCli;
	addrSer.sin_family=AF_INET;
	addrSer.sin_port=htons(4040);
	addrSer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

	bind(sockSer,(SOCKADDR*)&addrSer,sizeof(SOCKADDR));
	
	char sendbuf[256];
	char recvbuf[256];
	int len=sizeof(SOCKADDR);
	while(1)
	{
		recvfrom(sockSer,recvbuf,256,0,(SOCKADDR*)&addrCli,&len);
		cout<<"Cli:>"<<recvbuf<<endl;

		cout<<"Ser:>";
		cin>>sendbuf;
		if(strcmp(sendbuf,"quit")==0)
			break;
		sendto(sockSer,sendbuf,strlen(sendbuf)+1,0,(SOCKADDR*)&addrCli,len);
	}
	closesocket(sockSer);

///////////////////
	WSACleanup();
////////////之前加的WSAStartup在這塊要被clean 掉/
}

client-----------------------

#include<iostream>
#include<windows.h>
using namespace std;

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

void main()
{
	////////////////////// WSAStartup//////////////////////////
	//該程序功能是讓程序能在Windows上面運行,使之和Linux之上運行一樣
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
 
	wVersionRequested = MAKEWORD( 2, 2 );
 
	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) {
		/* Tell the user that we could not find a usable */
		/* WinSock DLL.                                  */
		return;
	}
 
	/* Confirm that the WinSock DLL supports 2.2.*/
	/* Note that if the DLL supports versions greater    */
	/* than 2.2 in addition to 2.2, it will still return */
	/* 2.2 in wVersion since that is the version we      */
	/* requested.                                        */
 
	if ( LOBYTE( wsaData.wVersion ) != 2 ||
			HIBYTE( wsaData.wVersion ) != 2 ) {
		/* Tell the user that we could not find a usable */
		/* WinSock DLL.                                  */
		WSACleanup( );
		return; 
	}
///////////////////////////////////////////////////////////
	SOCKET sockCli;
	sockCli=socket(AF_INET,SOCK_DGRAM,0);

	SOCKADDR_IN addrSer;
	addrSer.sin_family=AF_INET;
	addrSer.sin_port=htons(4040);
	addrSer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

	char sendbuf[256];
	char recvbuf[256];
	int len=sizeof(SOCKADDR);
	while(1)
	{
		cout<<"Cli:>";
		cin>>sendbuf;
		if(strcmp(sendbuf,"quit")==0)
			break;
		sendto(sockCli,sendbuf,strlen(sendbuf)+1,0,(SOCKADDR*)&addrSer,len);

		recvfrom(sockCli,recvbuf,256,0,(SOCKADDR*)&addrSer,&len);
		cout<<"Ser:>"<<recvbuf<<endl;
	}
	closesocket(sockCli);

///////////////////
	WSACleanup();
////////////之前加的WSAStartup在這塊要被clean 掉/
}

注: 在UDP編程中因爲服務器可以同時一對多傳送數據,因此需要客戶端首先發送數據,客戶端可以輕易找到服務端,但是服務端是不能首先找到客戶端的。

發佈了45 篇原創文章 · 獲贊 25 · 訪問量 3065
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章