Код: Выделить всё
struct BuffToSend
{
char flag;
char type;
int func;
char msg [11];
} s_buff;
На сервере получаю 6 байт, приходит все кроме msg[11] он пустой. С клиента отправляется 6 байт. То есть получается, что я вообще не отправляю msg[11] . Скорее всего я пытаюсь отослать не данные, а адрес. Вопрос: как я могу отправить char msg [11]?
Сильно не бейте на си програмлю плохо. И скорее всего не понимаю очевидного из-за чего не отправляется.
Исходник сервера (который принимает)
Код: Выделить всё
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
// Функции
int LoadConf ();
struct CFG_NET
{
char backlog; // очередь ожидающих соединений
int port;
char * ip;
} cfg_net;
class NET
{
private: int s_server, s_clients [2000];
private: struct sockaddr_in si_server, si_clients [2000];
private: timeval timeout;
private: fd_set readset;
private: char* b_in;
public: NET ()
{
printf ("Net up... ");
s_server = socket (PF_INET, SOCK_STREAM, 0);
fcntl(s_server, F_SETFL, O_NONBLOCK);
if (s_server == -1)
{
printf ("ERROR\n\r");
perror("\n\rERROR");
exit (1);
}
memset (&si_server, 0, sizeof si_server);
si_server.sin_family = AF_INET;
si_server.sin_addr.s_addr = inet_addr (cfg_net.ip);
si_server.sin_port = htons (cfg_net.port);
if (bind (s_server, (struct sockaddr*) &si_server, sizeof si_server) == -1)
{
printf ("ERROR\n\r");
perror("\n\rERROR");
exit (1);
}
if (listen (s_server, cfg_net.backlog) == -1)
{
printf ("ERROR\n\r");
perror("\n\rERROR");
exit (1);
}
for (int i = 0; i < 2000; i++)
{
s_clients[i] = 0;
}
timeout.tv_sec = 0;
timeout.tv_usec = 100;
b_in = (char*)malloc(20);
printf ("OK\n\r");
}
public: void sel ()
{
FD_ZERO (&readset);
FD_SET (s_server, &readset);
int max = s_server;
for (int i = 0; i < 2000; i++)
if (s_clients[i] != 0)
{
FD_SET (s_clients[i], &readset);
if (s_clients[i] > max)
max = s_clients[i];
}
if (select (max+1, &readset, NULL, NULL, &timeout) > 0)
{
if (FD_ISSET (s_server, &readset))
{
acc ();
}
else
{
for (int i = 0; i < 2000; i++)
if (FD_ISSET (s_clients[i], &readset))
{
rec (i);
break;
}
}
}
}
public: int acc ()
{
int i = 0;
for (i; i < 2000; i++)
{
if (s_clients[i] == 0)
break;
}
memset (&si_clients, 0, sizeof si_clients);
socklen_t si_len = sizeof &si_clients[i];
s_clients [i] = accept (s_server, (struct sockaddr*) &si_clients [i], &si_len);
if (s_clients [i] == -1)
{
close (s_clients [i]);
s_clients [i] = 0;
exit (1);
}
}
public: int rec (int in)
{
struct BuffToSend
{
char flag;
char type;
int func;
char msg [11];
} s_buff;
int error = recv (s_clients[in], b_in, 16, 0);
if (error > 0)
{
s_buff = *(BuffToSend*)b_in;
puts (s_buff.msg);
printf ("%i %i %i %s\n\r", s_buff.flag, s_buff.type, s_buff.func, s_buff.msg);
puts ("OK");
}
else
switch (error)
{
case -1:
perror ("recv ()");
exit (1);
break;
case 0:
close (s_clients[in]);
s_clients[in] = 0;
puts ("Client disconect.");
break;
}
}
};
class PROGRAMM
{
private: NET net;
public: PROGRAMM ()
{
printf ("Server is run.\n\r IP: %s\n\r Port: %i\n\r", cfg_net.ip, cfg_net.port);
}
public: void kernel()
{
for (;;)
{
net.sel ();
}
}
~PROGRAMM ()
{
// exit (0);
}
};
int main()
{
LoadConf ();
PROGRAMM programm;
programm.kernel ();
}
int LoadConf ()
{
cfg_net.backlog = 5;
cfg_net.port = 1407;
cfg_net.ip = "127.0.0.1";
printf ("OK\n\r");
return (0);
}
Код: Выделить всё
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
int s, error;
int sendall (char type, int func, char * out_msg)
{
struct BuffToSend
{
char flag;
char type;
int func;
char msg [11];
} s_buff;
char * buffer;
char out[11];
char flag = 0;
for (int i = 0; i < strlen (out_msg); i += 10)
{
out[0] = 0;
strncat(out, out_msg + i, 10);
if (i == 0 and strlen (out_msg) <= 10)
flag = 0;
else
{
if (i == 0 and strlen (out_msg) > 10)
flag = 1;
else
{
if (i+10 >= strlen (out_msg))
flag = 3;
else
flag = 2;
}
}
s_buff.flag = flag;
s_buff.type = type;
s_buff.func = func;
strcpy(s_buff.msg, out);
buffer = (char*) &s_buff;
printf ("%i %i %i %s\n\r", s_buff.flag, s_buff.type, s_buff.func, s_buff.msg);
if (send (s, buffer, strlen (buffer)+10, 0) == -1)
{
perror ("send ()");
return (1);
}
printf ("%i\n\r", strlen (buffer));
}
}
int main()
{
struct sockaddr_in si;
s = socket (PF_INET, SOCK_STREAM, 0);
if (s == -1)
{
perror( "socket ()" );
return 1;
}
puts ("Socket OK");
memset (&si, 0, sizeof si);
si.sin_family = AF_INET;
si.sin_addr.s_addr = inet_addr ("127.0.0.1");
si.sin_port = htons (1407);
error = connect (s, (struct sockaddr*) &si, sizeof si);
if (error == -1)
{
perror ("connect ()");
return (1);
}
puts ("Connect OK");
char * out_msg;
out_msg = "Hello! This text.";
sendall (5, 11090, out_msg);
close (s);
return 0;
}