간이 다인 채팅방
/* */
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <pthread.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
//person number who is chating
#define CHATNUM 8
int sd[CHATNUM];
struct pthreadParement
{
struct sockaddr_in client_ip;
int client_sock;
};
void myError(char *error,int errorLine)
{
fprintf(stderr,"errorline:%d ",errorLine);
perror(error);
exit(1);
}
// server send message that one client send to every client that online
void sendMsgToClient(struct pthreadParement *parement)
{
char name[30];
char buffer[2048];
char temp[3000];
char tmp[30];
int i=0;
int returnValue=-1;
//get client's name
if((returnValue=recv(parement->client_sock,&name,20,0))==-1)
{
myError("recv",__LINE__);
}
name[returnValue]=':';
name[returnValue+1]='\0';
strcpy(tmp,name);
tmp[returnValue]='\0';
printf("user:%s is online,from ip:%s
",tmp,\
inet_ntoa(parement->client_ip.sin_addr));
while(1)
{
//get the imformation that client send
memset(buffer,'\0',sizeof(buffer));
returnValue=recv(parement->client_sock,&buffer,1024,0);
if(returnValue==-1)
{
myError("recv",__LINE__);
}
//the client was offline
else if( returnValue==0)
{
printf("%sbye",name);
break;
}
/*
* find a socket that attact to client onlin
* send message to client online
*/
for(i=0;i<CHATNUM;i++)
{
if(sd[i]!=-1)
{
temp[0]='\0';
strcat(temp,name);
strcat(temp,buffer);
if(send(sd[i],&temp,strlen(temp),0)==-1)
{
myError("send",__LINE__);
}
}
}
}
close(parement->client_sock);
for(i=0;i<CHATNUM;i++)
{
if(sd[i]==parement->client_sock)
{
sd[i]=-1;
}
}
pthread_exit(NULL);
}
int main()
{
int i=0;
int localSocket=0;
int clientSocket=0;
pthread_t pd;
struct sockaddr_in server_ip;
struct sockaddr_in client_ip;
struct pthreadParement parement;
socklen_t client_addr_size=0;
//init socket
memset(sd,-1,sizeof(sd));
if((localSocket=socket(AF_INET,SOCK_STREAM,0))==-1)
{
myError("socket",__LINE__);
}
//set IP imformation
server_ip.sin_family=AF_INET;
server_ip.sin_port=htons(12345);
server_ip.sin_addr.s_addr=INADDR_ANY;
//bzero(&(server_ip.sin_zero),8);
if(bind(localSocket,(struct sockaddr *) &server_ip,\
sizeof(struct sockaddr ))==-1)
{
myError("bind",__LINE__);
}
if(listen(localSocket,10)==-1)
{
myError("listen",__LINE__);
}
while(1)
{
client_addr_size=sizeof(struct sockaddr_in);
if((clientSocket=accept(localSocket,(struct sockaddr *) &client_ip,\
&client_addr_size))==-1)
{
myError("accept",__LINE__);
}
//find a free socket
while(sd[i]!=-1)
{
i=(i+1)%CHATNUM;
continue;
}
sd[i]=clientSocket;
parement.client_ip.sin_addr=client_ip.sin_addr;
parement.client_sock=clientSocket;
pthread_create(&pd,NULL,(void *)sendMsgToClient,&parement);
}
return 0;
};
/* */
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <pthread.h>
void dellMsgFromServer(int sd)
{
char recvMsg[2000];
int recvMsgLen=0;
while(1)
{
if((recvMsgLen=recv(sd,&recvMsg,1024,0))<0)
{
perror("recv");
exit(1);
}
recvMsg[recvMsgLen]='\0';
printf("%s
",recvMsg);
}
pthread_exit(NULL);
}
int main()
{
char input[2000];
char clientName[20];
char acceptEnter;
int sd;
pthread_t pd;
// set the server address
struct sockaddr_in server_addr;
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(12345);
if(inet_aton("127.0.0.1",&server_addr.sin_addr)==0)
{
perror("inet_aton");
exit(1);
}
bzero(&(server_addr.sin_zero),8);
if((sd=socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
exit(1);
}
if(connect(sd,(struct sockaddr *)&server_addr,\
sizeof(struct sockaddr_in))!=0)
{
perror("connect");
exit(1);
}
printf("please input your name,note:your name lenth not over 20 byte
");
fgets(clientName,1024,stdin);
clientName[strlen(clientName)-1]='\0';
if(send(sd,&clientName,strlen(clientName),0)<0)
{
perror("send");
exit(1);
}
if(pthread_create(&pd,NULL,(void *)dellMsgFromServer,sd)!=0)
{
perror("pthread_create");
exit(1);
}
printf("you can input to chat now
");
printf("note:input not over 1024
");
while(1)
{
input[0]='\0';
fgets(input,1024,stdin);
input[strlen(input)-1]='\0';
if(send(sd,&input,strlen(input),0)<0)
{
perror("send");
exit(1);
}
}
close(sd);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.