介绍
本文主要学习TCP socket编程的代码。socket常用于客户端发起连接,服务端一般都会用一些高性能网络框架,不会让你手写socket服务端的。客户端代码基本都差不多。
服务端
server.cpp:
cpp
#include <iostream>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
constexpr uint16_t port = 6000;
int main() {
int fd = socket(AF_INET, SOCK_STREAM, 0); //创建用于监听的套接字
if (fd < 0) {
return -1;
}
sockaddr_in addr = {AF_INET, htons(port), 0}; //监听本机所有网络接口,并指定端口号
if (bind(fd, (sockaddr*)&addr, sizeof(addr)) < 0) { //绑定
close(fd);
return -1;
}
if (listen(fd, 128) < 0) { //开始监听;参数2:设置全连接(accept)队列长度
return -1;
}
uint32_t addrLen = sizeof(addr);
int cfd = accept(fd, (sockaddr*)&addr, &addrLen); //阻塞等待,获取一条连接
if (cfd < 0) {
return -1;
}
//下面就是通信代码了
//接收客户端消息
char buf[1024] = {0};
int size = recv(cfd, buf, sizeof(buf), 0);
if (size <= 0) {
return -1; //<0:recv failed! ==0:socket connect close!
}
std::cout << buf << std::endl;
//向客户端发消息
if (send(cfd, buf, strlen(buf), 0) < 0) {
return -1;
}
close(cfd);
close(fd);
}
客户端
client.cpp:
cpp
#include <iostream>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
constexpr uint16_t port = 6000;
const std::string ip("127.0.0.1");
int main() {
int cfd = socket(AF_INET, SOCK_STREAM, 0); //创建用于通信的socket
if (cfd < 0) {
return -1;
}
sockaddr_in addr = {AF_INET, htons(port), inet_addr(ip.c_str())};//对于客户端来说,这里要指定服务器的ip、port
if (connect(cfd, (sockaddr*)&addr, sizeof(addr)) < 0) { //连接
return -1;
}
//发送消息
char buf[1024] = "12345";
if (send(cfd, buf, strlen(buf), 0) < 0) {
return -1;
}
//接收消息
int size = recv(cfd, buf, strlen(buf), 0);
if (size <= 0) {
return -1; //<0:recv failed! ==0:socket connect close!
}
std::cout << buf << std::endl;
close(cfd);
}
编译运行
bash
g++ server.cpp -o server
g++ client.cpp -o client
./server
./client