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
原创粉丝点击