У меня есть простая программа сокетов, созданная на C (с использованием Ubuntu), соединение работает отлично, компиляции серверов и клиент предоставляют номер IP и порта.C - Создание бесконечного соединения сокетов между сервером и клиентом (Linux)
Но когда соединение установлено, клиент может только send one message
, а затем connection closes
. Когда клиент отправляет сообщение, сервер получает его и программу ends by itself
.
Я попытался использовать while loop
, но затем он дает мне Error on binding
. Есть ли способ сделать это бесконечным, так что когда пользователь вводит exit
или некоторые specific key/command
, программа заканчивается.
server.c ОБНОВЛЕНО с WHILE LOOP
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
int main(int argc, char *argv[])
{
int sockfd, newsockfd, portNum, clien, n;
char buffer[256];
struct sockaddr_in serv_addr,cli_addr;
if (argc < 2)
{
fprintf(stderr, "\nno port provided");
exit(1);
}
sockfd = socket(AF_INET,SOCK_STREAM, 0);
if (sockfd < 0)
printf("\nprovide a valid port number\n");
bzero((char *)&serv_addr, sizeof(serv_addr));
portNum = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portNum);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
printf("error on binding");
while(1)
{
listen(sockfd,5);
}
clien = sizeof(cli_addr);
newsockfd=accept(sockfd, (struct sockaddr *) &cli_addr, &clien);
if (newsockfd < 0)
printf("=> Error on accepting...\n");
bzero(buffer, 256);
n = read(newsockfd, buffer, 256);
if (n < 0)
printf("error reading from socket...\n");
printf("%s\n", buffer);
n = write(newsockfd, "message received.", 58);
if (n < 0)
printf("cannot write from socket...\n");
return 0;
}
client.c ОБНОВЛЕНО с WHILE LOOP
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<string.h>
int main(int argc, char *argv[])
{
int sockfd,portno,n;
char buffer[256];
struct sockaddr_in serv_addr;
struct hostent *server;
//while(counter != 5)
// /{
if (argc < 3)
{
fprintf(stderr,"Usage %s hostname port...\n",argv[0]);
exit(1);
}
portno = atoi(argv[2]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
printf("\error opening socket...\n");
bzero((char *) &serv_addr, sizeof(serv_addr));
server = gethostbyname(argv[1]);
if (server == NULL)
{
fprintf(stderr,"no such host...\n");
exit(0);
}
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,(char *)&serv_addr.sin_addr.s_addr,server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd, &serv_addr,sizeof(serv_addr)) <0)
printf("\error connecting\n");
printf("your message:");
fgets(buffer, 256, stdin);
while(1)
{
n = write(sockfd,buffer,strlen(buffer));
}
if (n < 0)
printf("error writing to socket\n");
n = read(sockfd, buffer, 255);
if (n < 0)
printf("error reading from socket\n");
printf("%s\n", buffer);
return 0;
}
Спасибо.
Вы должны быть обязательные один раз, но для прослушивания соединений в то время цикла. В настоящее время, как вы его кодировали, серверный процесс заканчивается, как только он получает (или не получает) сообщение. – mittmemo
вы можете использовать функцию setsocketoptions(), чтобы включить «keepalive». Тогда соединение не будет закрыто, пока клиентский или серверный конец не выйдет из программы или сокет не будет явно закрыт (предпочтительно: «shutdown (socket, SHUT_RDWR); (socket); ' – user3629249
keepalive можно установить с помощью:' INT32 keepAlive = 1; INT32 result = 0; result = setsockopt (socket, SOL_SOCKET, SO_KEEPALIVE и keepAlive, (socklen_t) sizeof (keepAlive)); ' – user3629249