這裏有兩種做法:
Client.c:
#include < stdlib.h >
#include < errno.h >
#include < string .h >
#include < netdb.h >
#include < sys / types.h >
#include < netinet / in .h >
#include < sys / socket.h >
#include < fcntl.h >
#include < unistd.h >
#include < sys / select.h >
#define SERVPORT 3333
#define RECV_BUF_SIZE 1024
void setnonblocking( int sock)
{
int opts;
opts = fcntl(sock,F_GETFL);
if (opts < 0 )
{
perror( " fcntl(sock,GETFL) " );
exit( 1 );
}
opts = opts | O_NONBLOCK;
if (fcntl(sock,F_SETFL,opts) < 0 )
{
perror( " fcntl(sock,SETFL,opts) " );
exit( 1 );
}
}
int main( int argc, char * argv[])
{
int sockfd, iResult;
char buf[RECV_BUF_SIZE];
struct sockaddr_in serv_addr;
fd_set readset, testset;
sockfd = socket(AF_INET, SOCK_STREAM, 0 );
setnonblocking(sockfd);
memset( & serv_addr, 0 , sizeof (serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERVPORT);
serv_addr.sin_addr.s_addr = inet_addr( " 127.0.0.1 " );
connect(sockfd, ( struct sockaddr * ) & serv_addr, sizeof (serv_addr));
FD_ZERO( & readset);
FD_SET(sockfd, & readset);
testset = readset;
iResult = select(sockfd + 1 , & testset, NULL, NULL, NULL);
while ( 1 ) {
iResult = recv(sockfd, buf, RECV_BUF_SIZE, 0 );
if (iResult == - 1 ) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
printf( " recv finish detected, quit.../n " );
break ;
}
}
printf( " Received %d bytes/n " , iResult);
}
printf( " Final iResult: %d/n " , iResult);
return 0 ;
}
Server.c:
#include < stdlib.h >
#include < errno.h >
#include < string .h >
#include < sys / types.h >
#include < netinet / in .h >
#include < sys / socket.h >
#include < sys / wait.h >
#define SERVPORT 3333
#define BACKLOG 10
#define SEND_BUF_SIZE 4096
int main( int argc, char * argv[])
{
int sockfd, client_fd, i;
struct sockaddr_in my_addr;
char * buffer = NULL;
sockfd = socket(AF_INET, SOCK_STREAM, 0 );
memset( & my_addr, 0 , sizeof (my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(SERVPORT);
my_addr.sin_addr.s_addr = inet_addr( " 127.0.0.1 " );
bind(sockfd, ( struct sockaddr * ) & my_addr, sizeof ( struct sockaddr));
listen(sockfd, BACKLOG);
client_fd = accept(sockfd, NULL, NULL);
buffer = malloc(SEND_BUF_SIZE);
for (i = 0 ; i < 100 ; i ++ ) {
send(client_fd, buffer, SEND_BUF_SIZE, 0 );
sleep( 1 );
}
sleep( 10 );
close(client_fd);
close(sockfd);
free(buffer);
return 0 ;
}