Нагородил я конечно в той теме... Решил пересоздать, и все нормально сформулировать.
Нашел проблему, но не понимаю, как исправить. Сервер блокируется и ждет нового подключения. Клиенты не могут обмениваться сообщениями.
Как исправить эту проблему?
//sever.c
#include<sys/types.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<errno.h>
#include <string.h>
#include<unistd.h>
#include<stdlib.h>
void main(int argc,char **argv)
{
int flag=0;
int sockfd,newsockfd1,newsockfd2;
int n,k,m;
int client;
char line1[1000], line2[1000];
struct sockaddr_in servaddr,cliaddr;
if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){
perror(NULL);
exit(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port = htons(51000);
servaddr.sin_addr.s_addr =htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0){
perror(NULL);
close(sockfd);
exit(1);
}
if(listen(sockfd,8)<0){
perror(NULL);
close(sockfd);
exit(1);
}
while(1){{
client=sizeof(cliaddr);
if((newsockfd1=accept(sockfd,(struct sockaddr*)&cliaddr,&client))<0){
perror(NULL);
close(sockfd);
exit(1);
}
if((newsockfd2=accept(sockfd,(struct sockaddr*)&cliaddr,&client))<0){
perror(NULL);
close(sockfd);
exit(1);
}
if((n=read(newsockfd1,line1,999))>0){
if((n=write(newsockfd2,line1,strlen(line2)+1))<0)
{
perror(NULL);
close(sockfd);
close(newsockfd1);
close(newsockfd2);
exit(1);
}}
if((n=read(newsockfd2,line2,999))>0){
if((n=write(newsockfd1,line2,strlen(line2)+1))<0)
{
perror(NULL);
close(sockfd);
close(newsockfd1);
close(newsockfd2);
exit(1);
}}
}
if(n<0){
perror(NULL);
close(sockfd);
close(newsockfd1);
close(newsockfd2);
exit(1);
}
//close(newsockfd1);
//close(newsockfd2);
}
}
#include<sys/types.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include <string.h>
#include<unistd.h>
void main(int argc,char **argv)
{
int sockfd;
int n;
int i;
char sendline[1000],recvline[1000];
struct sockaddr_in servaddr;
if(argc!=2){
printf("Usage:a.out <IP address>\n");
exit(1);
}
bzero(sendline,1000);
bzero(recvline,1000);
if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){//AF or PF
perror(NULL);
exit(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port = htons(51000);
if(inet_aton(argv[1],&servaddr.sin_addr) ==0){
printf("INvalid IP address\n");
close(sockfd);
exit(1);
}
if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0){
perror(NULL);
close(sockfd);
exit(1);
}
for(i=0;i<3;i++){
printf("Message:\n");
fflush(stdin);
fgets(sendline,1000,stdin);
if((n=write(sockfd,sendline,strlen(sendline)+1))<0){
perror("Can\'t write \n");
close(sockfd);
exit(1);
}
if((n=read(sockfd,recvline,999))<0){
perror("Can\'t read \n");
close(sockfd);
exit(1);
}
printf("%s",recvline);
bzero(sendline,1000);
bzero(recvline,1000);
}
close(sockfd);
}