ارجو المساعدة برنامج بين الـ2clients و server
السلام عليكم
أرجو المساعدة في برنامج يربط بين 2 كلاينت وسيرفر واحد
قبل الاتصال السيرفر يسأل الكلاينت عن اليوزر والباسورد اللي راح تكون مخزنه في ملف .txt
واذا كان الباسورد صح راح يصير زي الشات بينهم واذا تم ارسال -1 يتم قطع الاتصال
الكود بلغة السي لنظام لينكس انا اشتغل في برنامج VMWare
أتمنى ان يكون الشرح واضح
واتمنى المساعده عاااجلا
هذي محاولاتي :)
كود:
//server side
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include<stdlib.h>
#include<time.h>
#include<malloc.h>
#include<unistd.h>
#define ERROR -1
#define MAX_CLIENTS 2
#define BUFFER 1024
#define maxmem_size 192
typedef struct
{
unsigned int ID;
char username[30];
char pass[30];
} UData;
int in;
UData inputQ[maxmem_size];
int ind (int index) // to arrange the indexes
{
in=+index;
return in;
}
void error(char *msg)
{
perror(msg);
exit(1);
}
int main (int argc, char *argv[])
{
int sockfd, newsockfd, portno, clilen;
int ppid;
char buffer[256];
char input[BUFFER];
struct sockaddr_in serv_addr, cli_addr;
int n;
pid_t processid ;
char username[30];
char pass[30];
char user;
int i,len,port;
char content[30];
if((sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==-1)
{
printf("\nSocket problem");
return 0;
}
printf("\nSocket created\n");
bzero((char*)&cli_addr,sizeof(serv_addr));
portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(atoi(argv[1]));
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
{
printf("\nBinding problem");
return 0;
}
n = listen(sockfd, 2);
if (newsockfd = accept(sockfd,((struct sockaddr *)&cli_addr),&n) < 0)
{
printf("\nCheck the deion parameter\n");
return 0;
}
printf("\n\t\t\tConnection accepted!\n");
static const char filename[] = "data.txt";
FILE *fp = fopen("data.txt", "r");
// File failed to open?
if (fp != NULL)
{
char line[BUFSIZ];
printf("\t<User Name> <Password>\n");
printf("\t----------------------------------\n");
i=0;
while ( fgets(line, sizeof line, fp) != NULL && sscanf(line, "%s %s",&inputQ[i].username, &inputQ[i].pass) == 2 )
{
i++;
}
int s = i; // number of lines in text file (No. of Processes)
for(i = 0 ; i < s ;i++)
{
printf("\t %s %s\n",inputQ[i].username,inputQ[i].pass);
}
}
i = recv(newsockfd,username,30,0);
if(i)
{
username[i]='\0';
printf("\nClient: %s\n",username);
}
//compare between client input and data in file
int z=atoi(username);
int s=i;
for(i = 0 ; i < s ;i++)
{
if(z==inputQ[i].username)
{
i=1;
send(newsockfd,"Welcome: username is found",30,0);
printf("New client connect from port no. %d and IP %s and ppid %d \n" , ntohs(cli_addr.sin_port), inet_ntoa(cli_addr.sin_addr),getppid());
}
else
{
printf("Invalid login\n");
exit(0);
}
if(fork())
{
printf("\nEnter the data to be send type -1 for stop:\n");
scanf("%s",input);
while(strcmp(input,"-1")!=0)
{
send(newsockfd,input,30,0);
scanf("%s",input);
}
send(newsockfd,"-1",5,0);
}
else
i = recv(newsockfd,input,30,0);
while(strcmp(input,"-1")!=0)
{
printf("\nClient: %s\n",input);
i=recv(newsockfd,input,30,0);
}
}
}
كود:
//Client side
#include<stdio.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<string.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<unistd.h>
#include<arpa/inet.h>
#define ERROR -1
#define BUFFER 1024
#define maxmem_size 192
typedef struct
{
unsigned int ID;
char username[30];
char pass[30];
} UData;
int in;
UData inputQ[maxmem_size];
int ind (int index) // to arrange the indexes
{
in=+index;
return in;
}
main (int argc, char argv)
{
struct sockaddr_in cli;
int sockfd;
char input[BUFFER];
char output[BUFFER];
char line[BUFSIZ];
char username[30];
char pass2[30];
char user;
int len;
int con,port,i,Res;
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == ERROR)
{
perror("socket: ");
exit(-1);
}
cli.sin_family = AF_INET;
cli.sin_port = htons(atoi(argv[2]));
cli.sin_addr.s_addr = inet_addr(argv[1]);
bzero(&cli.sin_zero, 8);
if((connect(sockfd, (struct sockaddr *)&cli, sizeof(struct sockaddr_in))) == ERROR)
{
perror("connect");
exit(-1);
}
printf("Please enter the user name: \n");
scanf("%s", username);
send(sockfd,username,30,0);
scanf("%s",username);
if(fork())
{
printf("\nEnter the data to be send type -1 for stop:\n");
scanf("%s",input);
while(strcmp(input,"-1")!=0)
{
send(sockfd,input,30,0);
scanf("%s",input);
}
send(sockfd,"-1",5,0);
}
else
{
i=recv(sockfd,input,30,0);
while(strcmp(input,"-1")!=0)
{
printf("\nServer: %s\n",input);
i=recv(sockfd,input,30,0);
}
send(sockfd,"-1",5,0);
}
close(sockfd);
return 0;
}
|