Linux中用C++寫基本TCP/IP client

這是在Linux中用C++以及Linux的system call
寫的一個基本的TCP/IP client
架設client的基本routine就是這樣而已
需要的時候就直接複製使用吧

下面是我寫的程式碼
程式碼解釋我哪天有空再來補(感覺是不會補了哈哈
//tcpclient.cpp
#include <iostream>
#include <string>
#include <cstring>
#include <sstream>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <signal.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/time.h>
#include <sys/select.h>
#include <sys/socket.h>  /*for BSD*/

#define BUFF_SIZE 100000

int connectTCP(std::string ip, std::string port){
        int                     sockfd;
        struct sockaddr_in      client_sin;
        struct hostent *host_ip;
        int SERV_TCP_PORT;
        std::stringstream ss;

        /*Open a TCP socket(an Internet stream socket).*/
        if((sockfd = socket(AF_INET, SOCK_STREAM, 0))<0)
                std::cerr << "server: can't open stream socket" << std::endl;

        /*fill in the structure "client_sin" with the adderss of the server*/
        if((host_ip=gethostbyname(ip.c_str())) == NULL)
                std::cerr << "illegal input arguments" << std::endl;
        ss.clear();
        ss.str(port);
        ss >> SERV_TCP_PORT;
        bzero((char *)&client_sin, sizeof(client_sin));
        client_sin.sin_family = AF_INET;
        client_sin.sin_addr = *((struct in_addr *)host_ip->h_addr);
        client_sin.sin_port = htons(SERV_TCP_PORT);

        /*connect to server*/
        if(connect(sockfd,(struct sockaddr *)&client_sin,sizeof(client_sin)) == -1){
                std::cerr << "connect to server error" << std::endl;
                exit(0);
        }

        return sockfd;
}

int main(int argc, char *argv[]){
        int sockfd = 0;
        int num_rstdin = 0;
        int num_rsocket = 0;
        std::string str_port = "";
        std::string str_ip = "";
        std::stringstream ss;
        char char_rstdin;
        char char_rsocket;
        std::string str_rstdin = "";
        fd_set rfds;
        struct timeval timeout;
        timeout.tv_sec = 0;
        timeout.tv_usec = 100;

        /*connect to server*/
        ss.clear();
        ss.str(argv[1]);
        ss >> str_ip;
        ss.clear();
        ss.str(argv[2]);
        ss >> str_port;
        sockfd = connectTCP(str_ip,str_port);
        /*non-blocking read from stdin and server, then process the data*/
        while(1){
                FD_ZERO(&rfds);
                FD_SET(STDIN_FILENO, &rfds);
                FD_SET(sockfd, &rfds);
                select(sockfd+1, &rfds, NULL, NULL,&timeout); /*block here, almost non-block(timeout is short)*/
                if(FD_ISSET(STDIN_FILENO, &rfds)){
                        num_rstdin = read(STDIN_FILENO, &char_rstdin, 1);
                        if(char_rstdin != '\n') /*split stdin input data with '\n'*/
                                str_rstdin += char_rstdin;
                        else{
                                write(sockfd, str_rstdin.c_str(), str_rstdin.size());
                                write(sockfd, "\n", 1); /*remote server splite data with '\n'*/
                                str_rstdin = "";
                        }
                }
                if(FD_ISSET(sockfd, &rfds)){
                        char chararr_rsocket[BUFF_SIZE] = {0};
                        num_rsocket = read(sockfd,chararr_rsocket,BUFF_SIZE);
                        if(num_rsocket==0)
                                return 0;
                        else if(num_rsocket<0)
                                std::cout << "read socket error" << std::endl;
                        std::cout << chararr_rsocket << std::flush;
                }/*if(FD_ISSET ... */
        }/*while loop*/
}/*int main()*/


結果的截圖我就不放了
反正就是client
比較值得注意的是,這個是用select來檢測tcp跟std::in(client端鍵盤輸入)哪個有訊息要讀
大致上就是這樣


好了,今天的筆記到此結束
希望有幫助未來遺忘這些的自己,以及需要的人

留言

這個網誌中的熱門文章

python的list與numpy的array和matrix的關係