二、無連接編程(對等編程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編程中因爲服務器可以同時一對多傳送數據,因此需要客戶端首先發送數據,客戶端可以輕易找到服務端,但是服務端是不能首先找到客戶端的。