- 论坛徽章:
- 0
|
回复 4楼 mq110 的帖子
客户端:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<sys/time.h>
#define PORT 9877
#define BUFLEN 1024
#define MAXLEN 128
#define MAXSLEEP 128
int connect_retry(int sockfd,struct sockaddr *addr,socklen_t alen);
void printbuf(int sockfd);
void getbuf(int sockfd,char *buf);
int main(int argc,char *argv[])
{
int sockfd;
struct sockaddr_in serveraddr;
int addrlen;
char *str="hello";
pid_t pid;
/*char buf[BUFLEN];*/
if(argc!=2)
{
printf("usage:clienttest ipaddress\n"
exit(1);
}
if( (sockfd=socket(AF_INET,SOCK_STREAM,0))<0 )
{
perror("create socket error"
exit(1);
}
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(PORT);
inet_pton(AF_INET,argv[1],&serveraddr.sin_addr);
addrlen=sizeof(struct sockaddr);
if( connect_retry(sockfd,(struct sockaddr *)&serveraddr,addrlen)<0 )
{
printf("connect to server error\n"
exit(1);
}
if(send(sockfd,str,strlen(str),0)<0)
{
perror("send str to server error"
exit(1);
}
fflush(sockfd);
printbuf(sockfd);
close(sockfd);
exit(0);
}
/*
//connect_retry
*/
int connect_retry(int sockfd,struct sockaddr *addr,socklen_t alen)
{
int nsec;
for(nsec=1;nsec<MAXSLEEP;nsec<<=1)
{
if( connect(sockfd,addr,alen)==0 )
return 0;
if(nsec<=MAXSLEEP/2)
sleep(nsec);
}
return (-1);
}
/*
//printbuf
*/
void printbuf(int sockfd)
{
char buf[BUFLEN];
fd_set rfd;
struct timeval timeout;
timeout.tv_sec=10;
timeout.tv_usec=0;
FD_ZERO(&rfd);
FD_SET(sockfd,&rfd);
switch(select(sockfd+1,&rfd,NULL,NULL,&timeout))
{
case -1:
perror("select error"
exit(1);
case 0:
printf("receive data from server timeout"
break;
default:
getbuf(sockfd,buf);
printf("Get string from server: "
printf("%s",buf);
break;
}
printf("\n"
}
/*
//getbuf
*/
void getbuf(int sockfd,char *buf)
{
char tempbuf[MAXLEN];
int i,n,index;
n=0;
index=0;
while( (n=recv(sockfd,tempbuf,MAXLEN,0))>0 )
{
for(i=0;i<n;i++)
buf[index++]=tempbuf[i];
}
buf[index]='\0';
if(n<0)
{
perror("recv data from server error"
exit(1);
}
}
服务器端:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<string.h>
#define PORT 9877
#define BUFLEN 1024
#define MAXLEN 128
#define BACKLOG 10
void getbuf(char *buf,int sockfd);
void reversebuf(char *buf);
/*
//main
*/
int main(int argc,char *argv[])
{
/*init serversockfd,clientsockfd;*/
int listenfd,connectfd;
int clientaddrlen;
int status;
struct sockaddr_in clientaddr,serveraddr;
char buf[BUFLEN];
char *welcome="Connect to server successful.Welcome!!!\n";
pid_t pid;
if( (listenfd=socket(AF_INET,SOCK_STREAM,0))<0 )
{
/*create socket if failure exit*/
perror("create socket error!"
exit(1);
}
/*init serveraddr*/
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(PORT);
serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
/*bind port and serveraddr to listenfd*/
if( bind(listenfd,(struct sockaddr *)&serveraddr,sizeof(struct sockaddr))<0 )
{
perror("bind port failure!");
exit(1);
}
if( listen(listenfd,BACKLOG)<0 )
{
perror("listen error");
exit(1);
}
for(;;)
{
clientaddrlen=sizeof(clientaddr);
if( (connectfd=accept(listenfd,(struct sockaddr *)&clientaddr,&clientaddrlen))<0 )
{
perror("accept from client failure!");
exit(1);
}
printf("Received client: %s request\n",inet_ntoa(clientaddr.sin_addr));
if( (pid=fork())<0 )
{
perror("fork error");
exit(1);
}
else if( pid==0 )
{
getbuf(buf,connectfd);
printf("Get client string: %s\n",buf);
if( send(connectfd,welcome,strlen(welcome),0)<0 )
{
perror("send welcome failure");
exit(1);
}
reversebuf(buf); /*reverse buf*/
if( send(connectfd,buf,strlen(buf),0)<0 ) /*send reversed string to client*/
{
perror("send reversed string error");
exit(1);
}
close(connectfd);
exit(0);
}
close(connectfd);
}
close(connectfd);
close(listenfd);
exit(0);
}
/*
//getbuf
*/
void getbuf(char *buf,int sockfd)
{
char tempbuf[MAXLEN];
int n;
int i,index;
index=0;
n=0;
while( (n=recv(sockfd,tempbuf,MAXLEN,0))>0 )
{
for(i=0;i<n;i++)
buf[index++]=tempbuf[i];
}
buf[index]='\0';
if(n<0)
{
perror("recv error");
exit(1);
}
}
/*
//reversebuf
*/
void reversebuf(char *buf)
{
char c;
int i,len;
len=strlen(buf);
int mid=(int)len/2;
for(i=0;i<mid;i++)
{
c=buf[i];
buf[i]=buf[len-1-i];
buf[len-1-i]=c;
}
} |
|