一、客户端代码
#include <sys/types.h>
#include <sys/socket.h>#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main (int argc, char *argv[])
{
struct sockaddr_un address;
int sockfd;
int len;
int result;
char buffer[5000] = {0};
int rc = 0;
if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror ("socket");
exit (EXIT_FAILURE);
}
address.sun_family = AF_UNIX;
strcpy (address.sun_path, "server_socket");
len = sizeof (address);
result = connect (sockfd, (struct sockaddr *)&address, len);
if (result == -1) {
printf ("ensure the server is up\n");
perror ("connect");
exit (EXIT_FAILURE);
}
unsigned int sum = 0;
while(1) {
rc = recv(sockfd, buffer, 4096, 0);
if (0 >= rc) {
cout << "rc is less than or equal to 0" << endl;
cout << "sum is : " << sum << endl;
return 0;
}
sum += rc;
if (rc < 4096) {
cout << "rc is : " << rc << endl;
}
}
return 0;
}
二、服务端代码
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define COUNT 5000000
int main (int argc, char *argv[])
{
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_un server_address;
struct sockaddr_un client_address;
int i, bytes;
char ch_send, ch_recv;
unlink ("server_socket");
server_sockfd = socket (AF_UNIX, SOCK_STREAM, 0);
server_address.sun_family = AF_UNIX;
strcpy (server_address.sun_path, "server_socket");
server_len = sizeof (server_address);
bind (server_sockfd, (struct sockaddr *)&server_address, server_len);
listen (server_sockfd, 5);
printf ("Server is waiting for client connect...\n");
client_len = sizeof (client_address);
client_sockfd = accept (server_sockfd, (struct sockaddr *)&server_address, (socklen_t *)&client_len);
if (client_sockfd == -1) {
perror ("accept");
exit (EXIT_FAILURE);
}
char buffer[COUNT] = {0};
memset(buffer, 'a', COUNT);
if ((bytes = write (client_sockfd, buffer, COUNT)) == -1) {
printf ("Failed to write data...\n");
}
cout << "written bytes is : " << bytes << endl;
close (client_sockfd);
unlink ("server socket");
}
三、执行测试
先执行server程序,然后再启动客户端程序,结果如下:
#./server
Server is waiting for client connect...
written bytes is : 5000000
# ./client
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 3776
rc is : 3776
rc is : 3776
rc is : 3776
rc is : 3776
rc is : 3776
rc is : 3776
rc is : 3776
rc is : 3776
rc is : 3776
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 3456
rc is less than or equal to 0
sum is : 5000000
可见,server端发送一次数据后,client在recv时指定期望长度4096,则循环接收数据的时候,绝大多数recv返回值是4096,但是可能间或收到的小于4096,即出现返回值为4096和小于4096的值交替的情况。故而验证了,recv确实是返回当前任意长度的可读的数据。
The receive calls normally return any data available,up to the requested amount, rather than waiting for receipt of the full amount requested.