您的位置:首页 > 理论基础 > 计算机网络

面试总结---TCP实现的chat_room程序

2014-11-12 22:41 162 查看
今天面试的时候遇到一个面试官问我关于socket套接字实现聊天室的功能的软件,上一篇博客写的是UDP的聊天室软件程序,现在这个是TCP聊天室的软件代码。

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

/************************************************************************
函数名称:	int main(int argc, char *argv[])
函数功能:	主函数,建立一个TCP Chat Room
函数参数:	可以传参改变自己的端口号,亦可不传参使用默认值
函数返回:	无
************************************************************************/
int main(int argc, char *argv[])
{
	unsigned short port = 8000;
	if(argc >1)
	{
		port = atoi(argv[1]);
	}
	
	int sockfd = socket(AF_INET, SOCK_STREAM,0);
	if(sockfd < 0)
	{
		perror("socket");
		exit(-1);
	}
	
	struct sockaddr_in my_addr;
	bzero(&my_addr, sizeof(my_addr));
	my_addr.sin_family = AF_INET;
	my_addr.sin_port = htons(port);
	my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	
	int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));
	if(err_log != 0)
	{
		perror("bind");
		close(sockfd);
		exit(-1);
	}
	
	err_log = listen(sockfd, 10);
	if(err_log != 0)
	{
		printf("listen");
		close(sockfd);
		exit(-1);
	}
	
	struct sockaddr_in client_addr;
	char cli_ip[INET_ADDRSTRLEN] = "";
	socklen_t cliaddr_len = sizeof(client_addr);
	
	int connfd = accept(sockfd, (struct sockaddr*)&client_addr, &cliaddr_len);
	if(connfd < 0)
	{
		perror("accept");
		close(sockfd);
		exit(-1);
	}
	
	inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN);
	
	while(1)
	{
		char recv_buf[1024] ="";
		char send_buf[1024] ="";
		
		if(recv(connfd, recv_buf, sizeof(recv_buf), 0) == 0)
		{
			printf("client closed!\n");
			close(sockfd);
			close(connfd);
			exit(-1);
		}
		
		printf("%s : %s\n", cli_ip, recv_buf);
		
		fgets(send_buf, sizeof(send_buf), stdin);
		send_buf[strlen(send_buf)-1] = '\0';
		send(connfd, send_buf, strlen(send_buf), 0);
	}
	
	close(sockfd);
	close(connfd);
	return 0;
}

下面的这个是client部分的代码:

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

/************************************************************************
函数名称:	int main(int argc, char *argv[])
函数功能:	主函数,建立一个TCP Echo Client
函数参数:	可以传参改变服务器的ip地址和其端口号,亦可不传参使用默认值
函数返回:	无
************************************************************************/
int main(int argc, char *argv[])
{
	unsigned short port = 8000;
	char *server_ip = "172.20.223.55";
	
	if(argc > 1)
	{
		server_ip = argv[1];
	}
	
	if(argc > 2)
	{
		port = atoi(argv[2]);
	}
	
	int sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if(sockfd < 0)
	{
		perror("socket");
		exit(-1);
	}
	
	struct sockaddr_in server_addr;
	bzero(&server_addr, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(port);
	inet_pton(AF_INET, server_ip, &server_addr.sin_addr);
	
	int err_log = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
	if(err_log != 0)
	{
		perror("connect");
		close(sockfd);
		exit(-1);
	}
	
	printf("connect to %s success\nplease input your message\n", server_ip);
	
	while(1)
	{
		char send_buf[512] = "";
		char recv_buf[512] = "";
		
		fgets(send_buf, sizeof(send_buf), stdin);
		send_buf[strlen(send_buf)-1] = '\0';
		
		if(strcmp(send_buf, "exit") == 0)
		{
			close(sockfd);
			exit(0);
		}
		
		send(sockfd, send_buf, strlen(send_buf), 0);
		recv(sockfd, recv_buf, sizeof(recv_buf), 0);
		printf("recv message:%s\n", recv_buf);
		
	}
}

下面的部分是Makefile的代码:

all:server client
TARGET = server client
CFLAGS = -Wall
CC = gcc

server:server.c
	gcc server.c -o server $(CFLAGS)
client:client.c
	gcc client.c -o client $(CFLAGS)

clean:
	rm -rf *.o  $(TARGET)



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: