TCP Linux socket编程实现两个正整数的加法
来源:互联网 发布:mac dare you和diva 编辑:程序博客网 时间:2024/05/22 06:57
仿照昨天的例子写的,虽然写的过程中遇到了一些卡壳的地方,但是还是顺利的改完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 100void 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 100void 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); } }
运行结果图:
0 0
- TCP Linux socket编程实现两个正整数的加法
- 两个超长正整数的加法
- c#实现两个string正整数加法
- 编程实现两个正整数的除法
- 编程实现两个正整数的除法
- 9、编程实现两个正整数的除法
- 编程实现两个正整数的除法
- 编程实现两个正整数的除法
- 编程实现两个正整数的除法
- 编程实现两个正整数的除法
- 编程实现两个正整数的除法
- 完成两个超长正整数的加法
- C语言实现只用加法和减法实现两个正整数的乘除运算
- 编程实现任意长度的两个正整数相加 代码实现
- c笔试面试 之 不用加法操作(用逻辑运算)实现两个正整数的除法
- 微软面试题:编程实现两个正整数的除法
- 不用 "%" && "/" 编程实现两个正整数的除法,取余数
- [每日练习]编程实现两个正整数的除法
- mysql实现sequence自增长
- 字符串哈希函数
- 菜鸟网络工程师的成长笔记——第8天(2016.08.25)
- 小菜学习日记—div嵌套导致子区域margin-top失效问题(外边距合并问题)
- 文章标题
- TCP Linux socket编程实现两个正整数的加法
- 弱口令扫描
- 自定义AlertDialog.Builder
- 面试1~3剑指offer
- URL的常用方法
- servlet入门介绍
- python爬虫入门-urllib的基本用法
- BeanUtils的copyProperties,populate实现方式分析以及容易引发的Bug
- 初学java