Bonjour,
Je suis actuellement en train de développer un serveur en C++ (projet scolaire). Comme il doit être multi archi, je suis en train d'encapsuler les appels systèmes réseaux pour une meilleur transparence. Cependant j'ai un probleme avec mes buffer pour les fonctions WSASend et WSARecv voici le main, et le fichier contenant les fonctions:
main.cpp:
WinFunc.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
49
50
51
52 #include <WinSock2.h> #include <iostream> #include "WinFunc.h" int init_net(int port) { SOCKET s; struct sockaddr_in sin; if ((s = _socket(AF_INET, SOCK_STREAM, "TCP")) < 0) return (-1); sin.sin_family = AF_INET; sin.sin_addr.s_addr = inet_addr("127.0.0.1"); sin.sin_port = htons(port); if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) != 0) return (-1); if (listen(s, 20) != 0) return (-1); return (s); } int main(int ac, char **av) { int port; SOCKET s; SOCKET s2; struct sockaddr sock; int len; char buf[512]; WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 2); WSAStartup(wVersionRequested, &wsaData); len = sizeof(sock); if (ac < 2) return (0); port = atoi(av[1]); if ((s = init_net(port)) != -1) { s2 = _accept(s, &sock, &len); while (1) { _recv(s2, buf, 512); std::cout << buf << std::endl; strcpy(buf, "Hello, World!\n"); _send(s2, buf, 14); } } WSACleanup(); return (0); }
WinFunc.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 #ifndef __WINFUNC_H__ # define __WINFUNC_H__ # include <WinSock2.h> typedef SOCKET T_SOCKET; typedef int T_SOCKLEN; T_SOCKET _socket(int family, int type, char *proto); int _connect(T_SOCKET sock, struct sockaddr * addr, int namelen); T_SOCKET _accept(T_SOCKET sock, struct sockaddr * addr, T_SOCKLEN *namelen); int _send(T_SOCKET sock, char *buf, unsigned int buff_len); int _recv(T_SOCKET sock, char *buf, unsigned int buff_len); #endif
Les fonctions WSASend et WSARecv me balance un message de la sorte :
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
49
50
51
52
53
54
55 #include <WinSock2.h> #include "WinFunc.h" T_SOCKET _socket(int family, int type, char *proto) { int p; if (!strcmp(proto, "TCP")) p = IPPROTO_TCP; else p = IPPROTO_UDP; return (WSASocket(family, type, p, NULL, NULL, NULL)); } int _connect(T_SOCKET sock, struct sockaddr * addr, int namelen) { return (WSAConnect(sock, addr, namelen, NULL, NULL, NULL, NULL)); } T_SOCKET _accept(T_SOCKET sock, struct sockaddr * addr, int *namelen) { return (WSAAccept(sock, addr, namelen, NULL, NULL)); } int _send(T_SOCKET sock, char *buf, unsigned int buff_len) { WSABUF b; DWORD bytes; int ret; b.len = buff_len; b.buf = buf; ret = WSASend(sock, &b, 1, &bytes, 0, NULL, NULL); if (ret == SOCKET_ERROR) return (-1); else return (bytes); } int _recv(T_SOCKET sock, char *buf, unsigned int buff_len) { WSABUF b; DWORD bytes; int ret; b.len = buff_len; b.buf = buf; ret = WSARecv(sock, &b, 1, &bytes, 0, NULL, NULL); if (ret == SOCKET_ERROR) return (-1); else return (bytes); }
En remplaçant mes buffer avec un systeme de string (qui est assez moche) ca fonctionne. J'en deduis donc que le probleme vient des char * mais je ne comprend pas l'origine de ce probleme.Unhandled exception at 0x772915de in Server.exe: 0xC0000005: Access violation reading location 0x00000000.
Je bosse sous win7 avec Visual Studio 2010.
Merci de votre aide
Partager