电子科技大学网络编程作业多线程3Word文档下载推荐.docx
《电子科技大学网络编程作业多线程3Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《电子科技大学网络编程作业多线程3Word文档下载推荐.docx(7页珍藏版)》请在冰豆网上搜索。
unistd.h>
pthread.h>
sys/types.h>
sys/socket.h>
netinet/in.h>
arpa/inet.h>
#definePORT9999
#defineBACKLOG2
#defineMAXDATASIZE100
voidprocess_cli(intconnectfd,structsockaddr_inclient);
void*start_routine(void*arg);
structARG{
intconnfd;
structsockaddr_inclient;
};
intmain(void)
{
intlistenfd,connectfd;
pthread_ttid;
structARG*arg;
structsockaddr_inserver,client;
intsin_size;
if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("
Createsocketfailed."
);
exit(-1);
}
intopt=SO_REUSEADDR;
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&
opt,sizeof(opt));
bzero(&
server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(listenfd,(structsockaddr*)&
server,sizeof(structsockaddr))==-1){
Binderror."
if(listen(listenfd,BACKLOG)==-1){
listenerror."
sin_size=sizeof(structsockaddr_in);
while
(1){
if((connectfd=accept(listenfd,(structsockaddr*)&
client,&
sin_size))==-1)
{
perror("
accepterror."
exit(-1);
}
arg=(structARG*)malloc(sizeof(structARG));
arg->
connfd=connectfd;
memcpy((void*)&
arg->
client,&
client,sizeof(client));
if(pthread_create(&
tid,NULL,start_routine,(void*)arg))
Creatpthreaderror."
close(listenfd);
}
voidprocess_cli(intconnectfd,structsockaddr_inclient){
charrecvbuf[MAXDATASIZE],sendbuf[MAXDATASIZE],client_name[MAXDATASIZE];
intrecvlen,i;
printf("
Yougotaconnectionfrom%s.\n"
inet_ntoa(client.sin_addr));
send(connectfd,"
Welcometomyserver.\n"
22,0);
recvlen=recv(connectfd,client_name,MAXDATASIZE,0);
if(recvlen==0)
close(connectfd);
clientdisconnectde.\n"
return;
elseif(recvlen<
0)
clientbroked.\n"
client_name[recvlen]='
\0'
;
Clientnameis%s.\n"
client_name);
while(recvlen=recv(connectfd,recvbuf,MAXDATASIZE,0))
recvbuf[recvlen]='
Receivedclient<
%s>
message:
%s"
client_name,recvbuf);
for(i=0;
i<
recvlen;
i++)
sendbuf[i]=recvbuf[recvlen-i-1];
sendbuf[recvlen]='
send(connectfd,sendbuf,strlen(sendbuf),0);
Client:
%sdisconnected.\n"
void*start_routine(void*arg){
structARG*info;
info=(structARG*)arg;
process_cli(info->
connfd,info->
client);
free(arg);
pthread_exit(NULL);
客户端:
netdb.h>
#definePORT9999
intmain(intargc,char*argv[])
intfd,numbytes;
charbuf[MAXDATASIZE];
structhostent*he;
structsockaddr_inserver;
inti=1;
if(argc!
=2)
printf("
Usage:
%s<
IPaddress>
\n"
argv[0]);
if((he=gethostbyname(argv[1]))==NULL)
perror("
gethostbynameerror."
exit(-1);
if((fd=socket(AF_INET,SOCK_STREAM,0))==-1)
exit
(1);
server.sin_addr=*((structin_addr*)he->
h_addr);
if(i=connect(fd,(structsockaddr*)&
server,sizeof(structsockaddr))==-1)
connectfailed."
if(((numbytes=recv(fd,buf,MAXDATASIZE,0))==-1)){
recverror."
buf[numbytes]='
ServerMessage:
buf);
Pleaseinputyourname:
"
scanf("
%s"
if(((numbytes=send(fd,buf,strlen(buf),0))==-1)){
senderror."
while
(1)
Pleaseinputmessage(maxchar:
%d):
MAXDATASIZE);
if(strlen(buf)<
1)
i=0;
readerror."
Servermessage:
%s\n"
close(fd);
实验结果: