仿照昨天的例子写的,虽然写的过程中遇到了一些卡壳的地方,但是还是顺利的改完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);
}
}
运行结果图: