Автор Тема: Socket programming  (Прочетена 3074 пъти)

tws

  • Напреднали
  • *****
  • Публикации: 29
    • Профил
Socket programming
« -: Feb 28, 2006, 00:11 »
Идеята ми е да направя клиент и сървър програма за чат или поне предаване на съобщения от клиент към сървър, но се сблъсках с проблем.
ето кодовете на 2та файла:

server.cpp
Примерен код
#include<iostream>
#include<sys/socket.h>
#include<sys/stat.h>
#include<netinet/in.h>
#include<netdb.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>
#include<sys/param.h>
#include<errno.h>
#include<string.h>
#include <arpa/inet.h>
#include<sys/types.h>
using namespace std;


int sockfd,sockfd_new;
int main()
{
 struct sockaddr_in addr,addr_cl;
 socklen_t addrlen;
 struct hostent *hp;
 int flags,buff;
 char localhost[65],buf[255];
 if((sockfd=socket(PF_INET,SOCK_STREAM,0))==-1)
  cout<<"ERROR CREATEing SOCKET..."<<endl;
 else
  cout<<"success createing socket..."<<endl;
 if(gethostname(localhost,64)==-1 || (hp=gethostbyname(localhost))==0)
  cout<<"ERROR GETTING HOST NAME..."<<endl;
 else
  cout<<"hostname='"<<localhost<<"'"<<endl;
 memset(&addr,0,sizeof(addr));
 memset(&addr_cl,0,sizeof(addr_cl));
 addr.sin_family=(sa_family_t) hp->h_addrtype;
 addr.sin_port=htons(8010);
 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
 if(bind(sockfd,(struct sockaddr*)&addr,sizeof(addr))==-1)
  cout<<"ERROR BINDing..."<<endl;
 else
  cout<<"success bind..."<<endl;
 if(listen(sockfd,5)==-1)
  cout<<"ERROR LISTENing..."<<endl;
 else
  cout<<"success listening..."<<endl;
 addrlen=sizeof(addr_cl);
 if(sockfd_new=accept(sockfd,(struct sockaddr*)&addr_cl,&addrlen)<0)
  cout<<"ERROR ACCEPTing..."<<endl;
 else
  cout<<"success accepting..."<<endl;
 
 cout<<"YOU GOT CONNECTION WITH:"<<inet_ntoa(addr_cl.sin_addr)<<endl;
int numbytes;
numbytes=recv(sockfd_new,buf,255,0);
/*do{
if((numbytes=recv(sockfd_new,buf,255,0))==-1)
cout<<"ERR"<<endl;
}while(numbytes==-1);*/
buf[numbytes]='\0';
cout<<buf<<endl<<numbytes<<endl;
cout<<"CLOSEing connection with"<<inet_ntoa(addr_cl.sin_addr)<<endl;  
 shutdown(sockfd_new,2);
close(sockfd);
 close(sockfd_new);
 sleep(1);
 return 0;
}


client.cpp
Примерен код
#include<iostream>
#include<stdio.h>
#include<sys/socket.h>
#include<sys/stat.h>
#include<netinet/in.h>
#include<netdb.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>
#include<sys/param.h>
#include<errno.h>
#include<string.h>
using namespace std;
int fd,sockfd,len;
void fatal(char err[255],int how)
{
cout<<err<<endl;
if(how) shutdown(sockfd,2);
close(sockfd);
exit(1);
}
int main(/*int argc,char *argv[]*/)
{
char *buf="hiiiii";
char localhost[65];
struct sockaddr_in addr_cl;
struct hostent *hp;
if((sockfd=socket(PF_INET,SOCK_STREAM,0))==-1)
fatal("ERROR CREATEing SOCKET...",0);
else
cout<<"success createing socket..."<<endl;
 if(gethostname(localhost,64)==-1 || (hp=gethostbyname(localhost))==0)
  cout<<"ERROR GETTING HOST NAME..."<<endl;
 else
  cout<<"hostname='"<<localhost<<"'"<<endl;
memset(&addr_cl,0,sizeof(addr_cl));
 addr_cl.sin_family=(sa_family_t) hp->h_addrtype;
 addr_cl.sin_port=htons(8010);
 addr_cl.sin_addr.s_addr=*(in_addr_t*)hp->h_addr;
if(connect(sockfd,(struct sockaddr*)&addr_cl,sizeof(addr_cl))<0)
fatal("ERROR client-connect",0);
else
cout<<"succes connection..."<<endl;
send(sockfd, buf, 255, 0);
cout<<buf<<endl;
do
{
cin>>buf;
if(send(sockfd, buf, strlen(buf), 0) != strlen(buf))
cout<<"ERROR SENDing..."<<endl;
else
cout<<"                                                         succes send :)"<<endl;
}while(strcmp(buf,"!stop")!=0);

shutdown(sockfd,2);
close(sockfd);
close(fd);
return 0;
}


Пускам ги да ги пробвам на една машина и интересното е, че не няма проблем ...нетрябва и там да е проблема зашото като ги стартирам се свързват помеждуси клиента изпраща успешно но сървара отказва да приема (recv=-1)или ако си поиграя с приемната променлива получава нечовешка стойност в байтове...
ето резултата при мен:
сървър-
Примерен код
root@TWS:~/temp/programming/one# ./a.out
success createing socket...
hostname='TWS'
success bind...
success listening...
success accepting...
YOU GOT CONNECTION WITH:127.0.0.1

16777215
CLOSEing connectnumbytesion with127.0.0.1
root@TWS:~/temp/programming/one# ./a.out
success createing socket...
hostname='TWS'
success bind...
success listening...
success accepting...
YOU GOT CONNECTION WITH:127.0.0.1

16777215
CLOSEing connectnumbytesion with127.0.0.1
root@TWS:~/temp/programming/one#

клиент-
Примерен код
root@TWS:~/temp/programming/two# ./a.out
success createing socket...
hostname='TWS'
ERROR client-connect
root@TWS:~/temp/programming/two# ./a.out
success createing socket...
hostname='TWS'
succes connection...
hiiiii
/натам го гася с Ctrl+C .../


сигурно греша някъде ...сигурно греша много ...
помогнете моля и кажете какво да пробвам някакви евентуални грешки...
сичко това го пробвам на слак10.2 ако е от значение  :lol:
Активен

viva la gentoo

i_danov

  • Участници
  • ***
  • Публикации: 7
    • Профил
Socket programming
« Отговор #1 -: Feb 28, 2006, 18:48 »
Примерен код
if(sockfd_new=accept(sockfd,(struct sockaddr*)&addr_cl,&addrlen)<0)


ето тука ти е проблема. малко са ти скобите.
и като компилираш слагай и опцията -Wall, ще ти е много полезна.
Активен

tws

  • Напреднали
  • *****
  • Публикации: 29
    • Профил
Socket programming
« Отговор #2 -: Feb 28, 2006, 21:52 »
благодаря мнгого  '<img'>
съвсем изключих за логиката в тоя ред,
 а за -Wall полезна е много си прав  '<img'>
Активен

viva la gentoo

i_danov

  • Участници
  • ***
  • Публикации: 7
    • Профил
Socket programming
« Отговор #3 -: Mar 01, 2006, 11:16 »
Примерен код
char *buf="hiiiii";
...
cin>>buf;


Освен това тази комбинация не е добра идея. Не си сигурен колко символа ще се въведат.
Активен

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
TCP/IP Socket commands
Общ форум
o2 7 2892 Последна публикация Jun 22, 2003, 00:18
от o2
INFO za Socket-ite
Общ форум
plamen_t 5 3853 Последна публикация Jul 27, 2004, 10:58
от
RS232 over TCP/IP socket или как да ...
Хардуерни и софтуерни проблеми
BRADATA 31 18655 Последна публикация Oct 04, 2017, 18:18
от pgmgm
TCP/IP и socket програмиране
Общ форум
nedy 3 3135 Последна публикация Nov 29, 2005, 22:28
от sdr
Mysql problem with socket
Хардуерни и софтуерни проблеми
rat 8 2563 Последна публикация Apr 06, 2006, 13:08
от hary