socket編程(一)

基本的socket編程。

server:

#include <cstdlib>
#include <fstream>
#include <iomanip>   
#include <iostream>  

#include <string.h>
#include <errno.h> 
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/wait.h>
#include <netinet/in.h>
#include <netdb.h>


using namespace std;



int main(int argc, char *argv[])
{
        int socket_desc, client_sock, c, read_size;
        struct sockaddr_in server, client;
        char client_message[2000];

        // create a socket
        socket_desc = socket(AF_INET, SOCK_STREAM, 0);
        if (socket_desc == -1)
                perror("couldn't create socket");
        cout << "socket created" << endl;

        // prepare the sockaddr_in structure
        server.sin_family = AF_INET;
        server.sin_addr.s_addr = INADDR_ANY;
        server.sin_port = htons(8888);

        // enable address reuse
        int on = 1;
        if (setsockopt(socket_desc, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) {
                perror("setsockopt failed");
                return 1;
        }

        // bind
        if (bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0) {
                perror("bind failed");
                return 1;
        }
        cout << "bind done" << endl;

        // listen
        listen(socket_desc, 3);
        
        // accept incoming connection ...
        cout << "Waitting for incoming connections ..." << endl;
        c = sizeof(struct sockaddr_in);
        client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t *)&c);
        if (client_sock < 0) {
                perror("accept failed");
                return 1;
        }
        cout << "connection accepted" << endl;

        // receive a message from client
        while(read_size = recv(client_sock, client_message, 2000, 0) > 0) {
                cout << client_message << endl;
                send(client_sock, client_message, strlen(client_message), 0);
        }
        
        if (read_size == 0) {
                cout << "client disconnected" << endl;
                fflush(stdout);
        } else if (read_size == -1) {
                perror("recv failed");
        }
        

        return 0;
}

client:

#include <cstdlib>
#include <fstream>
#include <iomanip>   
#include <iostream>  

#include <string.h>
#include <errno.h> 
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/wait.h>
#include <netinet/in.h>
#include <netdb.h>
#include<arpa/inet.h> //inet_addr


using namespace std;



int main(int argc, char *argv[])
{
        int sock;
        struct sockaddr_in server;
        char message[1000], server_reply[2000];

        // create socket
        sock = socket(AF_INET, SOCK_STREAM, 0);
        if (sock == -1)
                cout << "couldn't create socket" << endl;
        cout << "socket created" << endl;

        // prepare sockaddr_in server
        server.sin_addr.s_addr = inet_addr("127.0.0.1");
        server.sin_family = AF_INET;
        server.sin_port = htons(8888);

        // connect to remote server
        if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
                perror("connect failed");
                return 1;
        }
        cout << "Connected" << endl;

        // keep communicating with server
        while(1) {
                cout << "Enter message: " << endl;
                cin.getline(message, sizeof(message));

                // send some data
                if (send(sock, message, strlen(message), 0) < 0) {
                        cout << "Send failed" << endl;
                        return 1;
                }

                // receive a reply from the server
                if (recv(sock, server_reply, 2000, 0) < 0) {
                        cout << "recv failed" << endl;
                        break;
                }
                cout << "Server reply: " << server_reply << endl;
        }


	return 0;
}

參考:http://www.binarytides.com/server-client-example-c-sockets-linux/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章