http://www.cnblogs.com/zengqinglei
本篇文章主要实现Socket在Udp协议下相互通讯的方式。(服务器端与客户端的通讯)
基于Udp协议是无连接模式通讯,占用资源少,响应速度快,延时低。至于可靠性,可通过应用层的控制来满足。(不可靠连接)
(1).建立一个套接字(Socket)
(2).绑定服务器端IP地址及端口号--服务器端
(3).通过SendTo()方法向指定主机发送消息(需提供主机IP地址及端口)
(4).通过ReciveFrom()方法接收指定主机发送的消息(需提供主机IP地址及端口)

服务器 端
#include <stdio.h>
#include <WINSOCK2.H>
#include<iostream>
#include<time.h>
#pragma comment(lib,"WS2_32.lib")
#define BUF_SIZE 64
using namespace std;
int main(void)
{
SYSTEMTIME st = { 0 };
GetLocalTime(&st);
printf("%02d:%02d:%02d\n",
st.wHour,
st.wMinute,
st.wSecond);
cout << "udp连接1" << endl;
WSADATA wsd;
SOCKET s;
int nRet;
// 初始化套接字动态库
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
printf("WSAStartup failed !/n");
return 1;
}
// 创建套接字
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
{
printf("socket() failed ,Error Code:%d/n", WSAGetLastError());
WSACleanup();
return 1;
}
SOCKET socketSrv = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addrSrv;
SOCKADDR_IN addrClient;
char buf[BUF_SIZE];
int len = sizeof(SOCKADDR);
// 设置服务器地址
ZeroMemory(buf, BUF_SIZE);
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.1.0.2");
//htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(8888);
// 绑定套接字
nRet = bind(socketSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
if (SOCKET_ERROR == nRet)
{
printf("bind failed !/n");
closesocket(s);
WSACleanup();
return -1;
}
// 从客户端接收数据
//getchar();
printf("%02d:%02d:%02d\n",
st.wHour,
st.wMinute,
st.wSecond);
cout << "udp连接2" << endl;
nRet = recvfrom(socketSrv, buf, BUF_SIZE, 0, (SOCKADDR*)&addrClient, &len);
printf("%02d:%02d:%02d\n",
st.wHour,
st.wMinute,
st.wSecond);
cout << "udp连接3" << endl;
if (SOCKET_ERROR == nRet)
{
printf("recvfrom failed !/n");
closesocket(s);
WSACleanup();
return -1;
}
// 打印来自客户端发送来的数据
printf("Recv From Client:%s/n", buf);
cout << endl;
// 向客户端发送数据
cout <<"发送数据"<< endl;
char a[20];
cin >> a;
sendto(socketSrv, a, 20, 0, (SOCKADDR*)&addrClient, len);
closesocket(s);
WSACleanup();
system("pause");
return 0;
}
客户端
#include <stdio.h>
#include <WINSOCK2.H>
#include<iostream>
#include<time.h>
#pragma comment(lib,"WS2_32.lib")
#define BUF_SIZE 64
using namespace std;
int main(void)
{
SYSTEMTIME st = { 0 };
GetLocalTime(&st);
printf("%02d:%02d:%02d\n",
st.wHour,
st.wMinute,
st.wSecond);
cout << "udp连接1" << endl;
WSADATA wsd;
SOCKET s;
// 初始化套接字动态库
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
printf("WSAStartup failed !/n");
return 1;
}
// 创建套接字
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
{
printf("socket() failed, Error Code:%d/n", WSAGetLastError());
WSACleanup();
return 1;
}
char buf[BUF_SIZE]; // 接受数据
SOCKADDR_IN servAddr; // 服务器套接字地址
SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0);
int nRet;
ZeroMemory(buf, BUF_SIZE);
strcpy(buf, "UDP Hello server");
// 设置服务器地址
servAddr.sin_family = AF_INET;
servAddr.sin_addr.S_un.S_addr = inet_addr("127.1.0.2");
servAddr.sin_port = htons(8888);
// 向服务器发送数据
int nServAddLen = sizeof(servAddr);
printf("%02d:%02d:%02d\n",
st.wHour,
st.wMinute,
st.wSecond);
cout << "udp连接2" << endl;
if (sendto(sockClient, buf, BUF_SIZE, 0, (sockaddr *)&servAddr, nServAddLen) == SOCKET_ERROR)
{
printf("recvfrom() failed:%d/n", WSAGetLastError());
closesocket(s);
WSACleanup();
getchar();
return 1;
}
printf("%02d:%02d:%02d\n",
st.wHour,
st.wMinute,
st.wSecond);
cout << "udp连接3" << endl;
nRet = recvfrom(sockClient, buf, BUF_SIZE, 0, (sockaddr *)&servAddr, &nServAddLen);
if (SOCKET_ERROR == nRet)
{
printf("recvfrom failed !/n");
closesocket(s);
WSACleanup();
getchar();
return -1;
}
// 打印来自服务端发送来的数据
printf("%02d:%02d:%02d\n",
st.wHour,
st.wMinute,
st.wSecond);
cout << "udp连接4" << endl;
printf("Recv From Server:%s/n", buf);
closesocket(s);
WSACleanup();
getchar();
return 0;
}
先启动服务端 接收信息 等待客户端连接 客户端连接成功 发送消息 服务端发送信息给客户端 。