server-socket
#include "stdafx.h" #include "winsock2.h" #include <iostream> #include <string> #include <cassert> #include <thread> #include <mutex> #include <vector> #include <algorithm> #pragma comment(lib,"ws2_32.lib") std::vector<SOCKET> allsock; std::mutex mt; void sendtoall(std::string msg) { mt.lock(); for (auto e = allsock.begin(); e != allsock.end();++e) { send(*e, msg.c_str(), msg.size() + 1, 0); } mt.unlock(); } void t_send_recv(SOCKET acc_sock, struct sockaddr_in acc_addr) { std::string msg; std::string info = inet_ntoa(acc_addr.sin_addr); auto port = acc_addr.sin_port; char ch[1024]; memset(ch,0,1024); sprintf(ch,":%d",port); info += ch; msg = info + ":已登录"; sendtoall(msg); char recvBuffer[1024]; memset(recvBuffer, 0, sizeof(recvBuffer)); int byte; while ((byte = recv(acc_sock, recvBuffer, sizeof(recvBuffer), 0)) > 0) { std::cout << info << "说:" << recvBuffer << std::endl; msg = info + "说:\r\n\t" + recvBuffer; sendtoall(msg); memset(recvBuffer, 0, sizeof(recvBuffer)); std::this_thread::sleep_for(std::chrono::milliseconds(1)); } } void t_accept(SOCKET lis_sock) { SOCKET acc_sock; struct sockaddr_in acc_addr; int len = sizeof(acc_addr); while (1) { acc_sock = accept(lis_sock, (struct sockaddr*)&acc_addr, &len); if (acc_sock == INVALID_SOCKET) { std::cout << "有一个连接未成功" << std::endl; continue; } auto port = acc_addr.sin_port; char ch[1024]; memset(ch, 0, 1024); sprintf(ch, ":%d", port); std::cout << inet_ntoa(acc_addr.sin_addr) << ch << ":连接成功" << std::endl; mt.lock(); allsock.push_back(acc_sock); mt.unlock(); std::thread t_sr(t_send_recv, acc_sock, acc_addr); t_sr.detach(); std::this_thread::sleep_for(std::chrono::milliseconds(1)); } } int main() { // =========套接字部分========= WORD wVersionRequested; WSADATA wsa; int err; wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsa); if (err != 0) { std::cout << "套接字创建失败" << std::endl; exit(-1); } std::cout << "套接字已创建" << std::endl; // =========监听socket========= SOCKET lis_sock; lis_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //==========协议地址========== struct sockaddr_in lis_addr; lis_addr.sin_family = AF_INET; lis_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); lis_addr.sin_port = htons(6688); //==========绑定监听socket与协议地址========= int bind_res = bind(lis_sock, (struct sockaddr*)&lis_addr, sizeof(lis_addr)); if (bind_res == SOCKET_ERROR) { std::cout << "绑定套接字与协议地址失败" << std::endl; exit(-1); } std::cout << "绑定套接字成功" << std::endl; //======设置监听的数量===== int listen_res = listen(lis_sock, 10); if (listen_res == SOCKET_ERROR) { std::cout << "监听套接字失败" << std::endl; exit(-1); } std::cout << "监听套接字成功" << std::endl; //===========开始处理连接============= std::thread accept_thread(t_accept, lis_sock); accept_thread.join(); getchar(); exit(0); }client-socket
#include "stdafx.h" #include "winsock2.h" #include <iostream> #include <string> #include <cassert> #include <thread> #include <mutex> #pragma comment(lib,"ws2_32.lib") void sendmsg(SOCKET sock); void recvmsg(SOCKET sock); std::mutex mt; void sendmsg(SOCKET sock) { char sendBuffer[1024]; memset(sendBuffer,0,1024); int byte = 0; std::cin >> sendBuffer; byte = send(sock, sendBuffer, strlen(sendBuffer) + 1, 0); recvmsg(sock); std::this_thread::sleep_for(std::chrono::milliseconds(1)); closesocket(sock); } void recvmsg(SOCKET sock) { char recvBuffer[1024]; int byte = 0; byte = recv(sock, recvBuffer, strlen(recvBuffer) + 1, 0); recvBuffer[byte] = 0; std::cout << recvBuffer << std::endl; sendmsg(sock); std::this_thread::sleep_for(std::chrono::milliseconds(1)); closesocket(sock); } int main() { // =========套接字部分========= WORD wVersionRequested; WSADATA wsa; int err; wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsa); if (err != 0) { std::cout << "套接字创建失败" << std::endl; exit(-1); } std::cout << "套接字已创建" << std::endl; // ==========客户端socket======= SOCKET client_sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); // ==========客户端协议地址=========== struct sockaddr_in client_addr; client_addr.sin_family = AF_INET; client_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); client_addr.sin_port = htons(6688); //===========开始处理连接============= SOCKET acc_sock; acc_sock = connect(client_sock, (struct sockaddr*)&client_addr, sizeof(client_addr)); if (acc_sock == INVALID_SOCKET) { std::cout << "没有连接到服务器" << std::endl; } std::cout << "连接到服务器" << std::endl; std::thread b(recvmsg, client_sock); b.join(); std::this_thread::sleep_for(std::chrono::milliseconds(1)); getchar(); exit(0); }