- 1、头文件
- 2、多进程实现
- 3、线程实现
- 4、多路IO复用
- tcp_fun.h/.c:tcp通信的简单实现
- 多进程:多进程编程基础
#include "tcp_fun.h"
#define IP "192.168.200.134"//本机地址
#define PORT 2233 //自定义端口
int main() {
//socket bind listen
int sock_fd = tcp_server_init(IP,PORT);
int new_fd;
printf("listening...n");
while (1) {
new_fd = tcp_accept(sock_fd);
if (new_fd < 0)
break;
if(fork() == 0){
tcp_server_chat(new_fd);//循环接收客户端消息
close(new_fd);
} else{
close(new_fd);//关闭客户端套接字,继续监听
}
}
close(sock_fd);
}
多进程开销大,且父子进程相互独立,不好通信,在并发服务器用的很少
3、线程实现- 线程:线程编程基础
#include "tcp_fun.h" #include#define IP "192.168.200.134"//本机地址 #define PORT 2233 static void* tcp_chat(void *arg); int main() { //socket bind listen pthread_t id; int sock_fd = tcp_server_init(IP,PORT); int new_fd; printf("listening...n"); while (1) { new_fd = tcp_accept(sock_fd); if (new_fd < 0) break; //tcp_server_chat(new_fd); pthread_create(&id,NULL,tcp_chat,&new_fd); } close(sock_fd); } static void* tcp_chat(void *arg){ char buf[2048]; unsigned int ret; int *tmp = (int *)arg; int new_fd = *tmp; // 循环接收,接收一条聊天信息 memset(buf, 0, sizeof(buf)); ret = recv(new_fd, buf, sizeof(buf) - 1, 0); while (ret) { if (ret < 0) { perror("recv error"); break; } buf[ret] = 0; // 由于是消息,所以对空间做尾部处理 printf("receive msg is %s.n", buf); // 再次等待接收客户端的消息 memset(buf, 0, sizeof(buf)); ret = recv(new_fd, buf, sizeof(buf) - 1, 0); } printf("client close!n"); close(new_fd); pthread_exit(NULL); }
线程相较于多进程开销小,也很容易通信(可共享全局变量),适合做一个简易的聊天程序
4、多路IO复用- 多路复用可做高性能高并发的服务器
- 主要有select函数,该函数较为复杂,暂时还在学习中
- 与之类似函数的还有poll、epoll
在书中还看过fcntl函数将sock_fd非阻塞来实现并发,但我没做出来
暑期编程PK赛 得CSDN机械键盘等精美礼品!


