多线程服务器端的实现
在之前的文章已经详细介绍过socket网络编程 , 那么接下来让我们看看多线程的网络编程如何实现
大体的思路就是在accpet之后 , 创建一个新的线程供客户端所使用.
以下是服务器端代码
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>
void *thread_fun(void *arg)
{
int c = (int)arg;
while(1)
{
char buff[128] = {
0};
int n = recv(c,buff,1,0);
if(n <= 0)
{
break;
}
printf("buff[%d]=%s\n",c,buff);
send(c,"ok",2,0);
}
printf("one client over\n");
close(c);
//pthread_exit(NULL);
}
int main()
{
int sockfd = socket(AF_INET,SOCK_STREAM,0);
assert(sockfd != -1);
struct sockaddr_in saddr,caddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(6000);
saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
assert(res != -1);
listen(sockfd,5);//
while(1)
{
int len = sizeof(caddr);
int c = accept(sockfd,(struct sockaddr*)&caddr,&len);
if(c < 0)
{
continue;
}
pthread_t id;
pthread_create(&id,NULL,thread_fun,(void*)c);
//char *s = NULL;
//pthread_join(id,(void**)&s);
//break;
}
exit(0);
}
在这个代码中 , 最开始遇到的问题就是pthread_join() [等待一个线程的结束]的使用 , 如果在主函数中加入 , 当多个客户端向服务器发起连接的时候 , 只能启动一个线程 , 其他只会完成三次连接后,进入等待队列.不能够实现多个客户端向服务器发送信息.
多线程客户端的实现
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
int main()
{
int sockfd1 = socket(AF_INET,SOCK_STREAM,0);
assert(sockfd1 != -1 );
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family