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; }
先启动服务端 接收信息 等待客户端连接 客户端连接成功 发送消息 服务端发送信息给客户端 。