TCP Linux socket编程实现两个正整数的加法

该博客介绍了如何使用TCP Linux socket编程实现客户端与服务器端的通信,功能是客户端发送两个正整数到服务器,服务器计算它们的和并返回结果。博主在编程过程中遇到并解决了问题,成功完成功能,感到满足。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  仿照昨天的例子写的,虽然写的过程中遇到了一些卡壳的地方,但是还是顺利的改完bug,测试功能正常,心情有点点小happy,因为新鲜感吧...

  功能:客户端输入两个正整数,把数据传给服务器端,然后在服务器端进行计算,再将结果返回给客户端。


  服务器端代码:

#include <stdio.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>

#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signo, sighandler_t handler);


#define PORT 10001
#define QLen 8
#define Buflen 100

void handle_server(int s);
void sig_pipe(int signo);
int ss, sc;

int main()
{
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;
	int err;
	pid_t pid;	

	ss = socket(AF_INET, SOCK_STREAM, 0);
	if(ss < 0){
		printf("socket can't create\n");
		return -1;
	}
	
	sighandler_t ret = signal(SIGTSTP, sig_pipe);
	if(ret == SIG_ERR){
		printf("signal mount error\n");
		return -1;
	}
	else printf("signal mount success\n");
	
	memset(&server_addr, 0, sizeof(server_addr));
	server_addr.sin_port = htons(PORT);
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	server_addr.sin_family = AF_INET;
	
	err = bind(ss, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
	if(err < 0){
		printf("bind error");
		return -1;
	}
	
	
	err = listen(ss, QLen);
	if(err < 0){
		printf("listen error\n");
		return -1;
	}	

	for(;;){
		socklen_t addrlen = sizeof(client_addr);
		sc = accept(ss, (struct sockaddr *)&client_addr, &addrlen);
		if(sc < 0) continue;
		else printf("server connet success\n");
	
		pid = fork();
		if(pid == 0){
			close(ss);
			handle_server(sc);
		}
		else close(sc);
	}
}

int get_sum(char *s)
{
	int a, b, flag = 0, i;
	int len = strlen(s);
	a = 0, b = 0;
	for(i = 0; i < len; i ++){
		if(s[i] >= '0' && s[i] <= '9'){
			a = a * 10 + s[i] - '0';
			flag = 1;
		}
		else if(flag == 1) break;
	} 
	
	flag = 0;
	for(; i < len; i ++){
		if(s[i] >= '0' && s[i] <= '9'){
			b = b * 10 + s[i] - '0';
			flag = 1;
		}
		else if(flag == 1) break;
	}
	printf("a = %d, b = %d\n", a, b);
	return a + b;
}

void handle_server(int s)
{
	ssize_t size = 0;
	int sum;
	char buffer[Buflen];
	
	for(;;){
		for(size = 0; size == 0; size = read(s, buffer, Buflen));
		printf("%s", buffer);

		sum = get_sum(buffer);
	//	printf("%d\n",sum);	
		sprintf(buffer, "sum = %d\n", sum);
		write(s, buffer, strlen(buffer) + 1);
	}
}

void sig_pipe(int signo)
{
	printf("Catch a signal\n");
	if(signo == SIGTSTP){
		int ret1 = close(ss);
		int ret2 = close(sc);
		int ret = ret1 > ret2 ? ret1 : ret2;
		if(ret == 0) printf("success : close IPC\n");
		else if(ret == -1) printf("fail : not close IPC\n");
		exit(1);
	}
}


  客户端代码:

#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>

#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signo, sighandler_t handler);

#define PORT 10001
#define Buflen 100

void sig_pipe(int signo);
void handle_client(int ss);
int sc;

int main()
{
	struct sockaddr_in server_addr;
	int s;
	char server_ip[Buflen] = "";

	sc = socket(AF_INET, SOCK_STREAM, 0);
	if(sc < 0){
		printf("socket can't create\n");
		return -1;
	}

	sighandler_t ret = signal(SIGTSTP, sig_pipe);
	if(ret < 0){
		printf("signal mount error\n");
		return -1;
	}
	else printf("signal mount success\n");

	memset(&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(PORT);
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	
	printf("please input the server ip:\n");
	read(0, server_ip, Buflen);
	server_addr.sin_addr.s_addr = inet_addr(server_ip);

	s = connect(sc, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
	if(s == 0) printf("client : connect success\n");
	else{
		printf("client : connect fail\n");
		return -1;
	}
	
	handle_client(sc);
	close(sc);
}


void handle_client(int ss)
{
	ssize_t size = 0;
	char buffer[Buflen];
	for(;;){
//		for(size = 0; size == 0; size = read(0, buffer, Buflen));
		memset(buffer, '\0', Buflen);
		size = read(0, buffer, Buflen);
		if(size == 0) continue;
		write(ss, buffer, strlen(buffer) + 1);
		for(size = 0;  size == 0; size = read(ss, buffer, Buflen));
		write(1, buffer, strlen(buffer) + 1);
	}
}
void sig_pipe(int signo)  
{  
    printf("Catch a signal\n");  
    if(signo == SIGTSTP){  
        int ret = close(sc);  
        if(ret == 0) printf("success : close IPC\n");  
        else if(ret == -1) printf("fail : not close IPC\n");  
        exit(1);  
    }  
}


运行结果图:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值