Титла: Socket programming
Публикувано от: tws в 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:
Титла: Socket programming
Публикувано от: i_danov в Feb 28, 2006, 18:48
Примерен код | if(sockfd_new=accept(sockfd,(struct sockaddr*)&addr_cl,&addrlen)<0) |
ето тука ти е проблема. малко са ти скобите. и като компилираш слагай и опцията -Wall, ще ти е много полезна.
Титла: Socket programming
Публикувано от: tws в Feb 28, 2006, 21:52
благодаря мнгого съвсем изключих за логиката в тоя ред, а за -Wall полезна е много си прав 
Титла: Socket programming
Публикувано от: i_danov в Mar 01, 2006, 11:16
Примерен код | char *buf="hiiiii"; ... cin>>buf;
|
Освен това тази комбинация не е добра идея. Не си сигурен колко символа ще се въведат.
|