如何使该代码成为多线程? [英] How do I make this code multithreaded?

查看:60
本文介绍了如何使该代码成为多线程?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/file.h>
#include <malloc.h>
#define r 45
#define z 500
int main(void)

{
	
	int servsock,clisock;
	int servlen,clilen;
	char statusok='k';
	char statusnak='n';
	struct sockaddr_in server_address;
	struct sockaddr_in client_address;


	servsock = socket(AF_INET,SOCK_STREAM,0);

	bzero(&server_address, sizeof(server_address));
	server_address.sin_family = AF_INET;
	server_address.sin_port=htons(5001);
	server_address.sin_addr.s_addr=htonl(INADDR_ANY);

	servlen = sizeof(server_address);
	bind(servsock, (struct sockaddr *)&server_address,servlen);

	listen(servsock,9);

	FILE *fp,*fp1;
	FILE *pdfn,*pdfl,*f1,*f3,*f2,*f4;	
	char user[30],pass[30];
	char buffer[45];
	char *st;
	char dfl,dfn;
	int found=0;
	char *user1;
	char *pass1;

	char ch;
	char enews[z],sports[z],nws[z],weather[z];
	char dl[2],dn[2],np[30];
	char use,bfr[50];
	int index1,index2,i1,i2,y;
/*-----------------------------------------------------------------*/
/*        Reading and Storing the browsinf menu			   */
/*-----------------------------------------------------------------*/
	f1=fopen("enews.dat","rb");
	fgets(enews,z,f1);
	fclose(f1);
	
	f3=fopen("sports.dat","rb");
	fgets(sports,z,f1);
	fclose(f3);
	
	printf("%s",enews);
	printf("%s",sports);
	for (y=0;y<3;y++)	
	fork();	
while(1)
{	
	printf("server is running.....\n");	
	clilen = sizeof(client_address);
	clisock = accept(servsock,(struct sockaddr *) &client_address,&clilen); 


	
/*-----------------------------------------------------------------*/
/*        User name and password Validation Section 		   */
/*-----------------------------------------------------------------*/
/*Reading Username*/
/*Reading Password*/
/*Writing ACK/NACK*/
		
	
	found=0;
	read(clisock, &user, 30);
	read(clisock, &pass, 30);
	
	
	

	

	fp=fopen("userpass.dat","r+");
	
	while(st)
	{	
		st=fgets(buffer,r,fp);
		fp1=fp;
		i1=0;
		i2=0;
		
		
		user1=malloc(30);
		pass1=malloc(30);		
		while (buffer[i1] !=' ')
		{
			user1[i1]=buffer[i1];
			i1++;
		}
			i1++;		
		while (buffer[i1] !=' ')
		
		{
			pass1[i2++]=buffer[i1++];
			
			
		}
		i1++;
		dfl=buffer[i1];
		dfn=buffer[i1+2];	

		
		printf(	"DFL= %c \n",dfl);
		printf(	"DFN = %c \n",dfn);
		printf(	"Data in Buffer= %s \n",buffer);
		printf(	"user opened = %s \n",user1);
		printf(	"pass opened = %s \n",pass1);
		
			
		printf(	"user rec = %s\n",user);
		printf(	"pass rec = %s\n",pass);

		printf(	"strlen user = %d\n",strlen(user));
		printf(	"strlen user1 = %d\n",strlen(user1));

		printf(	"strlen pass = %d\n",strlen(pass));
		printf(	"strlen pass1 = %d\n",strlen(pass1));
		
		
		
		if (!(strcmp(user1,user)) && !(strcmp(pass1,pass)))	
		{
			write(clisock, &statusok,1);
			found=1;
			break;

		}
			

	}   /*end of the file reading while */
		free(user1);
		free(pass1);
	if (found==0)
	{
		write(clisock, &statusnak,1);
		close(clisock);
	
	}	



/*-----------------------------------------------------------------*/
/*        Sending Defaults to the user 				   */
/*-----------------------------------------------------------------*/
/*Writing Default news First*/
	
	if (found==1)
	{

	char buff[500];
	pdfn=fopen("news.dat","rb");

	if (dfn=='0') /*Means Breaking news*/
	{
		fgets(buff,z,pdfn);
	}
	
	if (dfn=='1') /*Means National news*/
	{
		fgets(buff,z,pdfn);
		fgets(buff,z,pdfn);
	}
	if (dfn=='2') /*Means International news*/
	{
		fgets(buff,z,pdfn);
		fgets(buff,z,pdfn);
		fgets(buff,z,pdfn);
	}
	printf("^^^^^^^^^ %s ",buff);
	fclose(pdfn);
	write(clisock, &buff,500);

/*Writing weather news*/	

	
	
	pdfl=fopen("weather.dat","rb");

	if (dfl=='0') /*Location 0*/
	{
		fgets(buff,z,pdfl);
	}

	if (dfl=='1') /*Location 1*/
	{
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
	}
	if (dfl=='2') /*Location 2*/
	{
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
	}
	if (dfl=='3') /*Location 3*/
	{
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
	}
	if (dfl=='4') /*Location 4*/
	{
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
	}
	if (dfl=='5') /*Location 5*/
	{
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
	}
	if (dfl=='6') /*Location 6*/
	{
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
	}
	if (dfl=='7') /*Location 7*/
	{
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
		fgets(buff,z,pdfl);
	}
	fclose(pdfl);
	write(clisock, &buff,500);
/*-----------------------------------------------------------------*/
/*        Entertainment the browsing commands			   */
/*-----------------------------------------------------------------*/
	while(1)
	{
			read(clisock, &ch,1);
			if(ch=='7')
			{
				break;
			}			
			if(ch=='1')
			{
				write(clisock,&enews,z);
			}		
			
			if(ch=='3')		
			{
				write(clisock,&sports,z);
			}
			if(ch=='2')		
			{	
				f2=fopen("weather.dat","rw");			
						
				fgets(weather,z,f2);	
				write(clisock,&weather,z);
				
				fgets(weather,z,f2);	
				write(clisock,&weather,z);

				fgets(weather,z,f2);	
				write(clisock,&weather,z);

				fgets(weather,z,f2);	
				write(clisock,&weather,z);

				fgets(weather,z,f2);	
				write(clisock,&weather,z);

				fgets(weather,z,f2);	
				write(clisock,&weather,z);

				fgets(weather,z,f2);	
				write(clisock,&weather,z);

				fgets(weather,z,f2);	
				write(clisock,&weather,z);
				fclose(f2);
							
			}		
			if(ch=='4')		
			{	
				f4=fopen("news.dat","r");			
						
				fgets(nws,z,f4);	
				write(clisock,&nws,z);
				
				fgets(nws,z,f4);	
				write(clisock,&nws,z);

				fgets(nws,z,f4);	
				write(clisock,&nws,z);
				fclose(f4);
							
			}		
					
			if(ch=='5')		
			{
				read(clisock,&dn,2);
				read(clisock,&dl,2);
				read(clisock,&np,30);
			index1=0;
			index2=0;			
			while (bfr[index1] !=' ')
			{
							
				index1++;
			}
			index1++;
			while (bfr[index1] !=' ')
			{
				bfr[index1]=np[index2];
				index1++;
				index2++;
			}
				write(clisock,"pass & location changed Sucessfull...",z);
				fputs(bfr,fp1);
			}
			

				
	}
		


}/*if found */
fclose(fp);
}/*end the while*/
close(clisock);


close(servsock);

} /* End Main*/

推荐答案

假设您要在Windows中执行此操作!!!

删除fork调用,并在其位置执行CreateThread以创建新线程.
将具有accept调用的while循环放在此线程中.
当客户端连接时accept返回时,创建另一个线程来处理连接的客户端.这意味着其余代码将在第二个线程中.

您还可以查看I/O完成端口-
使用完成端口编写可扩展的Winsock应用程序 [ I/O完成端口的工作方式 [
Assuming you want to do this in Windows!!!

Remove the fork call and in its place do a CreateThread to create a new thread.
Place the while loop having the accept call in this thread.
When accept returns when a client connects, create another thread to process the connected client. This means the rest of the code would be in the second thread.

You could also look at I/O Completion Ports -
Write Scalable Winsock Apps Using Completion Ports[^]
How I/O Completion Ports Work[^]


这篇关于如何使该代码成为多线程?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆