本文内容大部分来源于
https://www.bilibili.com/video/BV1tb4y1C7qm?spm_id_from=333.337.search-card.all.click
在此基础上稍作修改,实现了不同主机的通信
- C++实现同一局域网下不同主机的socket通信
- 一、项目结构
- 二、tcpSocket
- h文件
- cpp文件
- 三、客户端
- cpp文件
- 四、服务端
- cpp文件
一、项目结构
二、tcpSocket h文件
#ifndef _TCPSOCKET_H_ #define _TCPSOCKET_H_ #include//windows平台网络库头文件 #include #pragma comment(lib,"ws2_32.lib")//库文件 #define PORT 8888 #define err(A) cout< cpp文件 #include"tcpSocket.h" #include三、客户端 cpp文件#include using namespace std; #define _WINSOCK_DEPRECATED_NO_WARNINGS bool init_Socket() { //windows socket async 异步套接字 //请求版本,传出参数 WSADATA wsadata;//WSADATA,一种数据结构。这个结构被用来存储被WSAStartup函数调用后返回的Windows Sockets数据。它包含Winsock.dll执行的数据。 if (WSAStartup(MAKEWORd(2, 2), &wsadata) != 0) { err("WSAStartup failed code "); return false; } return true; } bool close_Socket() { if (WSACleanup() != 0)//关闭#pragma comment(lib,"ws2_32.lib")库文件 { err("WSACleanup failed code "); return false; } return false; } SOCKET createServerSocket() { //创建空的socket //参数1:地址协议 ipv4 ipv6 参数2:传输协议类型 流式套接字 数据包 参数3:具体某个传输协议 SOCKET fd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (fd == INVALID_SOCKET) { err("Socket"); return fd; } //绑定IP地址和端口号 struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(PORT);//往往本地是大端,网络是小端 cout << "请输入服务端接受ip号" << endl; string ipAccept; cin >> ipAccept; addr.sin_addr.S_un.S_addr = inet_addr(ipAccept.c_str());//绑定自己(服务端)的ip,只接受该ip的地址 if (bind(fd, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) { cout << "bind error" << endl; return false; } //监听 listen(fd, 10); return fd; } SOCKET createClientSocket(const char* ip) { //创建空的socket //参数1:地址协议 ipv4 ipv6 参数2:传输协议类型 流式套接字 数据包 参数3:具体某个传输协议 SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (fd == INVALID_SOCKET) { cout << "socket" << WSAGetLastError() << endl; return fd; } //绑定服务端的IP地址和端口号 struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(PORT);//往往本地是大端,网络是小端 addr.sin_addr.S_un.S_addr = inet_addr(ip); if (INVALID_SOCKET == connect(fd, (struct sockaddr*)&addr, sizeof(addr))) { err("connect"); return false; } return fd; } #include"../tcpSocket/tcpSocket.h" #include四、服务端 cpp文件#include using namespace std; int main() { init_Socket(); string ipIput; cout << "请输入想连接的IP:"; cin >> ipIput; cout << endl; SOCKET fd = createClientSocket(ipIput.c_str());//SOCKET fd=createClientSocket("127.0.0.1"); string sendbuf; char rcvbuf[BUFSIZ] = { 0 }; //先说一句话 //if (SOCKET_ERROR == send(fd, sendbuf.c_str(), sendbuf.size(), 0)) //{ // err("send"); //} while (1) { cout << "输入您想发送的信息:"; cin >> sendbuf; if (send(fd, sendbuf.c_str(), sendbuf.size(), 0) == SOCKET_ERROR) { err("send"); } if (0 < recv(fd, rcvbuf, BUFSIZ, 0)) { cout << rcvbuf << endl; memset(rcvbuf, 0, sizeof(rcvbuf)); } } closesocket(fd); close_Socket(); cout << "end!" << endl; system("pause"); return 0; } #include#include #include"../tcpSocket/tcpSocket.h" using namespace std; int main() { init_Socket(); SOCKET serfd = createServerSocket(); cout << "wait client connecnt...." << endl; //客户端请求连接 SOCKET clifd=accept(serfd, NULL, NULL); if (INVALID_SOCKET == clifd) { err("error accept"); } //可以和客户端通信 char rcvbuf[BUFSIZ] = { 0 }; string rcvstr; string sendbuf; while (1) { if (0 < recv(clifd,rcvbuf, BUFSIZ, 0)) { cout << rcvbuf<< endl; memset(rcvbuf, 0, sizeof(rcvbuf)); //cout << rcvstr << endl; } //发送消息 cout << "输入您想发送的信息:"; cin >> sendbuf; if (send(clifd, (const char *)sendbuf.c_str(), sendbuf.size(), 0) == SOCKET_ERROR) { err("send"); } } closesocket(clifd); closesocket(serfd); close_Socket(); system("pause"); return 0; }



