任务描述:服务器端将客户端请求的字符串进行小写->大写转换,并响应给客户端。
服务端:(为了突出逻辑表示,未做函数返回值处理)
#include <iostream>
#include <arpa/inet.h>
#include <ctype.h>
#include <unistd.h>
#include <cstdlib>
#include <cstdio>
using namespace std;
#define PORT 10088 // 通信端口
int main()
{
int s_fd = socket(AF_INET, SOCK_STREAM, 0); // 建立服务端套接字,返回服务器端的套接字描述符
// AF_INET:IPv4通信协议, SOCK_STREAM:TCP连接
struct sockaddr_in s_addr; // 描述ip地址信息的结构体
s_addr.sin_family = AF_INET; // 采用的协议族
s_addr.sin_port = htons(PORT); // 端口号
s_addr.sin_addr.s_addr = htonl(INADDR_ANY); // ip地址;htonl将本地的小端存储格式更改为网络字节序(大端存储格式)。 INADDR_ANY:选用本机可用地址
bind(s_fd, (struct sockaddr *)&s_addr, sizeof(s_addr)); // 绑定套接字、IP地址和端口
listen(s_fd, 128); // 最大等待连接数
sockaddr_in c_addr;
char buf[BUFSIZ]; // 内容缓冲区
socklen_t len = 0;
// 建立与客户端的链接,返回客户端的套接字描述符,阻塞等待连接
int c_fd = accept(s_fd, (struct sockaddr *)&c_addr, &len);
char ip_buf[33];
char ip_addr[BUFSIZ];
// 打印连接的客户端的ip地址与端口
inet_ntop(AF_INET, &c_addr.sin_addr.s_addr, ip_buf, sizeof(ip_buf));
cout << "client ip:" << ip_buf << endl; //ntohl(c_addr.sin_addr.s_addr) << endl;
cout << "client port: " << ntohs(c_addr.sin_port) << endl;
while(true)
{
// 读取客户端的请求内容,返回字节大小
int n = read(c_fd, buf, sizeof(buf));
// 对字节进行小写->大写的转换
for(int i=0; i<n; i++)
buf[i] = toupper(buf[i]);
// 通过客户端套接字写回客户端
write(c_fd, buf, n);
}
// 关闭套接字描述符
close(c_fd);
close(s_fd);
return 0;
}
~
客户端:客户端的原理与服务端基本差不多,具体代码如下
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
using namespace std;
#define SERV_IP "127.0.0.1"
#define SERV_PORT 10088
int main()
{
int cfd = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr)); // 初始化
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);
inet_pton(AF_INET, SERV_IP, &serv_addr.sin_addr.s_addr);
// 建立与服务器端的链接
connect(cfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
char buf[BUFSIZ];
while(true)
{
fgets(buf, sizeof(buf), stdin);
write(cfd, buf, strlen(buf));
int len = read(cfd, buf, sizeof(buf));
write(STDOUT_FILENO, buf, len);
}
close(cfd);
return 0;
}