unix c++的socket编程(TCP)

原创 2007年09月09日 11:31:00
在unix下编写c++ 的socket
服务端
tcp_server.cc  

//-----------------------------------------server program---------------------------

#include 
<iostream>
using namespace std;
#include 
<sys/socket.h>
#include 
<unistd.h>
#include 
<netinet/in.h>
#include 
<arpa/inet.h>
#include 
<signal.h>
#include 
<sys/wait.h>

/*struct in_addr{
    in_addr_t s_addr;    
};
struct sockaddr_in{
    
    sa_family_t sin_family;
    in_port_t sin_port;
    struct in_addr sin_addr;
    
};
*/

//---------read/write function----------
void req_proc(int s,char*);

void fn(int sig){
    
int pid = wait(NULL);
    cout 
<< "child   " << pid << "   clear" << endl;
    signal(SIGCHLD,fn);    

}

int main()
{
    
if(signal(SIGCHLD,fn)==SIG_ERR){
        cout 
<< "capture signal error" << endl;
        exit(
0);
}
    
//1,socket(),create socket.
int fd = socket(AF_INET,SOCK_STREAM,0);
        
if(fd<0)
        
{
                cout 
<< "create socket error!" << endl;
                
return 0;
        }


//2,bind(),bind ip and port.
struct sockaddr_in serveraddr;
socklen_t len 
= sizeof(serveraddr);
memset(
&serveraddr,0,len);
serveraddr.sin_family
=AF_INET;
serveraddr.sin_addr.s_addr
=INADDR_ANY;
short port;
cout 
<< "enter a port:" ;
cin 
>> port;
serveraddr.sin_port
=htons(port);
//-------invoke bind function -------------
int ret = bind(fd,(struct sockaddr*)&serveraddr,len);
if(ret !=0)
{
    cout 
<< "bind error!" << endl;
    close(fd);
    exit(
0);
}


//3,listen(),change socketed.
int lis;
lis 
= listen(fd,5);
if(lis < 0)
{
    cout 
<< "listen error!" <<endl;
    cout 
<< errno << endl;
    exit(
0);
}

cout 
<< "listen() success!" << endl;

//4,accept(),waiting for request.
struct sockaddr_in clientaddr;
len 
= sizeof(clientaddr);
while(1)
{
    memset(
&len,0,len);
//-----invoke accept----------------
cout << "server is running............" << endl;
int cfd = accept(fd,(struct sockaddr*)&clientaddr,&len);
if(cfd == -1)
{
    cout 
<< "accept() failed"<< endl;
    exit(
0);
}

if(cfd < 0)
continue;
//print address message of client!
char ip[16];
memset(ip,
0,16);
inet_ntop(AF_INET,
&clientaddr.sin_addr,ip,16);
cout 
<< "get connection from " << ip << ":";
cout 
<< clientaddr.sin_port << endl;
int pid = fork();
if(pid ==0)
    
{
    
//read(),write()
    close(fd);
    req_proc(cfd,ip);
    
//close().
    close(cfd);
    exit(
0);
    }

    close(cfd);
    }

}

//-----------read / write function define-----------
void req_proc(int cfd,char* ip)
{
char buf[100];
int len =0;
while(1)
{
    memset(buf,
0,sizeof(buf));
    len 
= read(cfd,buf,100);
    
if(len == 0break;
    cout 
<< buf <<'['<< ip <<']'<< endl;
    strcat(buf,
"[back from server]");
    write(cfd,buf,strlen(buf));
}

}


 客户端
tcp_client.cc

//-------------------------client program------------------------------------

#include 
<iostream>
using namespace std;
#include 
<sys/socket.h>
#include 
<unistd.h>
#include 
<netinet/in.h>
#include 
<arpa/inet.h>
/****************************
argv[0]:command name;
argv[1]:ip;
argv[2]:port;
*****************************
*/

int main(int argc,char* argv[])
{
if(argc !=3)
{
    cout 
<< "USAGE:"<< argv[0];
    cout 
<< "ip|port:"<< endl;
    exit(
0);
}
    
//1,socket(),create tcp socket;
int fd = socket(AF_INET,SOCK_STREAM,0);
if(fd<0)
{
    cout 
<< "create socket error" << endl;
    exit(
0);
}

//2,connect(),connect to server.
struct sockaddr_in serveraddr;
memset(
&serveraddr,0,sizeof(serveraddr));
serveraddr.sin_family 
= AF_INET;
int len = sizeof(serveraddr);
serveraddr.sin_port
=htons(atoi(argv[2]));
inet_pton(AF_INET,argv[
1],&serveraddr.sin_addr);
//------------invoke connect function-----------
int ret = connect(fd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
if(ret <0)
{
    cout 
<< "connect() fail!"<<endl;
    close(fd);
    exit(
0);
}

cout 
<< "connect server successlly!" << endl;


//3,read/write.
char buf[100];
while(1){
    memset(buf,
0,sizeof(buf));
    cout 
<< "enter a line:" ;
    cin.getline(buf,
100);
    
if(strlen(buf)==0continue;
    
if(strcmp(buf,"exit")==0break;
    write(fd,buf,strlen(buf));
    memset(buf,
0,sizeof(buf));
    read(fd,buf,
sizeof(buf));
    cout 
<< buf << endl;
}

//4,close socket.
close(fd);
    
return 0;
}


相关文章推荐

UNIX网络编程:socket套接字(TCP与UDP)

套接字简介:套接字是网络编程中的一种通信机制,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通...

【Unix 网络编程】TCP Socket 编程基础(0)

一、套接口地址结构  IPv4 套接口地址结构 struct in_addr{ in_addr_t s_addr; /*32-bit IPV4地址*/ }; ...

unix 下 C++ socket 编程+详细注释

  • 2008年09月04日 13:24
  • 3KB
  • 下载

c++ socket编程tcp

  • 2010年03月09日 10:04
  • 57KB
  • 下载

TCP Socket编程 C/C++实现 (Windows Platform SDK)

TCP Socket编程 C/C++实现 (Windows Platform SDK)  Server:  --------------------------------------------...
  • ljg888
  • ljg888
  • 2011年10月12日 19:42
  • 643

[C++] Windows下的socket编程(这是一个简单的TCP/IP例子)

Socket的概念: Socket,即套接字,用于描述地址和端口,是一个通信链的句柄。 应用程序通过Socket像网络发出请求或者回应。 什么事客户/服务器模式: 在TCP/IP网络应...

linux下C/C++网络编程基本:socket实现tcp和udp的例子

简单的linux下socket编程,分别基于TCP和UDP协议实现的简单程序 linux下socket编程可以概括为以下几个函数的运用: socket() bind() listen()...

网络编程:基于TCP的socket网络传输视频(C++, python)

可以实现C++ to C++、Python to Python、C++ to Python的视频或图像传输。一. 概述Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后...

简单的 C++ SOCKET编程 ---基于TCP/IP协议

server端:    #include #include #pragma comment(lib,"ws2_32.lib") void main() {  //创建套接字 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:unix c++的socket编程(TCP)
举报原因:
原因补充:

(最多只允许输入30个字)