⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test12_3.txt

📁 linux under the C programming which complementary with the book of <linux under the C programming
💻 TXT
字号:
/*客户端代码*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
//#include <unp.h>
#define MAXSIZE 80
#define SA struct sockaddr
void str_cli(FILE *,int);

int main(int argc,char **argv)
{
  	int sockfd,ret,len;
  	struct sockaddr_in ser_addr;
  	char *myname;
	struct servent *server;
  	struct hostent *sh;
  	struct in_addr **addrs;

  	if(argc!=2)	
	{
		printf("parameters not match.");
		exit(0);
  	}
  	/*判断参数是否匹配 */

	if((server=getservbyname(argv[1],NULL))==NULL)
	{
		printf("error when getservbyname");
		exit(0);
	}
	/*/获得服务器信息*/
  	if((sh=gethostbyname(server->s_name))==NULL)
	{
    		printf("error when gethostbyname");
    		exit(0);
  	}
  	/* 根据服务器名获得详细信息*/
  	addrs=(struct in_addr **)sh->h_addr_list;
	for(;*addrs!=NULL;addrs++)
	{
   		sockfd=socket(AF_INET,SOCK_STREAM,0);
  		if(sockfd<0)
		{
      			printf("error in socket");
     			exit(1);
   		}
   		/* 创建套接口*/
 		ser_addr.sin_family=AF_INET;
 		ser_addr.sin_port=server->s_port;
 		memcpy(&(ser_addr.sin_addr),*addrs,sizeof(struct in_addr));
 		bzero(&(ser_addr.sin_zero),8);
		ret=connect(sockfd,(SA *)&ser_addr,sizeof(struct sockaddr));
 		if(ret==0)
    			break;
		/* 连接成功则跳出循环*/
 		else 
		{
      			printf("error connecting");
      			close(sockfd);
  		}
	}
/*尝试与服务器的各个地址连接,知道连接上其中一个为止 */
	if(*addrs==NULL)
	{
     		printf("can’t get connected with server");
     		exit(0);
 	}
 	/*连接不成功则报错并退出 */
	str_cli(stdin,sockfd);
	/*数据传输操作 */
	close(sockfd);
	exit(0);
}

void str_cli(FILE *fp,int sockfd)
{
   	char sends[MAXSIZE],recvs[MAXSIZE];
   	int n=0;
   	while(fgets(sends,MAXSIZE,fp)!=NULL)
   	{
       		send(sockfd,sends,strlen(sends),0);
       		if((n=recv(sockfd,recvs,MAXSIZE,0))==0)
		{
             		printf("error receiving data");
             		exit(1);
       		}
       		recvs[n]=0;
       		fputs(recvs,stdout);
     	}
}


/*服务器端代码*/
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
//#include <unp.h>
#define MAXSIZE 80
#define MYPORT 3490
#define BACKLOG 10
#define BUFSIZE 100
#define true 1
void str_ser(int);

main ( )
{
    	int sockfd,new_fd,numbytes,ret;
    	struct sockaddr_in my_addr;
    	struct sockaddr_in their_addr;
    	int sin_size,con_fd,pid;
    	char *buf;

    	sockfd=socket(AF_INET,SOCK_STREAM,0);
    	if(sockfd<0)
	{
         	printf("error in socket");
         	exit(1);
     	}
     	/*创建监听套接口 */
     	my_addr.sin_family=AF_INET;
     	my_addr.sin_port=htons(MYPORT);
     	my_addr.sin_addr.s_addr=htonl(INADDR_ANY);
     	bzero(&(my_addr.sin_zero),8);
     	ret=bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr));
     	if(ret<0)
	{
          	printf("error in binding");
          	exit(1);
      	}
     	/*绑定监听套接口 */
       	ret=listen (sockfd,BACKLOG);
       	if(ret<0)
	{
          	printf("error in listening");
          	exit(1);
      	}
    	/* 监听连接请求*/
       	while(true)
       	{
             	sin_size=sizeof(struct sockaddr_in);
             	con_fd=accept(sockfd,(SA *)&their_addr,&sin_size);
             	if(con_fd<0)
		{
                   	printf("error in accept");
                   	exit(1);
              	}
		/*创建新的连接 */
             	if((pid=fork())==0)
             	{
                  	close(sockfd);
                  	str_ser(con_fd);
               		/*接收并处理数据 */
                  	close(con_fd);
                  	exit(0);
              	}
          	/*子进程代码 */
              	else
                  	close(con_fd);
           	/*父进程代码 */
        }
        close(sockfd);
        exit(0);
}

void str_ser(int sockfd)
{
    	char recvs[MAXSIZE];
    	int n=0;
    	while(true)
    	{
         	if((n=recv(sockfd,recvs,MAXSIZE,0))==0)
              	return;
        /*对方关连接,返回主程序 */
         	send(sockfd,recvs,n,0);
     	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -