1、头文件
- tcp_fun.h/.c:tcp通信的简单实现
2、多进程实现
- 多进程:多进程编程基础
#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 <pthread.h>
#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复用
在书中还看过fcntl函数将sock_fd非阻塞来实现并发,但我没做出来