第一步:先用VS建立两个项目服务器端项目cli_test.sln
另一个为客户端项目cli_test.sln。
第二步:在服务器和客户端项目中写入所属程序代码
UDP协议的通信:
WIN32控制台程序,不过启动的时候不用像TCP一样必须要先启动服务器端,可以先启动客户端,再启动服务器端,可以启动若干个客户端,注意:只能启动一个服务器端。
服务器端代码
//sockServ.cpp
#include
#include
#include
#pragma comment(lib, "WS2_32") // 链接到WS2_32.lib
using namespace std;
#define PORT 5000
//#define IP_ADDRESS "192.168.1.145"
#define IP_ADDRESS "127.0.0.1"
int main(int argc, char* argv[])
{
WSADATA Ws;
SOCKET ServerSocket, CientSocket = 0;
struct sockaddr_in LocalAddr, ClientAddr;//sockaddr_in是TCP/IP使用的数据结构
int Ret = 0;
int AddrLen = 0;
char RecvBuffer[MAX_PATH] = { 0 };
char SendBuffer[MAX_PATH] = { 0 };
//Init Windows Socket
if (WSAStartup(MAKEWORD(2, 2), &Ws) != 0)//socket使用2.2版本的
{
cout << "Init Windows Socket Failed::" << GetLastError() << endl;
return -1;
}
//Create Socket
//第一个参数表示是INTERNET协议簇,第二个参数SOCK_STREAM表示是用TCP协议来进行通信。第三个参数是0表示让系统自动选择
ServerSocket = socket(AF_INET, SOCK_DGRAM, 0);
//ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ServerSocket == INVALID_SOCKET)
{
cout << "Create Socket Failed::" << GetLastError() << endl;
return -1;
}
LocalAddr.sin_family = AF_INET;//INTERNET协议簇
//LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
//LocalAddr.sin_addr.S_un.S_addr = INADDR_ANY;
LocalAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
LocalAddr.sin_port = htons(PORT);
memset(LocalAddr.sin_zero, 0x00, 8);
//Bind Socket
Ret = bind(ServerSocket, (sockaddr*)&LocalAddr, sizeof(LocalAddr));
if (SOCKET_ERROR == Ret)
{
cout << "Bind Socket Failed::" << GetLastError() << endl;
return -1;
}
int saddrlen = sizeof(sockaddr_in);
cout << "服务器端启动啦……" << endl;
while (1)
{
memset(RecvBuffer, 0, sizeof(RecvBuffer));
memset(SendBuffer, 0, sizeof(SendBuffer));
Ret = recvfrom(ServerSocket, RecvBuffer, MAX_PATH, 0, (sockaddr*)&ClientAddr, &saddrlen);
if (SOCKET_ERROR == Ret)
{
cout << "服务器端接收数据错了!" << endl;
}
else
{
cout << "我是服务器端,我从客户端 " << inet_ntoa(ClientAddr.sin_addr) <<
" 接收的数据为:" << RecvBuffer << endl;
cout << "服务器端向客户端发送如下的数据,快点在此输入吧!:" << endl;
cin.getline(SendBuffer, sizeof(SendBuffer));
Ret = sendto(ServerSocket, SendBuffer, (int)strlen(SendBuffer), 0, (sockaddr*)&ClientAddr, saddrlen);
if (SOCKET_ERROR == Ret)
{
cout << "服务器端发送数据错了!" << endl;
}
}
}
closesocket(ServerSocket);
closesocket(CientSocket);
WSACleanup();
return 0;
}
客户端的程序如下
//sockCli.cpp
#include
#include
#include
using namespace std;
#pragma comment(lib, "WS2_32") // 链接到WS2_32.lib
#define PORT 5000
//#define IP_ADDRESS "192.168.1.145"
#define IP_ADDRESS "127.0.0.1"
int main(int argc, char* argv[])
{
WSADATA Ws;
SOCKET CientSocket;
struct sockaddr_in ServerAddr;
int Ret = 0;
int AddrLen = 0;
HANDLE hThread = NULL;
char SendBuffer[MAX_PATH];
char RecvBuffer[MAX_PATH];
//Init Windows Socket
if (WSAStartup(MAKEWORD(1, 1), &Ws) != 0)//客户端用的SOCKET库的版本和服务器端一样,就算不一样,也可以正常通信
{
cout << "Init Windows Socket Failed::" << GetLastError() << endl;
return -1;
}
//Create Socket
CientSocket = socket(AF_INET, SOCK_DGRAM, 0);//创建了一个客户端的SOCKET
if (CientSocket == INVALID_SOCKET)
{
cout << "Create Socket Failed::" << GetLastError() << endl;
return -1;
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
ServerAddr.sin_port = htons(PORT);
memset(ServerAddr.sin_zero, 0x00, 8);
int saddrlen = sizeof(sockaddr_in);
while (1)
{
memset(RecvBuffer, 0, sizeof(RecvBuffer));
memset(SendBuffer, 0, sizeof(SendBuffer));
cout << "你是客户端哦,快点给服务器端说点什么吧,好让它知道你的存在!:" << endl;
cin.getline(SendBuffer, sizeof(SendBuffer));
Ret = sendto(CientSocket, SendBuffer, (int)strlen(SendBuffer), 0, (sockaddr*)&ServerAddr, saddrlen);
if (SOCKET_ERROR == Ret)
{
cout << "客户端发送数据错了!" << endl;
}
else
{
Ret = recvfrom(CientSocket, RecvBuffer, MAX_PATH, 0, (sockaddr*)&ServerAddr, &saddrlen);
if (SOCKET_ERROR == Ret)
{
cout << "客户端接收数据错了!" << endl;
}
else
{
cout << "我是客户端,我从服务器端 " << inet_ntoa(ServerAddr.sin_addr) <<
" 接收的数据为:" << RecvBuffer << endl;
}
}
}
closesocket(CientSocket);
WSACleanup();
return 0;
}
建立socket通信
新手小白第一次写,请批评指教!
精彩内容
发表评论