一.引言
本章知识仅仅限于在Linux系统下学习C语言的知识点,并巩固知识。
二.TCP通信
TCP是一种面向连接的,可靠的协议,有点像打电话,双方拿起电话互通身份之后就建立了连接,然后说话就行了,并且是按照说话的顺序听到的,说完话挂机断开连接。也就是说TCP传输的双方首先要建立连接,之后由TCP协议保证数据收发的可靠性,丢失的数据包自动重发,上层应用程序收到的总是可靠的数据流,通讯之后关闭连接。
想了解TCP可以去了解TCP的三次握手和四次挥手。
三.程序思想
首先对于多线程是不推荐的,因为存在这些问题:需要考虑进程内最大文件描述符上限,线程如果有共享数据,考了线程同步,服务于客户端的线程退出时,退出处理,系统负载,随着客户的增加,导致其他线程不能及时得到CPU。
但是我们在学习的过程中,在不考虑单个线程退出的情况下,可以使用线程做一个并发服务器。而做出一个网络聊天室。
首先作为服务端,需要连等待连接客户端,同时客户端通过套接口发来的消息需要服务端通过套接口发送给所有的客户端。当连接一个客户端可以用一个线程来处理这个客户端的消息,由此可以得知,每当有一个连接服务端的时候,就会创建一个线程专门处理这个客户端的消息。而在创建的线程中,处理消息正好帮助服务端完成第二个工作,也就是通过套接口传来的消息发送给所有的客户端。从而达到一个网络聊天室的服务器功能。
其次作为客户端,给服务器发送消息,和接受通过服务器和客户端的套接口接受来自其他客户端的消息两个工作。所有在客户端中可以用两个线程解决这个问题。
以上所有的线程都是在不考虑客户端退出连接服务器端的情况。
四.思维导图
五.源码
服务器端server:
#include#include #include #include #include #include #include #include #include #include #define PORT 8888 #define N 4 #define MAX 10 int count = 0; struct cltinfo { int fd; struct sockaddr_in clt; pthread_t pid; }; void *work(void *arg) { struct cltinfo *p = (struct cltinfo *)arg; int fd; int i=0; for(i = 0; i < count ;i++) { if(p[i].pid == pthread_self()) { fd = p[i].fd; } } while(1) { char buf[1024] = {0}; int ret = read(fd,buf,sizeof(buf)); for(i=0;i 客户端client
#include#include #include #include #include #include #include #include #define PORT 8888 void *do_read(void *arg) { int sock = (int )arg; while(1){ char buf[1024] = {0}; read(sock,buf,1024); printf("%sn",buf); } } void *do_write(void *arg) { int sock = (int )arg; while(1){ char buf[1024]={0}; int ret = read(0,buf,1024); write(sock,buf,ret); } } int main() { int sock = socket(AF_INET,SOCK_STREAM,0); if(sock < 0)return 0; struct sockaddr_in client; client.sin_family = AF_INET; client.sin_port = htons(PORT); client.sin_addr.s_addr = inet_addr("127.0.0.1"); int len = sizeof(client); connect(sock,(struct sockaddr *)&client,len); pthread_t wr; pthread_t rd; pthread_create(&rd,NULL,do_read,(void *)sock); pthread_create(&wr,NULL,do_write,(void *)sock); pthread_join(wr,NULL); pthread_join(rd,NULL); close(sock); return 0; }



