虚拟机:centos6.5
功能:可实现多个客户端连接服务器端,并实现收发数据
#include
#include
#include
#include
#include
#include
#include
#define TURE 0
#define FALSE -1
#define SER_PORT 2345
#define BUF_SIZE 1024
#define MAXLINE 80
int main(void)
{
int i, j, n, maxi, maxfd, nret, sin_size;
int listen_fd, connect_fd;
int client[FD_SETSIZE];
char buf[BUF_SIZE], addr_p[20];
fd_set rset, fds;
struct sockaddr_in ser_addr, cli_addr;
struct timeval timeout={100,0};
sin_size=sizeof(struct sockaddr_in);
bzero(&ser_addr, sizeof(ser_addr));
ser_addr.sin_family=AF_INET;
ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);
ser_addr.sin_port=htons(SER_PORT);
listen_fd=socket(AF_INET, SOCK_STREAM, 0);
if(listen_fd < 0)
{
perror("socket fail");
return FALSE;
}
if( (bind(listen_fd, (struct sockaddr*)&ser_addr, sizeof(ser_addr))) < 0)
{
perror("bind fial");
return FALSE;
}
if ( (listen(listen_fd, 20)) <0 )
{
perror("listen fail");
return FALSE;
}
maxfd = listen_fd;
maxi = -1;
for (i = 0; i < FD_SETSIZE; i++)
{
client[i] = -1;
}
FD_ZERO(&fds);
FD_SET(listen_fd,&fds);
while(1)
{
timeout.tv_sec=100;
timeout.tv_usec=0;
rset=fds;
nret = select(maxfd+1, &rset, NULL, NULL, &timeout);
if(nret<0)
{
perror("select error");
return -1;
}
for(i=0; i<=maxfd; i++)
{
if( !FD_ISSET(i, &rset) )
{
printf("i=%d\n",i);
continue;
}
if(i==listen_fd)
{
printf("listen_fd=%d,i=%d\n", listen_fd, i);
if ((connect_fd=accept(listen_fd, (struct sockaddr*)&cli_addr, &sin_size)) <0 )
{
perror("accept fail");
continue;
}
else
{
inet_ntop(AF_INET,&cli_addr.sin_addr,addr_p,sizeof(addr_p));
printf("fd%d is connect, ip: %s, port: %d\n", connect_fd, addr_p, ntohs(cli_addr.sin_port));
}
for(j = 0; j < FD_SETSIZE; j++)
{
if(client[j] < 0)
{
client[j] = connect_fd;
break;
}
}
printf("client[%d]=%d\n", j, connect_fd);
if( i == FD_SETSIZE )
{
close(connect_fd);
continue;
}
FD_SET(connect_fd, &fds);
if (connect_fd > maxfd)
{
maxfd = connect_fd;
}
if (j > maxi)
{
maxi = j;
printf("Amount %d client connect\n", maxi+1);
}
}
else
{
printf("fd%d is send data \n",i);
if ( (n = read(i, buf, MAXLINE)) < 0)
{
printf("read fd%d fail\n",i);
continue;
}
else
{
printf("read fd%d %d size:%s\n", i, n, buf);
}
if( (n=write(i, addr_p, sizeof(addr_p))) <0 )
{
perror("write fail");
continue;
}
else
{
printf("write %d size\n",n);
}
}
}
}
close(listen_fd);
return;
}
/* Some Unix Program Standard head file */
#include
#include
#include
#include
/* Socket Program head file */
#include
#include
#include /* sockaddr_in{} and other Internet define */
#include /* For inet_pton() */
#include /* strerror(), perror(), errno head file*/
#define SERV_PORT 2345
#define SER_IP "192.168.199.109"
#define BUF_SIZE 512
/* Argc is the program linux running command arguments count, and argv is
* the arguments string value. All of the arguments take as string.
* For example:
* If we run this program as "./socket_client 192.168.3.15", there are two
* arguments, so argc=2, argv[0] is the first argument, which is string value
* "./socket_client" and argv[1] is the second argment, which is string value
* "1921.68.3.15". */
int main(int argc, char **argv)
{
int cli_fd;
struct sockaddr_in ser_addr;
int retval,nread,nwrite;
char buf[BUF_SIZE];
/* Check the arguments count, if No serverip address give as an argument,
* then program exit
if(2 != argc)
{
printf("usage: %s \n", argv[0]);
return -1;
}
*/
if((cli_fd=socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket fail");
return -1;
}
memset(&ser_addr, 0, sizeof(ser_addr));
ser_addr.sin_family=AF_INET;
ser_addr.sin_addr.s_addr=inet_addr(SER_IP);
ser_addr.sin_port=htons(SERV_PORT);
/*
if (inet_pton(AF_INET, argv[1], &ser_addr.sin_addr) <= 0)
{
printf("Use inet_pton() to set the Server IP address failure.\n");
retval = -2;
// goto CleanUp;
}
*/
if((connect(cli_fd,(struct sockaddr*)&ser_addr,sizeof(struct sockaddr)))<0)
{
perror("connect fail");
return -1;
}
while(1)
{
memset(buf,0,sizeof(buf));
strcpy(buf,"hello");
nwrite=write(cli_fd,buf,strlen(buf));
if(nwrite<0)
{
perror("write fail");
return -1;
}
else
{
printf("write %d size:%s\n", nwrite, buf);
}
memset(buf,0,sizeof(buf));
nread=read(cli_fd,buf,sizeof(buf));
if(nread<0)
{
perror("read fail");
return -1;
}
else
{
buf[nread]=0;
printf("read %d size\n",nread);
printf("read data :%s\n",buf);
}
sleep(2);
}
close(cli_fd);
return;
}