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.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
Partager