1 Server端流程
(1). socket() 创建socket
(2). bind() 绑定服务器地址结构
(3) listen() 设置监听上限
(4). accept() 阻塞监听客户端连接
(5). read(fd) 读socket获取客户端数据
(6). 小--大写 toupper()
(7). write(fd)
(8). close();
具体代码
/*************************************************************************
> File Name: server.c
> Author: Winter
> Created Time: 2021年12月15日 星期三 19时20分07秒
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#include<sys/socket.h>
#include<ctype.h>
#include<arpa/inet.h>
#define SERVER_PORT 9527
int main(int argc, char* argv[])
{
int lfd = 0, newfd = 0;
int res = 0;
char buff[BUFSIZ], client_IP[BUFSIZ];
struct sockaddr_in server_addr, client_addr;
socklen_t client_addr_len;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
// 1 创建socket
lfd = socket(AF_INET, SOCK_STREAM, 0);
if (lfd == -1)
{
perror("socket error\n");
exit(1);
}
// 2 绑定服务器地址结构
res = bind(lfd, (struct sockaddr*)(&server_addr), sizeof(server_addr));
if (res == -1)
{
perror("bind error\n");
exit(1);
}
// 3 设置监听上限
res = listen(lfd, 128);
if (res == -1)
{
perror("listen error\n");
exit(1);
}
// 4 阻塞监听客户端连接
client_addr_len = sizeof(client_addr);
newfd = accept(lfd,(struct sockaddr*)(&client_addr), &client_addr_len);
if (newfd == -1)
{
perror("accept error\n");
exit(1);
}
// 输出
printf("client ip = %s, port = %d\n",
inet_ntop(AF_INET, &client_addr.sin_addr.s_addr, client_IP, sizeof(client_IP)),
ntohs(client_addr.sin_port)
);
while(1)
{
// 5 read
res = read(newfd, buff, sizeof(buff));
if (res == -1)
{
perror("read error\n");
exit(1);
}
// 输出一下
write(STDOUT_FILENO, buff, res);
// 6 小写转大写
for (int i = 0; i < res; i++)
{
buff[i] = toupper(buff[i]);
}
// 7 write
write(newfd, buff, res);
}
close(lfd);
close(newfd);
return 0;
}
本地先测试
运行
./server
再重开一个终端
nc 127.0.0.1 9527
2 Client端流程
(1). socket() 创建socket
(2). connect(); 与服务器建立连接
(3). write() 写数据到 socket
(4). read() 读转换后的数据。
(5). 显示读取结果
(6). close()
具体代码
/*************************************************************************
> File Name: client.c
> Author: Winter
> Created Time: 2021年12月16日 星期四 20时03分16秒
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#define SERVER_PORT 9527
void sys_err(const char* str)
{
perror(str);
exit(1);
}
int main(int argc, char* argv[])
{
int fd = 0;
int res = 0;
int count = 10;
char buff[BUFSIZ];
struct sockaddr_in server_addr; // 服务器地址结构
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
// inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr.s_addr);
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
// 1 创建socket
fd = socket(AF_INET, SOCK_STREAM ,0);
if (fd == 1)
{
sys_err("socket error\n");
}
// 2 connect
res = connect(fd, (struct sockaddr*)(&server_addr), sizeof(server_addr));
if (res == -1)
{
sys_err("connect error\n");
}
while(count--)
{
// 3 写数据到socket
res = write(fd, "hello\n", sizeof("hello"));
if (res == -1)
{
sys_err("write error\n");
}
sleep(1); // 休眠
// 4 读取处理的结果
res = read(fd, buff, sizeof(buff));
if (res == -1)
{
sys_err("read error\n");
}
// 5 显示处理结果
int ret = write(STDOUT_FILENO, buff, res);
if (res == -1)
{
sys_err("write error2\n");
}
}
close(fd);
return 0;
}