TCP网络编程

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <signal.h>

extern void sig_proccess(int signo);

#define PORT 8888		/* 侦听端口 */
#define BACKLOG 2		/* 侦听队列长度 */
int main(int argc, char *argv[])
{
	int ss,sc;			/* ss服务器socket描述符,sc客户端socket描述符 */
	struct sockaddr_in server_addr; /* 服务器结构地址 */
	struct sockaddr_in client_addr;	/* 客户端结构地址 */
	int err;	
	pid_t pid;	
	
	signal(SIGINT, sig_proccess);
	signal(SIGPIPE, sig_proccess);
	
	
	/* 建立流失套接字 */
	ss = socket(AF_INET, SOCK_STREAM, 0);
	if(ss < 0){
		printf("socket error\n");
		return -1;	
	}	
	
	/* 设置服务器地址 */
	bzero(&server_addr, sizeof(server_addr));		/* 清零 */
	server_addr.sin_family = AF_INET;				/* 协议族 */
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);/* 本地地址 */
	server_addr.sin_port = htons(PORT);				/* 服务器端口 */
	
	/* 绑定地址结构和套接字 */
	err = bind(ss, (struct sockaddr*)&server_addr, sizeof(server_addr));
	if(err < 0){
		printf("bind error\n");
		return -1;	
	}
	
	/* 侦听连接请求 */
	err = listen(ss, BACKLOG);
	if(err < 0){
		printf("listen error\n");
		return -1;	
	}
	
	/* 主循环 */
	for(;;)	{
		int addrlen = sizeof(struct sockaddr);
		/* 接收客户端连接 */
		sc = accept(ss, (struct sockaddr*)&client_addr, &addrlen);
		if(sc < 0){		
			continue;	
		}	
		
		/* 建立一个新进程处理到来的连接 */
		pid = fork();		/* fork一个进程 */
		if( pid == 0 ){		
			close(ss);		/* 子进程关闭服务器的侦听 */
			process_conn_server(sc);/* 处理连接 */
		}else{
			close(sc);		/* 父进程关闭客户端的连接 */
		}
	}
}

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <signal.h>

extern void sig_proccess(int signo);
extern void sig_pipe(int signo);
static int s;
void sig_proccess_client(int signo)
{
	printf("Catch a exit signal\n");
	close(s);
	exit(0);	
}

#define PORT 8888	
int main(int argc, char *argv[])
{

	struct sockaddr_in server_addr;	/* 服务器地址 */
	int err;
		
	signal(SIGINT, sig_proccess);
	signal(SIGPIPE, sig_pipe);
	
	/* 建立流式套接字 */
	s = socket(AF_INET, SOCK_STREAM, 0);
	if(s < 0){
		printf("socket error\n");
		return -1;	
	}	
	
	/* 设置服务器地址 */
	bzero(&server_addr, sizeof(server_addr));		
	server_addr.sin_family = AF_INET;				
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	server_addr.sin_port = htons(PORT);				
	
	/* 将用户输入的IP地址转化为整型 */
	inet_pton(AF_INET, argv[1], &server_addr.sin_addr);	
	/* 连接服务器 */
	connect(s, (struct sockaddr*)&server_addr, sizeof(struct sockaddr));
	/* 处理连接 */
	process_conn_client(s);	
	/* 关闭连接 */
	close(s);	
}


#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>

/* 服务器对客户端的处理 */
void process_conn_server(int s)
{
	ssize_t size = 0;
	char buffer[1024];	/* 数据缓冲区 */
	
	for(;;){
		/* 从套接字中读取数据到buffer中 */
		size = read(s, buffer, 1024);	
		if(size == 0){
			return;	
		}
		/* 显示在屏幕上 */
		printf("Server: ");
		write(1, buffer, size);
		printf("\n");

		/* 读取标准输入到buffer */
		size = read(0, buffer, 1024);
		if(size > 0)
		{
			/*发送到客户端*/	
			write(s,buffer,size);
		}
		/* 构建响应字符 */
		//sprintf(buffer, "%d bytes altogether\n", size);
		/* 发送给客户端 */
		//write(s, buffer, strlen(buffer)+1);
	}	
}

/* 客户端的处理 */
void process_conn_client(int s)
{
	ssize_t size = 0;
	char buffer[1024];	
	
	for(;;){
		size = read(0, buffer, 1024);		/* 标准输入(键盘输入),读取数据到buffer */
		if(size > 0){						/* 读取到数据 */
			write(s, buffer, size);			/* 发送给服务器 */	

			size = read(s, buffer, 1024);	/* 从服务器读取数据 */
			printf("Client: ");
			write(1, buffer, size);			/* 标准输出(显示在屏幕上) */
			printf("\n");
		}
	}	
}

void sig_proccess(int signo)
{
	printf("Catch a exit signal\n");
	exit(0);	
}

void sig_pipe(int sign)
{
	printf("Catch a SIGPIPE signal\n");	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值