C语言可以干大事,我们基于C语言可以完成一个简易的Web服务器。当你能够自行完成web服务器,你会对C语言有更深入的理解。对于网络编程,字符串的使用,文件使用等等都会有很大的提高。
关于网络的TCP协议在这里不在多说,大家可以查阅些资料。
开发工具: CLion,编译器(Cygwin,如果不会用建议看看我的另一篇博客-CLion)。
## 创建socket对象
```C
int server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (0 > server_socket) {
printf("[服务器] 创建socket对象失败,服务器启动失败...\n");
return -1;
}
printf("[服务器] 创建socket成功....\n");
struct sockaddr_in my_addr;
bzero(&my_addr, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(PORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
int bind_ret = bind(server_socket, (struct sockaddr*) &my_addr, sizeof(my_addr));
if (0 > bind_ret) {
printf("[服务器]绑定端口%d失败,服务器启动失败\n", PORT);
return -2;
}
printf("[服务器] 绑定端口:%d成功....\n", PORT);
int listen_ret = listen(server_socket, BACK_LOG);
if (0 > listen_ret) {
printf("监听端口:%d失败,服务器运行失败....\n", PORT);
return -3;
}
printf("[服务器] 监听端口:%d成功....\n", PORT);
struct sockaddr_in accept_in;
socklen_t socklen = sizeof(accept_in);
int accept_socket = accept(server_socket, (struct sockaddr *) &accept_in, &socklen);
if (-1 == accept_socket) {
printf("[服务器] 接收请求失败,建立连接失败... \n");
return -4;
}
printf("[服务器] 建立连接成功....\n");
char buffer[BUFFER_SIZE];
memset(buffer, 0, sizeof(buffer));
ssize_t data = recv(accept_socket, buffer, sizeof(buffer), RECV_FLAG);
if (data == 0) {
printf("[服务器] 超时或对端主动关闭...\n");
break;
}
if (0 > data) {
printf("[服务器] 接收数据失败...\n");
break;
}
printf("[服务器] 与客户端建立连接成功...\n");
[服务器] 创建socket成功....
[服务器] 绑定端口:9999成功....
[服务器] 监听端口:9999成功....
[服务器] 建立连接成功....
[服务器] 与客户端建立连接成功...
下一回我们研究如何解析前端(浏览器)发过来的数据。