复制文件描述符的dup和dup2函数:
#include<unistd.h>
int dup(int oldfd);
int dup2(int oldfd,int newfd);
标准输入文件的文件描述符: 0
标准输出文件的文件描述符:1
标准错误输出的文件描述符:2
dup函数创建一个文件描述符,该新文件描述符和原有文件描述符oldfd指向相同的文件、管道或者网络连接。并且dup返回的文件描述符总是系统当前可用的最小整数值。dup和dup2类似,不过它将返回第一个不小于newfd的整数值。dup和dup2系统调用失败时返回-1并设置errno。
comm.h
#ifndef COMM_H
#define COMM_H
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/ipc.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<errno.h>
#include<assert.h>
#include<unistd.h>
#include<iostream>
using namespace std;
const char *ip="127.0.0.1";
const int port = 10005;
#endif
server.c
#include "comm.h"
class server
{
private:
int sock;
public:
server();
void create_socket();
};
server::server()
{
int sock=0;
}
void server::create_socket()
{
struct sockaddr_in server;
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
inet_pton(AF_INET,ip,&server.sin_addr);
server.sin_port = htons(port);
sock = socket(PF_INET,SOCK_STREAM,0);
assert(sock > 0);
int ret = bind(sock,(struct sockaddr*)&server,sizeof(server));
assert(ret != -1);
ret = listen(sock,5);
assert(ret != -1);
struct sockaddr_in client;
bzero(&client,sizeof(client));
socklen_t len = sizeof(client);
int connfd = accept(sock,(struct sockaddr*)&client,&len);
if(connfd < 0)
printf("errno is:%d\n",errno);
else
{
close(STDOUT_FILENO);
dup(connfd);
printf("liuyifei,I love you!\n");
close(connfd);
}
close(sock);
}
client.c
#include "comm.h"
class client{
private:
int sock;
public:
client();
void create_client();
};
client::client()
{
int sock = 0;
}
void client::create_client()
{
struct sockaddr_in client;
bzero(&client,sizeof(client));
client.sin_family = AF_INET;
inet_pton(AF_INET,ip,&client.sin_addr);
client.sin_port = htons(port);
sock = socket(PF_INET,SOCK_STREAM,0);
assert(sock >= 0);
if((connect(sock,(struct sockaddr*)&client,sizeof(client)) != -1))
{
char buf[30];
printf("connect successful!\n");
if(recv(sock,buf,sizeof(buf),0) > 0)
cout<<buf<<endl;
else printf("the errno:%d\n",errno);
}
else printf("the errno:%d\n",errno);
close(sock);
}
int main()
{
client CGI;
CGI.create_client();
return 0;
}