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:
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.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
 
#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
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
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);
}
Les fonctions WSASend et WSARecv me balance un message de la sorte :
Unhandled exception at 0x772915de in Server.exe: 0xC0000005: Access violation reading location 0x00000000.
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.

Je bosse sous win7 avec Visual Studio 2010.

Merci de votre aide