c 利用进程的聊天程序

利用父进程,子进程分别监控同一socket文件的读与写,感觉应该加入两进程的互斥,也就是不能在同一时间又读又写,但现在没加也可以用。可能是使用频速不高。用pipe管道置一标准位来完成互斥。我现在用小熊猫c++来编程,发现不能编译此文件。但又想用此软件的编程提示功能。所以用此软件编好文本,再用gcc 编译就ok了。

此程序不完善,最主要是用两进程分别完成同一文件的读与写的功能这个方法。当然也可以用select()的端口复用或者线程来完成。

服务器:

#include 
#include 
#include 
#include 
#include 
#include 


int main(int argc,char *argv[]){
	int serv_sock;
	int ck;
	
	struct sockaddr_in  serv_addr;      
	struct sockaddr_in  clnt_addr;      
	socklen_t   clnt_addr_size;       


	
	serv_sock=socket(PF_INET,SOCK_STREAM,0);
	setsockopt(serv_sock,SOL_SOCKET,SO_TYPE,NULL,0);
	if(serv_sock==-1){
		puts("socket error");
	}
	memset(&serv_addr,0,sizeof(serv_addr));       
	serv_addr.sin_family=AF_INET;                 
	serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
	serv_addr.sin_port=htons(3000);
	
	struct sockaddr_in *myaddr=&serv_addr;	
	if(bind(serv_sock,(struct sockaddr*)myaddr,sizeof(serv_addr))==-1){     
		puts("bind error|port binding");
	}
	if(listen(serv_sock,5)==-1)
		puts("listen() error");
	printf("%s\n","listening port");
	
	clnt_addr_size=sizeof(clnt_addr);
	struct sockaddr_in *myclnt=&clnt_addr;
	ck=accept(serv_sock,(struct sockaddr*)myclnt,&clnt_addr_size);
	if(ck==-1)                                  
		puts("accept() error");
	
	
	//-------------------------------------------------------------
	
	int fz[2];
	int zf[2];
	pipe(fz);
	pipe(zf);
	
	
	pid_t pid=fork();
	char c[10];
	if(pid==0){
		while(1){
	    	
			scanf("%s",c);
			write(ck,c,10);
		}
		
	}else{
		while(1){
		   char o[20]={};
		   read(ck,o,20);
		   printf("%s\n",o);
		}
		
	}

	return 0;
}


客户端

#include 
#include 
#include 
#include 
#include 
#include 


int main(int argc,char *argv[]){
	int sock;
	struct sockaddr_in serv_addr;
	
	sock=socket(PF_INET,SOCK_STREAM,0);
	if(sock==-1)
		puts("socket() error");
	memset(&serv_addr,0,sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
	serv_addr.sin_port=htons(3000);
	
	struct sockaddr_in *myaddr=&serv_addr;
	
	if(connect(sock,(struct sockaddr*)myaddr,sizeof(serv_addr))==-1)
		puts("connect() error");

   int fz[2];
	int zf[2];
	pipe(fz);
	pipe(zf);
	

		pid_t pid=fork();
		char c[10];
		if(pid==0){
			while(1){
				scanf("%s",c);
				write(sock,c,10);
			}
			
		}else{
			while(1){
				char o[20]={};
				read(sock,o,20);
				printf("%s\n",o);
			
				}
			
		}
	
    return 0;
}

 

 

你可能感兴趣的:(c语言,开发语言)