Я сделал клиент чата в linux, используя сокет, и я хочу полностью уничтожить соединение. Ниже соответствующие части коды:Как полностью уничтожить соединение сокета в C
int sock, connected, bytes_recieved , true = 1, pid;
char send_data [1024] , recv_data[1024];
struct sockaddr_in server_addr,client_addr;
int sin_size;
label:
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("Socket");
exit(1);
}
if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)) == -1)
{
perror("Setsockopt");
exit(1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(3128);
server_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_addr.sin_zero),8);
if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))== -1)
{
perror("Unable to bind");
exit(1);
}
if (listen(sock, 5) == -1)
{
perror("Listen");
exit(1);
}
printf("\nTCPServer Waiting for client on port 3128");
fflush(stdout);
connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size);
//necessary code
close(sock);
goto label;
но близко (носок) оленья кожа, кажется, чтобы закрыть полностью уничтожить соединение, потому что после того, как будет «метка» код выхода отображается сообщение об ошибке
Unable to bind: Address already in use
Это соединение не происходит снова. В чем проблема? Заранее спасибо.
EDIT: Я действительно хочу, когда я запускаю сценарий с самого начала после уничтожения соединения, он должен работать как новая программа. Как мне это сделать?
Почему вы это делаете? Вы должны вернуться обратно до 'accept', а не заново создавать серверный сокет. – Mat
Зачем вы хотите закрыть и снова открыть прослушивающий сокет вместо цикла «accept()»? – dwalter
Возможный дубликат [Что такое SO_REUSEADDR (опция setsockopt) - Linux?] (Http://stackoverflow.com/questions/3229860/what-is-the-meaning-of-so-reuseaddr-setsockopt-option- linux) –