PDA

Показать полную графическую версию : Не могу отправить сообщение


Rino256
19-12-2012, 23:06
Здравствуйте! Пытаюсь написать чат на С под Linux. Имеется клиент и сервер. В клиенте вводится сообщения и отправляется на сервер, а сервер это сообщение должен распечатать, но к сожалению, по неизвестной мне причине, сообщение не отправляется! Помогите пожалуйста с решить данную проблему! P.S. отправляю сообщение с помощью сокетов. Это мое первая программа, работающая с сетью, так что прошу сильно не ругать, если где-то туплю

Сервер:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>

int main()
{
int st = socket(AF_INET,SOCK_STREAM,0);
if (st<0)
{
perror("socket");
exit(-1);
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(1501);
addr.sin_addr.s_addr = INADDR_ANY;
int bnd = bind(st,(struct sockaddr*)&addr,sizeof(addr));
if(bnd<0)
{
perror("bind");
exit(-1);
}

int lst;
lst = listen(st,10);

struct sockaddr_in addr1;
int st1, stlen1;
st1 = accept(st,(struct sockaddr*)&addr1,&stlen1);
if(st1==NULL)
{
perror("st1");
exit(-1);
}
int snd;
int from_len=0;
char str[80]="";
printf("Message0: %s \n", str);
while(1)
{
if((from_len = recv (st1, str, 80, 0))<0)
{
perror("recv");
//exit(-1);
}
printf("From_len: %d\n", from_len);
write (1, str, 80);
printf("Message: %s \n", str);
//send (st1, str, 80, 0);
sleep(4);
}
shutdown(st,2);
//shutdown(st1,2);
close(st);
//close(st1);
exit(0);
}



Клиент:


#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netdb.h>
extern int h_errno;

int main()
{
struct hostent *gethost;
gethost = gethostbyname("127.0.0.1");
if(gethost==NULL)
{
perror("gethostbyname");
exit(-1);
}
int st = socket(AF_INET,SOCK_STREAM,0);
if (st<0)
{
perror("socket");
exit(-1);
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(1501);
addr.sin_addr.s_addr = ((struct in_addr*)(gethost->h_addr))->s_addr;
int cnct = connect(st,(struct sockaddr*)&addr,sizeof(addr));
if(cnct<0)
{
perror("connect");
exit(-1);
}


int snd;
//int stlen1=sizeof(addr1);
int stlen1;
//int st1 = accept(st,(struct sockaddr*)&addr1,&stlen1);
char str[80];
while(1)
{
gets(str);
//int from_len = sizeof(addr1);
//s_new = accept (s, &from_sin, &from_len);
//st1 = accept(st,(struct sockaddr*)&addr1,&stlen1);
//(st, str,80);
//int from_len = read (st, str, 90);
//write (1, str, 80);
snd=send(st, str, 80, 0);

sleep(4);
}
shutdown(st,2);
//shutdown(st1,2);
close(st);
//close(st1);
//}
exit(0);
}

Rino256
25-12-2012, 17:33
Все посылается! Но возникла другая проблема- с совместимостью. На Debian у знакомого все запускается на ура, а у меня что на Ubuntu, что на Fedora 17
пишет ошибку: "st1: Bad address". Пробовал адреса 127.0.0.1 и 192.168.1.3- Ubuntu в сети, 192.168.1.2- Fedora в сети. Подскажите пожалуйста, в чем дело!

Клиент:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netdb.h>
extern int h_errno;

int main(int argC, char** argV)
{
if(argC < 2)
{
printf("Enter %s port", argV[0]);
exit(-1);
}

int port;
if((port = atoi(argV[1])) < 0)
{
perror("atoi");
//exit(-1);
}

struct hostent *gethost;
gethost = gethostbyname("192.168.1.3");
if(gethost==NULL)
{
perror("gethostbyname");
exit(-1);
}
int st = socket(AF_INET,SOCK_STREAM,0);
if (st<0)
{
perror("socket");
exit(-1);
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = ((struct in_addr*)(gethost->h_addr))->s_addr;
int cnct = connect(st,(struct sockaddr*)&addr,sizeof(addr));
if(cnct<0)
{
perror("connect");
exit(-1);
}


int snd;
//int stlen1=sizeof(addr1);
int stlen1;
//int st1 = accept(st,(struct sockaddr*)&addr1,&stlen1);
char str[80];
while(1)
{
gets(str);
printf("Message: %s\n", str);
//int from_len = sizeof(addr1);
//s_new = accept (s, &from_sin, &from_len);
//st1 = accept(st,(struct sockaddr*)&addr1,&stlen1);
//(st, str,80);
//int from_len = read (st, str, 90);
//write (1, str, 80);
snd=send(st, str, 80, 0);
if(snd<0)
{
perror("send");
exit(-1);
}

sleep(4);
}
shutdown(st,2);
//shutdown(st1,2);
close(st);
//close(st1);
//}
exit(0);
}


Сервер:


#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>

int main(int argC, char** argV)
{
if(argC < 2)
{
printf("Enter %s port", argV[0]);
exit(-1);
}

int port;
if((port = atoi(argV[1])) < 0)
{
perror("atoi");
//exit(-1);
}

int st = socket(AF_INET,SOCK_STREAM,0);
if (st<0)
{
perror("socket");
exit(-1);
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
addr.sin_addr.s_addr = INADDR_ANY;
int bnd = bind(st,(struct sockaddr*)&addr,sizeof(addr));
if(bnd<0)
{
perror("bind");
exit(-1);
}

int lst;
lst = listen(st,10);
if(lst<0)
{
perror("listen");
exit(-1);
}



struct sockaddr_in *addr1;
int st1, stlen1;
int peer_addr_size = sizeof(struct sockaddr_in);
//st1 = accept(st,(struct sockaddr*)addr1,&stlen1);
st1 = accept(st,(struct sockaddr*)addr1,&peer_addr_size);
if(st1<0)
{
perror("st1");
exit(-1);
}
int snd;
int from_len=0;
char str[80];
printf("Message0: %s \n", str);
while(1)
{
from_len = recv (st1, str, 80, 0);
if(from_len<0)
{
perror("recv");
exit(-1);
}
printf("From_len: %d\n", from_len);
write (1, str, 80);
printf("Message: %s \n", str);
snd=send (st1, str, 80, 0);
sleep(4);
}
shutdown(st,2);
//shutdown(st1,2);
close(st);
//close(st1);
exit(0);
}


P.S.
порт вводил 12345. На Debian работало




© OSzone.net 2001-2012