common.h
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define SERADDR "192.168.0.104"
#define SERPORT 8080
#define BACKLOG 20
#define CMD_REGISTER 1001
#define CMD_CHECK 1002
#define CMD_GETINFO 1003
#define STATUS_OK 100
#define STATUS_ERR 101
typedef struct info
{
char name[20];
int age;
int cmd;
int status;
} INFO;
server.c
#include "common.h"
#define SERADDR "192.168.0.104"
#define SERPORT 8080
int main(int argc, char **argv)
{
int socketfd = -1;
struct sockaddr_in addr = {0};
struct sockaddr_in c_addr = {0};
socklen_t addrlen = 0;
socketfd = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(SERADDR);
addr.sin_port = htons(SERPORT);
int ret = bind(socketfd, (struct sockaddr *)&addr, sizeof(struct sockaddr));
if (ret == -1)
{
perror("bind");
exit(-1);
}
listen(socketfd, BACKLOG);
int clientfd = accept(socketfd, (struct sockaddr *)&c_addr, &addrlen);
printf("clientfd %d connetct\n", clientfd);
INFO st;
while (1)
{
memset(&st, 0, sizeof(st));
int n_read = read(clientfd, &st, sizeof(st));
if (n_read > 0)
{
if (st.cmd == CMD_REGISTER)
{
printf("The student message: name %s\tage %d\n", st.name, st.age);
st.status = STATUS_OK;
}
}
else
{
continue;
}
write(clientfd, &st, sizeof(st));
}
return 0;
}
client.c
#include "common.h"
int main(int argc, char **argv)
{
int socketfd = -1;
struct sockaddr_in addr = {0};
socklen_t addrlen = 0;
socketfd = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(SERADDR);
addr.sin_port = htons(SERPORT);
int ret = connect(socketfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
if (-1 == ret)
{
perror("connect");
}
INFO st1;
INFO st2;
while (1)
{
memset(&st1, 0, sizeof(st1));
printf("please input student's name:");
scanf("%s", st1.name);
printf("please input student's age:");
scanf("%d", &st1.age);
st1.cmd = CMD_REGISTER;
write(socketfd, &st1, sizeof(st1));
printf("client send a student message\n");
memset(&st2, 0, sizeof(st2));
int n_read = read(socketfd, &st2, sizeof(st2));
if (n_read > 0)
{
if (st2.status == STATUS_OK)
{
printf("register successful\n");
}
else
{
printf("register failed\n");
}
}
}
return 0;
}
运行效果
