Я пытаюсь это сделать в Linux, и я новичок в сокетах на языке C, я создал клиента и сервер на C, он хорошо работает, когда я отправляю одно сообщение, но когда я зацикливаюсь, чтобы получитьпродолжает чат, сообщения не печатаются на стороне сервера, за исключением первого сообщения, я пытаюсь это на локальном хосте вот код клиента:
#include<stdio.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
int main(){
char msg[30] = {0};
struct sockaddr_in server;
struct sockaddr_in *ptr= &server;
int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if(socket_fd < 0){
perror("socket");
return 1;
}
ptr -> sin_family = AF_INET;
ptr -> sin_port = htons(10000);
ptr -> sin_addr.s_addr = INADDR_ANY;
int con = connect(socket_fd,(struct sockaddr *) &server, sizeof(server));
if(con < 0){
perror("connect");
return 1;
}
do{
memset(msg, 0, sizeof(msg));
fputs("client : ",stdout);
fgets(msg, sizeof(msg), stdin);
if(send(socket_fd, msg, sizeof(msg), 0) < 0){
perror("send");
return 1;
}
if(strncmp(msg, "!quit", 5) == 0)
break;
memset(msg, 0, sizeof(msg));
if(recv(socket_fd ,msg, sizeof(msg), 0) < 0){
perror("recv");
return 1;
}
printf("server : %s\n",msg);
}while(strncmp(msg,"!quit", 5) != 0);
puts("connection closed!");
close(socket_fd);
return 0;
}
и вот код сервера:
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
int main(){
char msg[100] = {0};
struct sockaddr_in server;
struct sockaddr_in *ptr = &server;
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
if(server_socket < 0){
perror("socket");
return 1;
}
ptr-> sin_family = AF_INET;
ptr-> sin_port = htons(10000);
ptr-> sin_addr.s_addr = INADDR_ANY;
if(bind(server_socket, (struct sockaddr *)&server, sizeof(server)) < 0){
perror("bind");
return 1;
}
if(listen(server_socket, 1) < 0){
perror("listen");
return 1;
}
int client_socket;
if((client_socket = (accept(server_socket, NULL, NULL))) < 0){
perror("accept");
return 1;
}
do{
memset(msg, 0, sizeof(msg));
if(recv(client_socket, msg, sizeof(msg), 0) < 0){
perror("recv");
return 1;
}
printf("client : %s\n",msg);
if(strncmp(msg, "!quit", 5) == 0)
break;
memset(msg, 0, sizeof(msg));
fputs("server : ",stdout);
fgets(msg, sizeof(msg), stdin);
if(send(client_socket, msg, sizeof(msg), 0) < 0){
perror("send");
return 1;
}
}while(strncmp(msg, "!quit", 5) != 0);
puts("connection closed!");
close(client_socket);
close(server_socket);
return 0;
}
также, если у вас есть какие-либо советы по поводу сокетов, наилучшей практики, скорости .... я буду рад это услышать.