C++网络编程


834 浏览 5 years, 7 months

2.2 因特网客户端1

版权声明: 转载请注明出处 http://www.codingsoho.com/

本例会想服务器发送数据,因此服务器可以显示这些数据。

头文件和跨平台接口定义跟服务器端一样,所以不再叙述了。

用户输入服务器连接地址
    cout << "Enter the IP address to connect to: ";
    cin >> ip;
    // convert the IP address.
    ipaddr = inet_addr( ip );
    if( ipaddr == -1 )
    {
        cout << "Error: invalid IP address" << endl;
        return 0;
    }
  • inet_addr将字符串地址ip转换为以网络字节序表示的IP地址ipaddr
  • cout <<引导用户输入内容
创建套接字
    // create a socket
    int sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
    // check if socket was created
    if( sock == -1 )
    {
        cout << "Socket creation error!" << endl;
        return 0;
    }
    cout << "Socket created!" << endl;

连接方式使用TCP

连接到服务器
    // create a sockaddr_in for connection, on port 4000
    struct sockaddr_in socketaddress;
    socklen_t sa_size = sizeof( struct sockaddr_in );
    socketaddress.sin_family = AF_INET;
    socketaddress.sin_port = htons( 4000 );
    socketaddress.sin_addr.s_addr = ipaddr;
    memset( &(socketaddress.sin_zero), 0, 8 );
    // connect the socket
    err = connect( sock, (struct sockaddr*)&socketaddress, sa_size );
    if( err == -1 )
    {
        cout << "Socket connection error!" << endl;
        return 0;
    }
    cout << "Socket connected!" << endl;

填充一个数据结构sockaddr,该数据结构为服务器端信息,将创建好的套接字连接到服务器

发送数据
    cout << "sending message: " << message << "..." << endl;
    // send data
    err = send( sock, message, strlen( message ) + 1, 0 );
    if( err == -1 )
    {
        cout << "Socket sending error!" << endl;
        return 0;
    }
    cout << "Data Sent!" << endl;

这段代码比较简单,通过套接字发送消息

停止套接字
    shutdown( sock, 2 );
    CloseSocket( sock );

    CloseSocketLib;

最后,跟服务器端一样,停止套接字。