Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.170] |
|
Сообщ.
#1
,
|
|
|
Помогите, пожалуйста, переписать код приложения TCP клиент-сервер в UDP клиент - сервер...
Клиент: #include <iostream> #include <stdio.h> #include <cstdlib> #include <unistd.h> #include <stdarg.h> #include <string.h> #include <errno.h> #include <netdb.h> #include <sys/time.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <ctime> #include <fstream> #include <sys/syspage.h> #include <sys/neutrino.h> using namespace std; void error( const char *msg, int err = EOK ) { perror( msg ); if( err != EOK ) errno = err; exit( EXIT_FAILURE ); } double CyclesTomsec(uint64_t a) { uint64_t b=SYSPAGE_ENTRY(qtime)->cycles_per_sec; return a*1.0e6/(double) b; } int main(int argc,char **argv) { int i=0,mas[200], mas1[200]; uint64_t t, t1=0; ifstream in("mas.txt"); if(!in) cout<<"File not found\n", exit(EXIT_FAILURE); while(!in.eof()){ in>>mas[i]; i++; } in.close(); mas[i]=0xffff; int n=i+1; in_port_t listen_port = 9000; struct sockaddr_in peer; int s, rc; srand(time(NULL)); char buf[20], echo[20]; for(i=0; i<n;i++){ memset( &peer, 0, sizeof(peer)); peer.sin_len = sizeof(peer); peer.sin_family = AF_INET; peer.sin_port = htons(listen_port); inet_aton( "localhost", &peer.sin_addr ); s=socket(AF_INET,SOCK_STREAM,0); if (s<0) error ("create stream socket failed"); if (connect(s,(struct sockaddr *) &peer,sizeof(peer))) error("connect failed"); sprintf(buf, "%d", mas[i]); t = ClockCycles(); if( ( rc = write( s, buf, strlen(buf) + 1 )) <= 0 ) { perror( "write data failed" ); break; }; rc = read( s, echo, 20 ); t1+=ClockCycles()-t; if( rc < 0 ) { perror( "read data failed" ); break;}; if( rc == 0 ) { std::cout << "server closed connection" << std::endl; break; }; if( strcmp(buf, echo )== 0 ) { cout << "wrong data" << std::endl; break;}; mas1[i]=atoi(echo); close( s ); } cout << "Common time of connection - " <<CyclesTomsec(t1/n)<< " mcs"<<std::endl; ofstream out("mas1.txt"); if(!out) cout<<"File not found\n", exit(EXIT_FAILURE); for(i=0;i<n-1;i++) { out<<mas1[i]<<" "; } out.close(); exit(EXIT_SUCCESS); } Сервер: #include <iostream> #include <stdio.h> #include <cstdlib> #include <unistd.h> #include <stdarg.h> #include <string.h> #include <errno.h> #include <netdb.h> #include <sys/time.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> using namespace std; void error( const char *msg, int err = EOK ) { perror( msg ); if( err != EOK ) errno = err; exit( EXIT_FAILURE ); } static int server(int s) { int rc, k,k1; char buf[20]; rc = read( s, buf, 20 ); k=atoi(buf); if( rc>0) if(k!=0xffff){ k1=k^0xaa; sprintf(buf, "%d", k1); write( s, buf, strlen(buf) + 1 ); } return k; } int main( int argc, char **argv) { in_port_t listen_port = 9000; struct sockaddr_in peer; socklen_t peerlen; int s, s1, k; const int on = 1; s = socket(AF_INET,SOCK_STREAM,0); if (s<0) error ("create stream socket failed"); if (setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))) error("setsockopt failed"); memset( &peer, 0, sizeof(peer)); peer.sin_len = sizeof(peer); peer.sin_family = AF_INET; peer.sin_port = htons(listen_port); peer.sin_addr.s_addr=htonl(INADDR_ANY); if (bind(s,(struct sockaddr * ) &peer,sizeof(peer))) error("bind failed"); if (listen(s, 25)) error("listen failed"); do { peerlen = sizeof (peer); s1= accept(s,(struct sockaddr * )&peer, &peerlen); if (s1<0) error("accept failed"); k=server(s1); close(s1); } while (k!=0xffff); exit(EXIT_SUCCESS); } |
Сообщ.
#2
,
|
|
|
На сервере надо сделать bind (у тебя уже сделано), а потом в цикле - select (вместо listen и accept) и recv.
На клиенте - просто создать сокет с типом SOCK_DGRAM и делать sendto, на адрес сервера |
Сообщ.
#3
,
|
|
|
"Переписать" эти коды просто нельзя.
Взаимодействие клиент/сервер по протоколу TCP абсолютно не похоже на взаимодействие их по UDP. Принцип совершенно иной. В клиенте нет connect(), передача и прием - совершенно другие функции. В сервере нет listen(),accept()и тд. Вот тут есть код и того и другого. Просто вставить свой порт. |
Сообщ.
#4
,
|
|
|
Спасибо!
|
Сообщ.
#5
,
|
|
|
Сообщ.
#6
,
|
|
|
Yу, что до меня, то я всегда на стороне WINAPI
|