这里有两种做法:
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;
}