一个有关C的网络通讯有关问题
一个有关C的网络通讯问题
/*server.c*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <errno.h>
#include <malloc.h>
#define MAXLINE 100
int port = 8000;
int main()
{
struct sockaddr_in pin;
struct sockaddr_in sin;
int listen_fd;
int conn_fd;
int sock_fd;
int address = sizeof(pin);
int nready;
int client[FD_SETSIZE];
int maxi;
int maxfd;
int i;
int j;
int n;
int k = 0;
char buf[MAXLINE];
char str[MAXLINE];
fd_set rset;
fd_set allset;
bzero(&sin, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sin.sin_addr.s_addr = INADDR_ANY;
listen_fd = socket(AF_INET, SOCK_STREAM, 0);
{
int opt = 1;
setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
}
bind(listen_fd, (struct sockaddr *)&sin, sizeof(sin));
listen(listen_fd, 15);
printf( "Accepting connection....\n ");
maxfd = listen_fd;
maxi = -1;
for (i = 0; i < FD_SETSIZE; i++)
{
client[i] = -1;
}
FD_ZERO(&allset);
FD_SET(listen_fd, &allset);
for(;;)
{
rset = allset;
printf( "test -1\n ");
nready = select(maxfd + 1, &rset, NULL, NULL, NULL);
printf( "test -2\n ");
if (FD_ISSET(listen_fd, &rset))
{
conn_fd = accept(listen_fd, (struct sockaddr *)&pin, &address);
for (i = 0; i < FD_SETSIZE; i++)
{
if(client[i] < 0)
{
client[i] = conn_fd;
break;
}
}
if(i == FD_SETSIZE)
{
printf( "too many clients\n ");
exit(1);
}
printf( "New client %s at port %d\n ", inet_ntop(AF_INET, &pin.sin_addr, str, sizeof(str)), ntohs(pin.sin_port));
FD_SET(conn_fd, &allset);
printf( "conn_fd=%d\n ", conn_fd);
if (conn_fd > maxfd)
maxfd = conn_fd;
if (i > maxi)
maxi = i;
if (--nready <= 0)
continue;
} //if
/*start to write*/
for (i = 0; i <= maxi; i++)
{
if((sock_fd = client[i]) < 0)
continue;
if(FD_ISSET(sock_fd, &rset))
/*server.c*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <errno.h>
#include <malloc.h>
#define MAXLINE 100
int port = 8000;
int main()
{
struct sockaddr_in pin;
struct sockaddr_in sin;
int listen_fd;
int conn_fd;
int sock_fd;
int address = sizeof(pin);
int nready;
int client[FD_SETSIZE];
int maxi;
int maxfd;
int i;
int j;
int n;
int k = 0;
char buf[MAXLINE];
char str[MAXLINE];
fd_set rset;
fd_set allset;
bzero(&sin, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sin.sin_addr.s_addr = INADDR_ANY;
listen_fd = socket(AF_INET, SOCK_STREAM, 0);
{
int opt = 1;
setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
}
bind(listen_fd, (struct sockaddr *)&sin, sizeof(sin));
listen(listen_fd, 15);
printf( "Accepting connection....\n ");
maxfd = listen_fd;
maxi = -1;
for (i = 0; i < FD_SETSIZE; i++)
{
client[i] = -1;
}
FD_ZERO(&allset);
FD_SET(listen_fd, &allset);
for(;;)
{
rset = allset;
printf( "test -1\n ");
nready = select(maxfd + 1, &rset, NULL, NULL, NULL);
printf( "test -2\n ");
if (FD_ISSET(listen_fd, &rset))
{
conn_fd = accept(listen_fd, (struct sockaddr *)&pin, &address);
for (i = 0; i < FD_SETSIZE; i++)
{
if(client[i] < 0)
{
client[i] = conn_fd;
break;
}
}
if(i == FD_SETSIZE)
{
printf( "too many clients\n ");
exit(1);
}
printf( "New client %s at port %d\n ", inet_ntop(AF_INET, &pin.sin_addr, str, sizeof(str)), ntohs(pin.sin_port));
FD_SET(conn_fd, &allset);
printf( "conn_fd=%d\n ", conn_fd);
if (conn_fd > maxfd)
maxfd = conn_fd;
if (i > maxi)
maxi = i;
if (--nready <= 0)
continue;
} //if
/*start to write*/
for (i = 0; i <= maxi; i++)
{
if((sock_fd = client[i]) < 0)
continue;
if(FD_ISSET(sock_fd, &rset))