第一步:先用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通信

 新手小白第一次写,请批评指教!

精彩内容

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: