И снова здравствуйте.
Как обычно за советом.
Решил немного поизвращаться и написал простенький чатик -
Сервер :
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
int main() {
int sock, listener;
struct sockaddr_in addr;
char buf[1024];
int bytes_read;
char message[1024];
listener = socket(AF_INET, SOCK_STREAM, 0);
if(listener < 0)
{
perror("socket");
exit(1);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(3425);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("bind");
exit(2);
}
listen(listener, 1);
fd_set rfds;
struct timeval tv;
int retval;
sock = accept(listener, NULL, NULL);
if(sock < 0)
{
perror("accept");
exit(3);
}
cerr << "accepted\n";
while(1)
{
FD_ZERO(&rfds);
FD_SET(sock, &rfds);
FD_SET(0, &rfds);
tv.tv_sec = 5;
tv.tv_usec=0;
retval= select(sock + 1,&rfds,0,0,0);
if(retval == 0)
{
cerr << "timeout\n";
}
else if(retval < 0)
{
cerr << "error\n";
}
else
{
if(FD_ISSET(sock,&rfds))
{
bytes_read = recv(sock, buf, 1024, 0);
if(bytes_read <= 0) break;
cout << "Client says:" << buf << endl;
for (int i =0; i <1024; i++)
{
buf[i] = 0;
}
}
if(FD_ISSET(0,&rfds))
{
read(0,message, sizeof(message));
send(sock, message, sizeof(message), 0);
for (int j=0;j <1024; j++)
{
message[j] = 0;
}
}
}
}
close(sock);
return 0;
}
и клиент :
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
char message[1024];
char buf[1024];
int main()
{
int sock;
struct sockaddr_in addr;
sock=socket(AF_INET, SOCK_STREAM,0);
if(sock<0)
{
perror("socket");
exit(1);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(3425); // или любой другой порт...
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("connect");
exit(2);
}
fd_set rfds;
struct timeval tv;
int retval;
while(1)
{
FD_ZERO(&rfds);
FD_SET(sock, &rfds);
FD_SET(0, &rfds);
tv.tv_sec = 5;
tv.tv_usec=0;
retval= select(sock + 1,&rfds,0,0,0);
if(retval == 0)
{
cerr << "timeout\n";
}
else if(retval < 0)
{
cerr << "error\n";
}
else
{
if(FD_ISSET(sock,&rfds))
{
int bytes = recv(sock, buf, sizeof(buf), 0);
buf[bytes] = 0;
printf("Server say : %s\n",buf);
for(int i=0; i< 1024; i++)
{
buf[i] =0;
}
}
if(FD_ISSET(0,&rfds))
{
read(0,message, sizeof(message));
if(!strcmp(message,"exit\n"))
break;
if(!(message[0] == 0 && message[1] == 0 && message[2] == 0))
send(sock, message, sizeof(message), 0);
for(int i=0; i< 1024; i++)
{
message[i] =0;
}
}
}
}
close(sock);
return 0;
}
Вопросы заключаются в следующем
1) Что стоит поменять? Что доделать?
2) Слышал про такую вундервафлю как QT - думаю - стоит ли наней делать ... интерфейс.
3) Можно ли как-то сюда добавить логи?
4.
5. Ничего в голову не приходит, спрошу потом...