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域套接字及TCP、UDP示例

UNIX域套接字用于在同一台机器上运行的进程之间的通信。虽然因特网域套接字可用于同一目的,但UNIX域套接字的效率更高。UNIX域套接字仅仅复制数据;它们并不执行协议处理,不需要添加或删除网络报头,无...
  • bytxl
  • bytxl
  • 2015年08月22日 18:08
  • 2783

《unix高级环境编程》套接字——基于 socket 的编程

客户端: /* 基于TCP协议面向连接的客户端进程 */ #include "apue.h" #include #include #include #include "connectre.h...
  • chenhanzhun
  • chenhanzhun
  • 2014年11月20日 20:10
  • 1754

简单理解Socket及TCP/IP、Http、Socket的区别

题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人;但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很...
  • JenMinZhang
  • JenMinZhang
  • 2015年07月23日 10:06
  • 28513

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

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

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

一、套接口地址结构  IPv4 套接口地址结构 struct in_addr{ in_addr_t s_addr; /*32-bit IPV4地址*/ }; ...
  • yeswenqian
  • yeswenqian
  • 2014年03月17日 14:45
  • 1641

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

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

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

  • 2008年09月04日 13:23
  • 1KB
  • 下载

UNIX网络编程——SOCKET API和TCP STATE的对应关系_三次握手_四次挥手及TCP延迟确认

在socket系统调用中,如何完成三次握手和四次挥手:     SOCK_DGRAM即UDP中的connect操作知识在内核中注册对方机器的IP和PORT信息,并没有建立连接的过程,即没有发包,clo...
  • ctthunagchneg
  • ctthunagchneg
  • 2013年07月25日 11:32
  • 1460

c++ socket编程tcp

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

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

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

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