首页 > 编程语言 >C++ Socket网络编程(TCP)

C++ Socket网络编程(TCP)

时间:2023-11-27 14:57:55浏览次数:40  
标签:main Socket lib int C++ WIN32 TCP ifdef include

基于Windows平台的Socket网络编程,用的QT,这个例子里一个服务端和一个客户端,两个应用程序之间进行通信,所以创建两个项目,目录结构如下:

直接贴代码:

服务端:

 1 // main.cpp
 2 #include <QCoreApplication>
 3 #include <iostream>
 4 #include <QDebug>
 5 #include <cstring>
 6 #include <WinSock2.h>
 7 #pragma comment(lib, "ws2_32.lib")
 8 #ifdef _WIN32
 9     typedef int socklen_t;
10 #endif
11 
12 
13 int main(int argc, char *argv[])
14 {
15     QCoreApplication a(argc, argv);
16 
17 #ifdef _WIN32
18     WSADATA wsaData;
19     if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
20         std::cerr << "Failed to initialize WinSock" << std::endl;
21         return -1;
22     }
23 #endif
24 
25 //    std::cout << "Hello World!" << std::endl;
26 //    qDebug() << "Hello World!" ;
27 
28     //创建套接字
29     int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
30     if (serverSocket == -1)
31     {
32         std::cerr << "Error creating socket" << std::endl;
33         return -1;
34     }
35 
36     //准备地址结构
37     sockaddr_in serverAddress;
38     serverAddress.sin_family = AF_INET;
39     serverAddress.sin_port = htons(8888);
40     serverAddress.sin_addr.s_addr = INADDR_ANY;
41 
42     //绑定套接字
43     if (bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) == -1)
44     {
45         std::cerr << "Error binding socket" << std::endl;
46 #ifdef _WIN32
47         closesocket(serverSocket);
48 #else
49         close(serverSocket);
50 #endif
51         return -1;
52     }
53 
54     //监听连接请求
55     if (listen(serverSocket, 5) == -1)
56     {
57         std::cerr << "Error listening on socket" << std::endl;
58 #ifdef _WIN32
59         closesocket(serverSocket);
60 #else
61         close(serverSocket);
62 #endif
63         return -1;
64     }
65 
66     std::cout << "Waitinig for client to connect..." << std::endl;
67 
68     //接受连接请求
69     sockaddr_in clientAddress;
70     socklen_t clientAddressLength = sizeof(clientAddress);
71     int clientScoket = accept(serverSocket, (struct sockaddr*)&clientAddress, &clientAddressLength);
72     if (clientScoket == -1)
73     {
74         std::cerr << "Error accepting connection" << std::endl;
75         closesocket(serverSocket);
76         return -1;
77     }
78 
79     std::cout << "Connection established with client" << std::endl;
80 
81     //发送和接受数据
82     char buffer[1024];
83     memset(buffer, 0, sizeof(buffer));
84     recv(clientScoket, buffer, sizeof(buffer), 0);
85     std::cout << "Received from client: " << buffer << std::endl;
86 
87     const char* message = "Hello, client!";
88     send(clientScoket, message, strlen(message), 0);
89 
90     //关闭套接字
91     closesocket(clientScoket);
92     closesocket(serverSocket);
93 
94     return a.exec();
95 }

客户端:

 1 // main.cpp
 2 #include <QCoreApplication>
 3 #include <iostream>
 4 #include <QDebug>
 5 #include <cstring>
 6 #include <WinSock2.h>
 7 #include <ws2tcpip.h>
 8 #include <QtNetwork>
 9 #pragma comment(lib, "ws2_32.lib")
10 #ifdef _WIN32
11     typedef int socklen_t;
12 #endif
13 
14 
15 int main(int argc, char *argv[])
16 {
17     QCoreApplication a(argc, argv);
18 
19 #ifdef _WIN32
20     WSADATA wsaData;
21     if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
22         std::cerr << "Failed to initialize WinSock" << std::endl;
23         return -1;
24     }
25 #endif
26 
27     int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
28     if (clientSocket == -1)
29     {
30         std::cerr << "Error creating socket" << strerror(errno) << std::endl;
31         return -1;
32     }
33 
34     //准备地址结构
35     sockaddr_in serverAddress;
36     serverAddress.sin_family = AF_INET;
37     serverAddress.sin_port = htons(8888);
38     inet_pton(AF_INET, "127.0.0.1", &serverAddress.sin_addr);
39 
40     //连接到服务端
41     if (connect(clientSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) == -1)
42     {
43         std::cerr << "Error connecting to server" << std::endl;
44         closesocket(clientSocket);
45         return -1;
46     }
47 
48     std::cout << "Connected to server" << std::endl;
49 
50     //发送和接收数据
51     const char* message = "Hello server!";
52     send(clientSocket, message, strlen(message), 0);
53 
54     char buffer[1024];
55     memset(buffer, 0, sizeof(buffer));
56     recv(clientSocket, buffer, sizeof(buffer), 0);
57     std::cout << "Received from server: " << buffer << std::endl;
58 
59     //关闭套接字
60     closesocket(clientSocket);
61 
62     return a.exec();
63 }

注意:先运行服务器端,再运行客户端,可正常通信

运行效果:

 

标签:main,Socket,lib,int,C++,WIN32,TCP,ifdef,include
From: https://www.cnblogs.com/l-yy/p/17859347.html

相关文章

  • std::future与std::promise在C++多线程同步与数据共享中的应用
    1、std::promise与std::futurestd::promise与std::future通过配合使用完成数据的同步与共享,两者均是模板类;std::promise存储异步执行的值或异常;std::future提供可供访问的异步执行结果。二者配合使用伪码如下:std::promise<Type>pr;std::future<Type>fu(pr.get_fu......
  • C++聊天集群服务器2
    ​ 总体项目结构如下:一、数据库的封装​ db.h如图代码量不多​ db.cpp:#include"db.h"#include<muduo/base/Logging.h>//数据库配置信息staticstringserver="127.0.0.1";staticstringuser="root";staticstringpassword="123456";st......
  • C++11 后的单例写法
    template<typenameT>classSingleton{public:staticT&getInstance(){staticTt;returnt;}Singleton(constSingleton&)=delete;Singleton&operator=(constSingleton&)=delete;protected:......
  • 如何将tcpdump抓取的数据包存入文件,供wireshark使用
    使用tcpdump命令的-w参数 tcpdump-nvvv-ieth0port34999-wredis-34999.pcap 注意:要使用-w的方式,将抓到的包,保存到文件中,不要使用 >或者>>重定向的方式,这样生成的文件wireshark程序无法读取到,会报文件错误。......
  • 实验4 现代C++标准库与类模板
    实验任务5TextCoder.hpp源码1#include<iostream>2#include<string>34usingstd::string;56classTextCoder{7private:8stringtext;9voidencoder();10voiddecoder();11public:12TextCod......
  • socket.on可以直接添加自定义事件吗,理解socket的事件触发与响应
    在Web开发中,socket.on通常是用于注册处理特定事件的回调函数的方法。它主要用于处理Socket.IO库中的预定义事件,例如"connect"、"disconnect"、"message"等。然而,Socket.IO也允许你添加自定义事件,以便在客户端和服务器之间进行自定义的双向通信。要使用socket.on来处理自定义事件,......
  • C++ 服务端与 Java 客户端的简单连接
    记录一下如何用两种语言简单通信,(其实也大差不差的,应该把。。。)//C++服务端#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<unistd.h>#include<iostream>#include<cstring>usingstd::cout;usingstd::endl;usingst......
  • C语言调用C++类成员函数讲解和实例
    原文:https://blog.csdn.net/LxXlc468hW35lZn5/article/details/1257010071、问题成因C语言与C++调用问题原因主要在于C编译器和C++编译器的不同。C是过程式语言,C编译器编译后,函数在符号库中就是函数名,没有其他任何附加信息。而C++是对象式语言,支持函数重载,C++编译器编译后,在符号......
  • 【C与C++的相互调用方法】
    原文:https://blog.csdn.net/qq_43899283/article/details/132343699C与C++的相互调用方法C与C++为什么相互调用的方式不同C++中调用CC中调用C++致谢C与C++为什么相互调用的方式不同  C和C++之间的相互调用方式存在区别,主要是由于C和C++语言本身的设计和特性不同。函数......
  • extern "C":实现C++和C的混合编程
    原文:https://c.biancheng.net/view/8064.html通过《C语言和C++到底有什么关系?》一节的学习,读者已经了解了C++和C语言之间的关系。简单的理解,C++就是在C语言的基础上增加了一些新特性,从大的方面讲,C++不仅支持面向过程编程,还支持面向对象编程和泛型编程;从小的方面讲,C++还......