欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > Socket实现TCP

Socket实现TCP

2025/3/10 6:02:11 来源:https://blog.csdn.net/m0_56554817/article/details/141427659  浏览:    关键词:Socket实现TCP

参考1

客户端

//客户端
#include<iostream>
#include<winsock.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
void initialization();
int main() {//定义长度变量int send_len = 0;int recv_len = 0;//定义发送缓冲区和接受缓冲区char send_buf[100];char recv_buf[100];//定义服务端套接字,接受请求套接字SOCKET s_server;//服务端地址客户端地址SOCKADDR_IN server_addr;initialization();//填充服务端信息server_addr.sin_family = AF_INET;server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");server_addr.sin_port = htons(1234);//创建套接字s_server = socket(AF_INET, SOCK_STREAM, 0);if (connect(s_server, (SOCKADDR*)& server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {cout << "服务器连接失败!" << endl;WSACleanup();}else {cout << "服务器连接成功!" << endl;}//发送,接收数据while (1) {cout << "请输入发送信息:";cin >> send_buf;send_len = send(s_server, send_buf, 100, 0);if (send_len < 0) {cout << "发送失败!" << endl;break;}recv_len = recv(s_server, recv_buf, 100, 0);if (recv_len < 0) {cout << "接受失败!" << endl;break;}else {cout << "服务端信息:" << recv_buf << endl;}}//关闭套接字closesocket(s_server);//释放DLL资源WSACleanup();return 0;
}
void initialization() {//初始化套接字库WORD w_req = MAKEWORD(2, 2);//版本号WSADATA wsadata;int err;err = WSAStartup(w_req, &wsadata);if (err != 0) {cout << "初始化套接字库失败!" << endl;}else {cout << "初始化套接字库成功!" << endl;}//检测版本号if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2){cout << "套接字库版本号不符!" << endl;WSACleanup();}else {cout << "套接字库版本正确!" << endl;}//填充服务端地址信息}

服务端

//服务器
#include<iostream>
#include<winsock.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
void initialization();
int main() {//定义长度变量int send_len = 0;int recv_len = 0;int len = 0;//定义发送缓冲区和接受缓冲区char send_buf[100];char recv_buf[100];//定义服务端套接字,接受请求套接字SOCKET s_server;SOCKET s_accept;//服务端地址客户端地址SOCKADDR_IN server_addr;SOCKADDR_IN accept_addr;initialization();//填充服务端信息server_addr.sin_family = AF_INET;server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);server_addr.sin_port = htons(1234);//创建套接字s_server = socket(AF_INET, SOCK_STREAM, 0);if (bind(s_server, (SOCKADDR*)& server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {cout << "套接字绑定失败!" << endl;WSACleanup();}else {cout << "套接字绑定成功!" << endl;}//设置套接字为监听状态if (listen(s_server, SOMAXCONN) < 0) {cout << "设置监听状态失败!" << endl;WSACleanup();}else {cout << "设置监听状态成功!" << endl;}cout << "服务端正在监听连接,请稍候...." << endl;//接受连接请求len = sizeof(SOCKADDR);s_accept = accept(s_server, (SOCKADDR*)& accept_addr, &len);if (s_accept == SOCKET_ERROR) {cout << "连接失败!" << endl;WSACleanup();return 0;}cout << "连接建立,准备接受数据" << endl;//接收数据while (1) {recv_len = recv(s_accept, recv_buf, 100, 0);if (recv_len < 0) {cout << "接受失败!" << endl;break;}else {cout << "客户端信息:" << recv_buf << endl;}cout << "请输入回复信息:";cin >> send_buf;send_len = send(s_accept, send_buf, 100, 0);if (send_len < 0) {cout << "发送失败!" << endl;break;}}//关闭套接字closesocket(s_server);closesocket(s_accept);//释放DLL资源WSACleanup();return 0;
}
void initialization() {//初始化套接字库WORD w_req = MAKEWORD(2, 2);//版本号WSADATA wsadata;int err;err = WSAStartup(w_req, &wsadata);if (err != 0) {cout << "初始化套接字库失败!" << endl;}else {cout << "初始化套接字库成功!" << endl;}//检测版本号if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {cout << "套接字库版本号不符!" << endl;WSACleanup();}else {cout << "套接字库版本正确!" << endl;}//填充服务端地址信息}

参考2

Client:


#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>  
#pragma comment(lib, "ws2_32.lib")  
#define PORT 8080int main() 
{// 初始化 WinsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){return 0;}// 创建 socketSOCKET socket = ::socket(AF_INET, SOCK_STREAM, 0);if (socket == INVALID_SOCKET){return 0;}// 设置服务器信息SOCKADDR_IN serverAddress;serverAddress.sin_family = AF_INET;serverAddress.sin_port = htons(8080); // 服务器的端口号//serverAddress.sin_addr.s_addr = inet_addr(ipBuffer); // 服务器的 IP 地址inet_pton(AF_INET, "127.0.0.1", &serverAddress.sin_addr.s_addr);// 连接到服务器if (connect(socket, (SOCKADDR*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR){closesocket(socket);WSACleanup();return 0;}std::string data = "机器切割状态为:";if (send(socket, data.c_str(), data.size(), 0) == SOCKET_ERROR){closesocket(socket);WSACleanup();return 0;}Sleep(100);// 关闭 socketclosesocket(socket);// 清理 WinsockWSACleanup();return 0;
}

Server:

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>  
#pragma comment(lib, "ws2_32.lib")  
#define PORT 8080int main()
{// 初始化Winsock  WSADATA wsa;if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {std::cerr << "WSAStartup failed.\n";return 1;}//创建socket文件描述符SOCKET server_fd = ::socket(AF_INET, SOCK_STREAM, 0);if (server_fd == INVALID_SOCKET){perror("socket failed");exit(EXIT_FAILURE);}//定义sockaddr_in 结构体变量 ,并清零sockaddr_in  address;memset(&address, 0, sizeof(address));int addrlen = sizeof(address);address.sin_family = AF_INET;address.sin_port = htons(PORT);address.sin_addr.s_addr = INADDR_ANY;//绑定socket与端口if (bind(server_fd, (LPSOCKADDR)&address, sizeof(address)) == SOCKET_ERROR){perror("bind failed");exit(EXIT_FAILURE);}//监听端口if (listen(server_fd, 3) < 0){perror("Fiald to listen socket");exit(EXIT_FAILURE);}std::cout << "server is listening" << std::endl;int  new_socket;// 等待客户端连接  struct sockaddr_in client_addr;socklen_t client_addr_len = sizeof(client_addr);if ((new_socket = accept(server_fd, (SOCKADDR*)&client_addr, &client_addr_len)) == -1){std::cerr << "Fiald to accept socket" << std::endl;exit(EXIT_FAILURE);}std::cout << "a client connected" << std::endl;char buffer[1024] = { 0 };// 读取数据  recv(new_socket, buffer, 1024, 0);std::cout << "Message from client: " << buffer << std::endl;const char* hello = "hello from server";// 发送响应  send(new_socket, hello, strlen(hello), 0);std::cout << "Hello message sent\n";// 关闭socket  closesocket(new_socket);closesocket(server_fd);// 清理Winsock  WSACleanup();return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com