第一步:先用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通信
新手小白第一次写,请批评指教!



