Linux下的零拷贝函数splice简单测试实例

本测试实例是由splice构造的一个echo服务器。

linux服务端代码:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>




int main(int argc, char *argv[])
{

	if (argc <= 2)
	{
		printf("usage: %s ip_address port_number\n", basename(argv[0]));
		return 1;
	}
	const char* ip = argv[1];
	int port = atoi(argv[2]);

	struct sockaddr_in address;
	bzero(&address, sizeof(address));
	address.sin_family = AF_INET;
	inet_pton(AF_INET, ip, &address.sin_addr);
	address.sin_port = htons(port);

	int sock = socket(PF_INET, SOCK_STREAM, 0);
	assert(sock >= 0);

	int ret = bind(sock, (struct sockaddr*) & address, sizeof(address));
	assert(ret != -1);

	ret = listen(sock, 5);
	assert(ret != -1);

	struct sockaddr_in client;
	socklen_t client_addrlength = sizeof(client);
	int connfd = accept(sock, (struct sockaddr*) & client, &client_addrlength);
	if (connfd < 0)
	{
		printf("errno is: %d\n", errno);
	}
	else
	{
		int pipefd[2];
		assert(ret != -1);
		ret = pipe(pipefd);

		while (1)
		{
			ret = splice(connfd, NULL, pipefd[1], NULL, 32768, SPLICE_F_MORE | SPLICE_F_MOVE);
			assert(ret != -1);
			ret = splice(pipefd[0], NULL, connfd, NULL, 32768, SPLICE_F_MORE | SPLICE_F_MOVE);
			assert(ret != -1);
		}
		//close(connfd);
	}

	close(sock);

    return 0;
}

 windows客户端测试代码:

#include<WinSock2.h>
#include<WS2tcpip.h>
#include<stdio.h>

#pragma comment(lib, "ws2_32.lib")

int main()
{
	int nError, ret;
	WSADATA wsa;
	SOCKET clientSock;
	SOCKADDR_IN sockAddr;
	HANDLE hThread = NULL;
	char netBuf[MAX_PATH];

	nError = WSAStartup(MAKEWORD(2, 2), &wsa);
	if (0 != nError) {
		return false;
	}
	OutputDebugString("create socket.");

	clientSock = ::socket(AF_INET, SOCK_STREAM, 0);
	if (INVALID_SOCKET == clientSock) {

		WSACleanup();
		return 0;
	}

	memset(&sockAddr, 0, sizeof(sockAddr));
	sockAddr.sin_family = AF_INET;
	sockAddr.sin_port = htons(atoi("9999"/*argv[1])*/));
	inet_pton(AF_INET, "192.168.131.135", &sockAddr.sin_addr);

	if (SOCKET_ERROR == connect(clientSock, (SOCKADDR*)&sockAddr, sizeof(sockAddr)))
	{
		return 0;
	}

	char httpheader[128] = { 0 };

	while (fgets(httpheader, sizeof(httpheader) - 1, stdin))
	{
		if (SOCKET_ERROR == send(clientSock, httpheader, strlen(httpheader), 0))
			break;;

		memset(httpheader, 0, sizeof(httpheader));
		if (recv(clientSock, httpheader, 64, 0) <= 0)
			break;
		printf("%s", httpheader);
		memset(httpheader, 0, sizeof(httpheader));
	}

	printf("This program break.\n");
	closesocket(clientSock);
	return 0;
}

执行:

发布了140 篇原创文章 · 获赞 65 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/paradox_1_0/article/details/103645894
今日推荐