客户端代码:
#include <stdio.h>
#include <stdlib.h>#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 5555
#define SERVER_IP "127.0.0.1"
typedef struct mathopt{
int type;
float num1;
float num2;
}mopt;
void create_mopt(struct mathopt *send_mopt);
int main()
{
int rv;
int client_sock;
struct sockaddr_in ser_addr;
char command[10];
char recvbuf[100];
client_sock = socket(AF_INET, SOCK_STREAM, 0);
if(client_sock < 0)
{
printf("socket error:%s\n", strerror(errno));
exit(0);
}
ser_addr.sin_family = AF_INET;
ser_addr.sin_port = htons(PORT);
ser_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
rv = connect(client_sock, (struct sockaddr*)&ser_addr, sizeof(ser_addr));
if(rv < 0)
{
printf("connect error:%s\n", strerror(errno));
exit(0);
}
printf("connect success\n");
while(1)
{
memset(command, 0, sizeof(command));
struct mathopt send_mopt;
printf("input your command>");
scanf("%s", command);
if(strcmp(command, "add") == 0)
{
send_mopt.type = 1;
create_mopt(&send_mopt);
}
else if(strcmp(command, "quit") == 0)
{
send_mopt.type = 4;
}
send(client_sock, (char*)&send_mopt, sizeof(send_mopt), 0);
if(4 == send_mopt.type)
{
break;
}
memset(recvbuf, 0, sizeof(recvbuf));
recv(client_sock, recvbuf, sizeof(recvbuf), 0);
printf("the result is:%s\n", recvbuf);
}
close(client_sock);
exit(0);
}
void create_mopt(struct mathopt *send_mopt)
{
printf("input num1>");
scanf("%f", &(send_mopt->num1));
printf("input num2>");
scanf("%f", &(send_mopt->num2));
}
------------------------------
服务端代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <strings.h>
#include <errno.h>
#include <unistd.h>
#define PORT 5555
typedef struct mathopt{
int type;
float num1;
float num2;
}mopt;
void processchild(int client);
int main()
{
struct sockaddr_in ser_addr;
struct sockaddr_in client_addr;
int client_len = sizeof(client_addr);
int ser_sock;
int rv;
int opt;
ser_sock = socket(AF_INET, SOCK_STREAM, 0);
if(ser_sock < 0)
{
printf("socket error:%s\n", strerror(errno));
exit(0);
}
opt = SO_REUSEADDR;
rv = setsockopt(ser_sock, SOL_SOCKET, opt, &opt, sizeof(opt));
if(rv < 0)
{
printf("setsockopt error:%s\n", strerror(errno));
exit(0);
}
ser_addr.sin_family = AF_INET;
ser_addr.sin_port = htons(PORT);
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
rv = bind(ser_sock, (struct sockaddr*)&ser_addr, sizeof(ser_addr));
if(rv < 0)
{
printf("bind error:%s\n", strerror(errno));
exit(0);
}
rv = listen(ser_sock, 5);
if(rv < 0)
{
printf("listen error:%s\n", strerror(errno));
exit(0);
}
while(1)
{
int client = accept(ser_sock, (struct sockaddr*)&client_addr, (socklen_t*)&client_len);
if(client < 0)
{
printf("accept error:%s\n", strerror(errno));
continue;
}
pid_t p_id = fork();
if(p_id > 0)
{
close(client);
continue;
}
else if(p_id == 0)
{
close(ser_sock);
processchild(client);
exit(0);
}
else
{
printf("fork error:%s\n", strerror(errno));
exit(0);
}
}
close(ser_sock);
exit(0);
}
void processchild(int client)
{
ssize_t len;
char sendbuf[100];
char recvbuf[1024];
while(1)
{
memset(recvbuf, 0, sizeof(recvbuf));
len = recv(client, recvbuf, sizeof(recvbuf), 0);
if(len < sizeof(struct mathopt))
{
break;
}
struct mathopt *recv_mopt = (struct mathopt*)recvbuf;
memset(sendbuf, 0, sizeof(sendbuf));
if(1 == recv_mopt->type)
{
float result = recv_mopt->num1 + recv_mopt->num2;
sprintf(sendbuf, "%f", result);
}
else if(4 == recv_mopt->type)
{
break;
}
len = send(client, sendbuf, sizeof(sendbuf), 0);
if(len < 0)
{
break;
}
}
close(client);
}