Bonjour ,
je suis actuellement ce cours : https://bousk.developpez.com/cours/reseau-c++/
et j'en suis à la première partie sur le TCP.
Mon problème est que quand je lance le programme , il fonctionne mais à la fin cesse de fonctionner. J'ai essayé de supprimer des choses dans le main et de voir d'où vient le problème et apparemment c'est du constructeur du socket mais pourtant j'ai écris la même chose que dans le cours.
main
Sockets.hCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 #include <iostream> #include <winsock2.h> #include <string> #include "Sockets.h" #include "TCPSocket.h" int main() { if(!Sockets::Start()) { std::cout << "Erreur inisialisation: " << Sockets::getError() << std::endl; return 1; } TCPSocket s; if(!s.Connect("127.0.0.1",42)) { std::cout << "Erreur connexion serveur : " << Sockets::getError() << std::endl; return 1; } std::string answer; s.~TCPSocket(); Sockets::Release(); return 0; }
Sockets.cppCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 #ifndef SOCKETS_H_INCLUDED #define SOCKETS_H_INCLUDED #ifdef _WIN32 #if _MSC_VER >= 1800 #include <WS2tcpip.h> #else #define inet_pton(FAMILY,IP,PTR_STRUCT_SOCKADDR) (*(PTR_STRUCT_SOCKADDR)) = inet_addr((IP)) typedef int socklen_t; #endif // _MSC_VER #include <WinSock2.h> #ifdef _MSC_VER #if _WIN32_WINNT >= _WIN32_WINNT_WINBLUE //Win 8.1 & + #pragma comment(lib,"Ws2_32.lib") #else #pragma comment(lib,"wsock32.lib") #endif // _WIN32_WINNT #endif // _MSC_VER #else #include <sys/socket.h> #include <netinet/in.h> //sockaddr_in , IPPROTO_TCP #include <arpa/inet.h> //hton* , ntoh* , inet_addr #include <unistd.h> //close #include <cerrno> //errno #define SOCKET int #define INVALID_SOCKET ((int)-1) #endif // _WIN32 namespace Sockets { bool Start(); void Release(); int getError(); void closeSocket(SOCKET socket); } #endif // SOCKETS_H_INCLUDED
TCPSocket.hCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 #include "Sockets.h" namespace Sockets { bool Start() { #ifdef _WIN32 WSADATA data; return WSAStartup(MAKEWORD(2,2),&data) == 0; #else return true; #endif // _WIN32 } void Release() { #ifdef _WIN32 WSACleanup(); #endif // _WIN32 } int getError() { #ifdef _WIN32 return WSAGetLastError(); #else return errno; #endif // _WIN32 } void closeSocket(SOCKET socket) { #ifdef _WIN32 closeSocket(socket); #else close(socket); #endif // _WIN32 } }
TCPSocket.cppCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 #ifndef TCPSOCKET_H_INCLUDED #define TCPSOCKET_H_INCLUDED #include "Sockets.h" #include <string> #include <sstream> class TCPSocket { public: TCPSocket(); ~TCPSocket(); bool Connect(const std::string& ipAdress,unsigned short port); private: SOCKET Socket; }; #endif // TCPSOCKET_H_INCLUDED
Merci d'avance.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 #include "TCPSocket.h" TCPSocket::TCPSocket() { Socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(Socket == INVALID_SOCKET) { std::ostringstream error; error << "Erreur inisialisation : " << Sockets::getError(); throw std::runtime_error(error.str()); } } TCPSocket::~TCPSocket() { Sockets::closeSocket(Socket); } bool TCPSocket::Connect(const std::string& ipAdress,unsigned short port) { sockaddr_in server; server.sin_addr.s_addr = inet_addr("127.0.0.1"); server.sin_family = AF_INET; server.sin_port = htons(port); return connect(Socket,(struct sockaddr*)&server,sizeof(server)) == 0; }