LINUX.ORG.RU

Проблема повторного соеденения клиента к серверу через сокет (C++)

 , , ,


1

1

Есть вот такое клиенто-серверное приложение. Первый запуск клиент-сервер работает нормально, но после того как серевер вырубается и запускается новый, клиент уже не хочет к нему коннектится.Преподователь подсказал использовать «SO_REUSEADDR» перед биндом. Но мне это не помоголо, либо же я не правильно его использую. Завтра дедлайн, помогите пожалуйста разобраться).

Сервер

#include <iostream>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sstream>
#include <math.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
using namespace std;


long double fact(int n)
{
	if (n<0)
		return 0;
	if (n == 0)
		return 1;
	else
		return n*fact(n - 1);
}

double frenel1(double x)
{	double eps=0.0001;
	double an = x*x*x / 3; double sum = an;
	int i = 1;
	while (fabs(an)>eps)
	{
		an = pow(-1, i)*pow(x, 4 * i + 3) / ((4 * i + 3)*fact(2 * i + 1));
		sum += an;
		i++;
	}
	return sum;
}


double frenel2(double x)
{	double eps=0.0001;
	double an = x; double sum = an;
	int i = 1;
	while (fabs(an)>eps)
	{
		an = pow(-1, i)*pow(x, 4 * i + 1) / ((4*i + 1)*fact(2*i));
		sum += an;
		i++;
	}
	return sum;
}


int main(int argc, char* argv[])
{
	double x,r1,r2;
	int sock, listener,test=1;
    struct sockaddr_in addr;
    listener = socket(AF_INET, SOCK_STREAM, 0);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(9535);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    setsockopt(listener,AF_INET,SO_REUSEADDR,&test,sizeof(int));
    bind(listener, (struct sockaddr *)&addr, sizeof(addr));
    listen(listener, 1);
    while(1)
    {
        sock = accept(listener, NULL, NULL);
        recv(sock, &x, sizeof(double), 0);
        if (x==-1){  shutdown(sock,1); break; };
        r1 = frenel1(x);
	r2 = frenel2(x);
        send(sock, &r1, sizeof(double), 0);
	send(sock, &r2,sizeof(double),0);
	close(sock);
    }
    
    return 0;
}


Клиент
#include <cmath>
#include <iostream>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sstream>
#include <math.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


using namespace std;

int main(int argc, char* argv[])
{
	if ((argc>1)&&(strcmp(argv[1],"--help")==0)) 
	{
	 cout<<"Integrali Frenelya\n";
	 cout<<"Ostanovka servera -e.\n";
	 return 0;
	}
	
	int sock;
    struct sockaddr_in addr;
    sock = socket(AF_INET, SOCK_STREAM, 0);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(9535);
    addr.sin_addr.s_addr =htonl(INADDR_LOOPBACK);
    if (connect(sock, (struct sockaddr*)&addr, sizeof(addr))<0) {cout<<"Error connect\n"; return 0;}
       
   
	double x;
	double r1,r2;
	if ((argc>1)&&(strcmp(argv[1],"-e")==0)) { x=-1; }
	else
	{
	 cout<<"X= ";
	 cin>>x;
	}
	send(sock,&x,sizeof(double),0);
	if(x==-1){
	    shutdown(sock,0);
	}
	else
		{
		recv(sock, &r1, sizeof(double), 0);
		recv(sock,&r2,sizeof(double), 0);
		cout<<"S("<<x<<") == "<<r1<<endl;
		cout << "R("<<x<<")=="<<r2<<endl;
	}
	close(sock);
    return 0;
}


Последнее исправление: Semaphore11 (всего исправлений: 2)

помогите пожалуйста разобраться

gdb и поочерёдно пройти по шагам клиент и сервер. Там всё очевидно.

MKuznetsov ★★★★★
()

Ошибки обрабатывать кто будет, Пушкин?

Почему отваливается клиент, можно узнать с помощью strace

читай man strace

Harald ★★★★★
()
Ответ на: комментарий от Harald

Ошибки обрабатывать кто будет

Ну виш — у него «линия смерти» завтра. Какие ему щас стрейсы читать? Он вообще видимо думал что щас налабает как на пыхпыхе и все бут работать.

deep-purple ★★★★★
()

Так ты на чем пишешь то? На крестах или на чистосях? Кроме cout и cin я ничо не вижу. Или плохо смотрел?

А вот еще: «Ostanovka servera» — ты давай заканчивай, ато так и будут у тебя всякие «papka», «fail», «otvet», «peremennaya» и т.д.

deep-purple ★★★★★
()

Дата регистрации: 01.06.2015 18:04:24

Do your own homework.

anonymous
()
Ответ на: комментарий от vvviperrr

Спасибо большое vvviperrr, я не так понимал параметры этой функции.

Да времени этому курсу я очень мало уделил, что очень зря. В основном учусь и быдлокожу на виндусе на всяких вижуал студиях.

Тему можно закрыть.

Semaphore11
() автор топика
Ответ на: комментарий от Semaphore11

Тему можно закрыть.

Нет уж, тема - общее достояние! И мы продолжим тут писать, что ты, мудак, не проверяешь ошибки и не читаешь манов. А ты сиди и читай это!

Pavval ★★★★★
()
Ответ на: комментарий от deep-purple

ато так и будут у тебя всякие «fail»

у него уже)

next_time ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.