Linux C 네트워크 프로 그래 밍 - 다 중 스 레 드 채 팅 방 구현 (클 라 이언 트)
서버 와 의 연결 을 만 들 고 메 시 지 를 보 내 메 시 지 를 받 습 니 다.
클 라 이언 트 의 코드 구조:
모두 두 개의 함수 가 있 습 니 다. 하나의 주 함수 (main) 는 클 라 이언 트 소켓 의 초기 화 를 실현 하고 서버 와 연결 을 만 들 며 메 시 지 를 받 아 로 컬 로 표시 합 니 다.콘 솔 에서 정 보 를 읽 고 서버 로 보 내 는 전송 함수 (snd)이 두 함 수 는 각각 두 스 레 드 에서 실 행 됩 니 다. 하 나 는 주 함수 가 있 는 스 레 드 이 고 다른 하 나 는 주 함수 에서 만 든 발송 함수 가 있 는 스 레 드 입 니 다.
구체 적 인 코드 는 다음 과 같다.
(서버 측의 실현:http://blog.csdn.net/smarteryu/article/details/8656259)
#include<time.h>
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#define LISTENQ 5
#define MAXLINE 512
#define MAXMEM 10
#define NAMELEN 20
int listenfd,connfd[MAXMEM];//
void quit();//
void rcv_snd(int n);//
int main()
{
pthread_t thread;
struct sockaddr_in servaddr,cliaddr;
socklen_t len;
time_t ticks;
char buff[MAXLINE];
// socket
printf("Socket...
");
listenfd=socket(AF_INET,SOCK_STREAM,0);
if(listenfd<0)
{
printf("Socket created failed.
");
return -1;
}
// bind
printf("Bind...
");
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(6666);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
{
printf("Bind failed.
");
return -1;
}
// listen ,
// tcp
printf("listening...
");
listen(listenfd,LISTENQ);
// , ( )
pthread_create(&thread,NULL,(void*)(&quit),NULL);
// (-1 )
int i=0;
for(i=0;i<MAXMEM;i++)
{
connfd[i]=-1;
}
while(1)
{
len=sizeof(cliaddr);
for(i=0;i<MAXMEM;i++)
{
if(connfd[i]==-1)
{
break;
}
}
// accept listen
connfd[i]=accept(listenfd,(struct sockaddr*)&cliaddr,&len);
ticks=time(NULL);
sprintf(buff,"% .24s \r
",ctime(&ticks));
printf("%s Connect from: %s,port %d
",buff,inet_ntoa(cliaddr.sin_addr.s_addr),ntohs(cliaddr.sin_port));
// ,
pthread_create(malloc(sizeof(pthread_t)),NULL,(void*)(&rcv_snd),(void*)i);
}
return 0;
}
void quit()
{
char msg[10];
while(1)
{
scanf("%s",msg);
if(strcmp("quit",msg)==0)
{
printf("Byebye...
");
close(listenfd);
exit(0);
}
}
}
void rcv_snd(int n)
{
char* ask="Your name please:";
char buff[MAXLINE];
char buff1[MAXLINE];
char buff2[MAXLINE];
char name[NAMELEN];
time_t ticks;
int i=0;
int retval;
//
write(connfd[n],ask,strlen(ask));
int len;
len=read(connfd[n],name,NAMELEN);
if(len>0)
{
name[len]=0;
}
//
strcpy(buff,name);
strcat(buff,"\tjoin in\0");
for(i=0;i<MAXMEM;i++)
{
if(connfd[i]!=-1)
{
write(connfd[i],buff,strlen(buff));
}
}
//
while(1)
{
if((len=read(connfd[n],buff1,MAXLINE))>0)
{
buff1[len]=0;
// “bye” ,
if(strcmp("bye",buff)==0)
{
close(connfd[n]);
connfd[n]=-1;
pthread_exit(&retval);
}
ticks=time(NULL);
sprintf(buff2,"%.24s\r
",ctime(&ticks));
write(connfd,buff2,strlen(buff2));
strcpy(buff,name);
strcat(buff,"\t");
strcat(buff,buff2);
strcat(buff,buff1);
for(i=0;i<MAXMEM;i++)
{
if(connfd[i]!=-1)
{
write(connfd[i],buff,strlen(buff));
}
}
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 다 중 스 레 드 메커니즘 의 스 레 드 생 성target 을 실행 대상 으로 지정 한 name 을 이름 으로 하고 group 에서 참조 하 는 스 레 드 그룹의 일원 으로 새 Thread 대상 을 할당 합 니 다. 이 스 레 드 가 독립 된 Runnable 실...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.