基于linux c的socket服务器,用线程写成
文件名:server.c
运行命令gcc server.c -o client -lpthread
./server
输入服务器的IP
郭迁迁
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <pthread.h>
#define PORT 8004
char temp[100];
int flag=0;
int who;
void *threadrecv(void *arg);
void *threadsend(void *arg);
/*struct Info
{
}*/
int main()
{
int listenfd=socket(AF_INET, SOCK_STREAM,0);
if(listenfd<0)
{
perror("socket");
exit(1);
}
struct sockaddr_in serveraddr;
bzero((char *)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
serveraddr.sin_port=htons(PORT);
if(bind(listenfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr))<0)
{
perror("connect");
exit(1);
}
if(listen(listenfd,10)<0)
{
perror("listen error");
exit(1);
}
struct sockaddr_in clientaddr;
int clientlen, connfdp[10];
int j;
char temp[100];
for(j=0;j<10;j++)
{
connfdp[j]=-1;
}
clientlen=sizeof(clientaddr);
int i=0;
pthread_t tid,tid1,tid2;
while(1)
{
connfdp[i]=accept(listenfd,(struct sockaddr *)&clientaddr, &clientlen);
//inet_ntop(AF_INET,&clientaddr.sin_addr,IP[i],sizeof(IP));
pthread_create(&tid,NULL,threadrecv,&connfdp[i]);
i++;
printf("在线人数%d\n",i);
printf("Accepted!\n");
pthread_create(&tid1,NULL,threadsend,connfdp);
}
void *threadrecv(void *arg)
{
while(1)
{
int num=0;
num=recv(*((int *)arg),temp,100,0);
if(num>0)
{
who=*((int *)arg);
printf(" 接收客户端信息: %s\n",temp);
flag=1;
}
}
return NULL;
}
void *threadsend(void * arg)
{
int i;
while(1)
{
if(flag==1)
{
for(i=0;((int *)arg)[i]!=-1;i++)
{
if(((int *)arg)[i]==who)
{
continue;
}
else
{
//send(((int *)arg)[i],IP[i],16,0);
send(((int *)arg)[i],temp,100,0);
}
printf("消息转发成功\n");
}
flag=0;
}
return NULL; }。