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网络编程学习(8)--服务器端显示客户端的IP地址和端口号

#include "unp.h" #include int main(int argc, char **argv) { int listenfd, connfd; soc...
  • kuzuozhou
  • kuzuozhou
  • 2012-03-25 12:40:12
  • 1940

C++ socket编程基础二(三种Socket:TCP,UDP,原始Socket)

一、基于TCP(面向连接)的的Socket   1、服务器端   创建套接字 SOCKET socket( int af, //参数af指定通信发生的区域:AF_UNIX、AF_IN...
  • zh13544539220
  • zh13544539220
  • 2015-04-02 15:46:30
  • 1610

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

server端: #include #include #pragma comment(lib,"ws2_32.lib") void main() { //创建套接字 WORD myVer...
  • qq229596421
  • qq229596421
  • 2016-10-19 11:11:03
  • 983

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

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

linux C ----- udp, tcp, unix socket通信简单例子

udp socket相关知识UDP的程序设计可以分成客户端和服务器端两个部分。两者的主要差别在于对地址的绑定函数,客户端可以不用进行地质和端口的绑定。(客户端是随机拿一个大于1024的端口去连接的) ...
  • theArcticOcean
  • theArcticOcean
  • 2016-09-11 09:47:01
  • 4317

windows环境下用c++实现socket编程

一、什么是Socket socket即套接字,用于描述地址和端口,是一个通信链的句柄。应用程序通过socket向网络发出请求或者回应。 sockets(套接字)编程有三种,流式套接字(SOCK_S...
  • xiaoquantouer
  • xiaoquantouer
  • 2017-02-27 16:29:42
  • 24794

TCP(面向连接)的socket编程

服务器端程序: 1、创建套接字(socket)。 2、将套接字绑定到一个本地地址和端口上(bind)。 3、将套接字设为监听模式,准备接收客户请求(listen)。 4、等待客户请求到来;当请...
  • Gordennizaicunzai
  • Gordennizaicunzai
  • 2015-09-27 18:12:21
  • 395

C++ TCP 和 UDP 在socket编程中的区别

一、TCP与UDP的区别  基于连接与无连接    对系统资源的要求(TCP较多,UDP少)    UDP程序结构较简单    流模式与数据报模式    TCP保证数据正确性,UDP可能丢包    ...
  • dong_18383219470
  • dong_18383219470
  • 2016-09-10 08:53:17
  • 1350

Socket网络编程——C++版源码

本代码可直接使用 根据TCP/IP三次握手,实验时可使用两台电脑,或者打开两个终端模拟通信。服务器端:#include #include using namespace std;#pragma co...
  • zxh1592000
  • zxh1592000
  • 2017-12-23 09:50:50
  • 118

C++ Socket编程实例解析

Socket socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具...
  • u012391923
  • u012391923
  • 2016-10-21 11:57:37
  • 21659
收藏助手
不良信息举报
您举报文章:unix c++的socket编程(TCP)
举报原因:
原因补充:

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