栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Linux c语言 tcp网络通信 父子进程简单实现功能分离

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux c语言 tcp网络通信 父子进程简单实现功能分离

目录

代码

运行结果


代码

chat.h

#ifndef		CHAT_H__
#define		CHAT_H__

#define		PORT		"52189"
#define		IPSIZE		64
#define		MSGSIZE		1024
#define		PROGRESSMAX	8

#endif

server.c

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

#include "chat.h"

static void func_recv(int sfd){

	int len, ret, pos;
	char msgbuf[MSGSIZE];

	while(1){
		len = recv(sfd, msgbuf,	MSGSIZE, 0);
		if(len <= 0){
			break;
		}
		write(1, "nrecvmsg:", 9);
		while(len){
			pos = 0;
			ret = write(1, msgbuf+pos, len);
			pos += ret;
			len -= ret;
		}
	}

	return ;
}

static void func_send(int sfd){
	
	int len;

	char msgbuf[MSGSIZE];

	while(1){

		len = read(0, msgbuf, MSGSIZE);
		send(sfd, msgbuf, len, 0);
		write(1, "send OK!n", 9);

	}

	return ;
}

int main(){

	int local_sd, remote_sd;
	struct sockaddr_in local_addr, remote_addr;
	socklen_t local_addr_len, remote_addr_len;
	pid_t pid;

	if((local_sd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
		perror("socket()");
		exit(1);
	}

	local_addr.sin_family = AF_INET;
	local_addr.sin_port = htons(atoi(PORT));
	inet_pton(AF_INET, "0.0.0.0", &local_addr.sin_addr);
	local_addr_len = sizeof(local_addr);
	if(bind(local_sd, (void*)&local_addr, local_addr_len) < 0){
		perror("bind()");
		exit(1);
	}
	if(listen(local_sd, 8) < 0){
		perror("listen()");
		exit(1);
	}

	remote_addr_len = sizeof(remote_addr);
	if((remote_sd = accept(local_sd, (void*)&remote_addr, &remote_addr_len)) < 0){
		perror("accept()");
		exit(1);
	}
	pid = fork();
	if(pid < 0){
		perror("fork()");
		exit(1);
	}else if(pid == 0){			//recv
		func_recv(remote_sd);
		exit(0);
	}else{						//send
		func_send(remote_sd);
	}

	waitpid(pid, NULL, 0);

	close(local_sd);

	exit(0);
}

 client.c

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

#include "chat.h"

static void func_recv(int sfd){

	int len, ret, pos;
	char msgbuf[MSGSIZE];

	while(1){
		len = recv(sfd, msgbuf,	MSGSIZE, 0);
		if(len <= 0){
			break;
		}
		write(1, "nrecvmsg:", 9);
		while(len){
			pos = 0;
			ret = write(1, msgbuf+pos, len);
			pos += ret;
			len -= ret;
		}
	}

	return ;
}

static void func_send(int sfd){
	
	int len;

	char msgbuf[MSGSIZE];

	while(1){

		len = read(0, msgbuf, MSGSIZE);
		send(sfd, msgbuf, len, 0);
		write(1, "send OK!n", 9);

	}

	return ;
}

int main(){

	int remote_sd;
	struct sockaddr_in remote_addr;
	socklen_t remote_addr_len;
	pid_t pid;

	remote_sd = socket(AF_INET, SOCK_STREAM, 0);
	if(remote_sd < 0){
		perror("socket()");
		exit(1);
	}
	remote_addr.sin_family = AF_INET;
	remote_addr.sin_port = htons(atoi(PORT));
	inet_pton(AF_INET, "127.0.0.1", &remote_addr.sin_addr);
	remote_addr_len = sizeof(remote_addr);
	if(connect(remote_sd, (void*)&remote_addr, remote_addr_len) < 0){
		perror("connect()");
		exit(1);
	}

	pid = fork();
	if(pid < 0){
		perror("fork()");
		exit(1);
	}else if(pid == 0){			//recv
		func_recv(remote_sd);
		exit(0);
	}else{						//send
		func_send(remote_sd);
	}

	waitpid(pid, NULL, 0);

	close(remote_sd);

	exit(0);
}

运行结果

        测试环境:Ubuntu 21.10, gcc version 11.2.0

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/853724.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号