Linux下使用Socket实现Tcp服务器并不困难简略下来就的流程就一段
socket –> bind –> listen –> accept –> recv/send(处理数据) –> close
这就是Linux下实现服务器的流程,接下来我会给出代码并且逐步解析
这之中用到的函数都可以在这篇文章里看到解释
Linux下Socket编程中需要用到的函数以及结构体
因为只是示例程序就不进行错误判断了,编写项目时还是需要错误判断的
示例代码
这段代码简单的实现了一个Tcp服务器,功能是接收对端发送来的消息并且输出,再将消息发送给对端
接下来简单的解释这些代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include <sys/socket.h> #include <cstdio> #include <arpa/inet.h> #include <cstring> #include <unistd.h>
int main() { int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockaddr_in addr = {0}; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(8000); addr.sin_family = AF_INET;
bind(sockfd, (sockaddr *)&addr, sizeof addr);
listen(sockfd, 10);
sockaddr_in clientAddr = {0}; socklen_t clientAddrLen = sizeof clientAddr; int clientfd = accept(sockfd, (sockaddr *)&clientAddr, &clientAddrLen); while (true) { char buffer[1024] = {0}; int recvByte = recv(clientfd, buffer, 1024, 0); if (recvByte <= 0) { close(clientfd); break; } printf("%s Say: %s", inet_ntoa(clientAddr.sin_addr), buffer); int sendByte = send(clientfd, buffer, 1024, 0); memset(buffer, 0, 1024); if (sendByte <= 0) { close(clientfd); break; } } close(sockfd); }
|
声明一些需要的变量
向socket中传三个参数
AF_INET:使用 IPV4 地址族
SOCK_STREAM:流式套接字
IPPRORO_TCP:采用TCP协议
设置addr的值
因为是服务器所以将地址设置为 INADDR_ANY(0.0.0.0)
端口通过htons函数转换后赋值给sin_port
设置地址族为 AF_INET(IPV4)
1 2 3 4 5
| int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockaddr_in addr = {0}; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(8000); addr.sin_family = AF_INET;
|
绑定地址并启用监听(被动触发模式)
1 2
| bind(sockfd, (sockaddr *)&addr, sizeof addr); listen(sockfd, 10);
|
声明clientAddr去接收客户端的地址,accept返回套接字的文件描述符
1 2 3
| sockaddr_in clientAddr = {0}; socklen_t clientAddrLen = sizeof clientAddr; int clientfd = accept(sockfd, (sockaddr *)&clientAddr, &clientAddrLen);
|
声明buffer去接收客户端发送的数据,进行错误检查是否成功接收到数据,如果没有就关闭套接字
1 2 3 4 5 6
| char buffer[1024] = {0}; int recvByte = recv(clientfd, buffer, 1024, 0); if (recvByte <= 0) { close(clientfd); break; }
|
输出对端发送来的数据,并将其发送给对端,使用memset清空buffer,进行错误检查是否成功发送数据,如果没有就关闭套接字
1 2 3 4 5 6 7
| printf("%s Say: %s", inet_ntoa(clientAddr.sin_addr), buffer); int sendByte = send(clientfd, buffer, 1024, 0); memset(buffer, 0, 1024); if (sendByte <= 0) { close(clientfd); break; }
|
如果运行没有出错会输出一下消息
1 2
| 对端地址 Say: 对端发来的消息 对端地址 Say: 对端发来的消息
|