第六节、迭代回声服务器端与客户端实现

谁说胖子不能爱 提交于 2020-02-02 00:17:32

echo_server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define SERV_IP "127.0.0.1"
#define BUF_SIZE 1024

void error_handing(const char *message);

int main(int argc, char const *argv[])
{
	if(argc != 2)
	{
		printf("Usage %s <port>\n",argv[0] );
		exit(1);
	}

	int serv_fd = socket(PF_INET,SOCK_STREAM,0);
	if (serv_fd == -1)
	{
		error_handing("socket() error");
		exit(1);
	}

	struct sockaddr_in serv_addr;
	memset(&serv_addr,0,sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = inet_addr(SERV_IP);
	serv_addr.sin_port = htons(atoi(argv[1]));

	if(bind(serv_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -1)
	{
		error_handing("bind() error");
	}

	if(listen(serv_fd,5) == -1)
	{
		error_handing("listen() error");
	}

	int i;
	int clie_fd;
	struct sockaddr_in clie_addr;
	memset(&clie_addr,0,sizeof(clie_addr));
	socklen_t clie_len = sizeof(clie_addr);
	char message[BUF_SIZE] = {0};
	clie_fd = accept(serv_fd,(struct sockaddr*)&clie_addr,&clie_len);
	if(clie_fd == -1)
	{
		error_handing("accept() error");
	}
	printf("client:port:%s,ip:%d\n",inet_ntoa(clie_addr.sin_addr),ntohs(clie_addr.sin_port) );

//	for(i = 0; i < 5; i++)
	while(1)
	{
		memset(&message,0,sizeof(message));
		int str_len = read(clie_fd,message,sizeof(message));
		if(str_len == -1)
		{
			error_handing("read() error");
		}else if(str_len == 0)
		{
			break;
		}
		printf("recv client message:%s,length:%d\n",message,str_len - 1);

		write(clie_fd,message,strlen(message));
	}

	close(clie_fd);
	close(serv_fd);

	return 0;
}


void error_handing(const char *message)
{
	fputs(message,stderr);
	fputc('\n',stderr);
	exit(1);
}

echo_client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 1024

void error_handing(const char *message);

int main(int argc, char const *argv[])
{
	
	char message[BUF_SIZE];

	int str_len,recv_len,recv_cnt;

	if (argc != 3)
	{
		printf("Usage : %s <IP> <port>\n",argv[0]);
		exit(1);
	}

	int sock;
	sock = socket(PF_INET,SOCK_STREAM,0);
	if(sock == -1)
	{
		error_handing("socket() error");
	}

	struct sockaddr_in serv_adr;
	memset(&serv_adr,0,sizeof(serv_adr));
	serv_adr.sin_family = AF_INET;
	serv_adr.sin_addr.s_addr = inet_addr(argv[1]);
	serv_adr.sin_port = htons(atoi(argv[2]));

	if(connect(sock,(struct sockaddr *)&serv_adr,sizeof(serv_adr)) == -1)
	{
		error_handing("connect() error");
	}else
		puts("Connected............");

	while(1)
	{
		memset(&message,0,sizeof(message));
		fputs("Input message(Q to quit): ",stdout);
		fgets(message,BUF_SIZE,stdin);
	
		if(!strcmp(message,"q\n") || !strcmp(message,"Q\n"))
			break;

		str_len = write(sock,message,strlen(message));
		recv_len = 0;

		while(recv_len < str_len)
		{
			recv_cnt = read(sock,&message[recv_len],BUF_SIZE - 1);
			if(recv_cnt == -1)
			{
				error_handing("read() error");
			}
			recv_len += recv_cnt;
		}
		message[recv_len] = 0;
		printf("Message from server: %s",message );

	}

	close(sock);

	return 0;
}

void error_handing(const char *message)
{
	fputs(message,stderr);
	fputc('\n',stderr);
	exit(1);
}

编译

gcc echo_server.c -o echo_server
gcc echo_client.c -o echo_client

执行

./echo_server 6666
./echo_client 127.0.0.1 6666

在这里插入图片描述在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!