zoukankan      html  css  js  c++  java
  • 用Socket编写TCP程序(C/C++)(转)

    本文介绍利用Linux下的C语言Socket函数建立TCP连接,兼容C++。

    利用TCP连接,可以进行HTTP、FTP等常见协议的信息传输,是Linux网络编程的重要部分。

    目录

    [隐藏]

    需要引用的头文件

    进行网络编程,通常需要引用如下头文件

    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    #include <unistd.h>
     
    //以下头文件是为了使样例程序正常运行
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>

    客户端程序

    struct sockaddr_in pin;
    struct hostent *nlp_host;
    int sd; 
    char host_name[256];
    int port;
     
    //初始化主机名和端口。主机名可以是IP,也可以是可被解析的名称
    strcpy(host_name,"www.linux-wiki.cn");
    port=80;
     
    //解析域名,如果是IP则不用解析,如果出错,显示错误信息
    while ((nlp_host=gethostbyname(host_name))==0){
        printf("Resolve Error!
    ");
    }
     
     
    //设置pin变量,包括协议、地址、端口等,此段可直接复制到自己的程序中
    bzero(&pin,sizeof(pin));
    pin.sin_family=AF_INET;                 //AF_INET表示使用IPv4
    pin.sin_addr.s_addr=htonl(INADDR_ANY);  
    pin.sin_addr.s_addr=((struct in_addr *)(nlp_host->h_addr))->s_addr;
    pin.sin_port=htons(port);
     
    //建立socket
    sd=socket(AF_INET,SOCK_STREAM,0);
     
    //建立连接
    while (connect(sd,(struct sockaddr*)&pin,sizeof(pin))==-1){
      printf("Connect Error!
    ");
    }

    至此,与服务器端的连接已建立,通信方法见最后一部分。

    服务器端程序

    本段是C++代码。

    int serverSocket;
    struct sockaddr_in serverAddr;
    struct sockaddr_in clientAddr;
     
    // 用port保存使用的端口
    int port=8000;
     
    // 建立Socket,并设置
    serverSocket = socket(AF_INET, SOCK_STREAM, 0);
     
    // 设置socket选项,这是可选的,可以避免服务器程序结束后无法快速重新运行
    int val=1;
    setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
     
    // 定义端口和监听的地址
    serverAddr.sin_family      = AF_INET;
    serverAddr.sin_port        = htons(port);
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    memset(&(serverAddr.sin_zero), 0, 8);
    int rc = bind(serverSocket, (struct sockaddr*) &serverAddr,
    		 sizeof(struct sockaddr));
    if (rc == -1) {
    	printf("Bad bind
    ");
    	exit(1);
    }
     
    // 让serverSocket开始监听,客户队列长为5
    rc = listen(serverSocket, 5);
    if (rc == -1) {
    	printf("Bad listen
    ");
    	exit(1);
    }
     
    // 等待客户连接
    int sock;
    int clientAddrSize = sizeof(struct sockaddr_in);
    sock = accept(serverSocket,
    			(struct sockaddr*) &clientAddr,
    			(socklen_t*) &clientAddrSize);

    这样,连接就已建立,返回的sock就是一个新的socket,可以用来通信。

    通信方法

    发送信息

    send(int sd,char * data,int len,0);
    

    其中sd是socket变量名(文件描述符),data是数据缓冲区的地址,len是缓冲区的大小,0通常无需更改

    接收信息

    recv(int sd,char * buf,int maxlen,0);
    

    关闭连接

    close(int sd);

    转自:http://linux-wiki.cn/wiki/zh-hans/%E7%94%A8Socket%E7%BC%96%E5%86%99TCP%E7%A8%8B%E5%BA%8F%EF%BC%88C/C%2B%2B%EF%BC%89


    --------------------------------------------------------------------自学笔记--------------------------------------------------------------------
        //创建Socket
        int sd = socket(AF_INET, SOCK_STREAM, 0);
    
        struct sockaddr_in address;
        //设置pin变量,包括协议、地址、端口等
        bzero(&address, sizeof(address));
        address.sin_family = AF_INET;                 //AF_INET表示使用IPv4
        address.sin_addr.s_addr = inet_addr(MY_HOST);
        address.sin_port = htons(MY_PORT);
    
        //建立TCP连接
        int ret = connect(sd, (struct sockaddr*)&address, sizeof(address));
        //连接失败
        if (ret == -1)
        {
            close(sd);
            return false;
        }
    
        //发送信号
        char* sigUsr1 = "signal SIGUSR1";
        write(sd, sigUsr1, sizeof(sigUsr1));
    
        //关闭连接
        close(sd);
        return true;
    
    
  • 相关阅读:
    [Angular] @ContentChild and ngAfterContentInit
    [Angular] Content Projection with ng-content
    [ES2016] Check if an array contains an item using Array.prototype.includes
    [Ramda] Handle Errors in Ramda Pipelines with tryCatch
    [React Native] Installing and Linking Modules with Native Code in React Native
    [Ramda] Refactor to Point Free Functions with Ramda using compose and converge
    [React Native] Writing Platform-Specific Components for iOS and Android in React Native
    [Redux] Avoid action type naming conflicts
    paip.索引优化---sql distict—order by 法
    DL,DT,DD,比传统table更语义,解析更快的table列表方式
  • 原文地址:https://www.cnblogs.com/veins/p/3153491.html
Copyright © 2011-2022 走看看