• socket programming


    进行 socket programming开始要做的工作:

    On Linux:

    以下是client代码,使用TCP,注意网络字节序:

     1 #include <sys/socket.h>  
     2 #include <netinet/in.h>  
     3 #include <arpa/inet.h>  
     4 int main()  
     5 {  
     6     int sockfd;  
     7     int len;  
     8     struct sockaddr_in address;  
     9     int result;  
    10     struct img_packet img_pkt;  
    11     int offset = 0;  
    12     sockfd = socket(AF_INET, SOCK_STREAM, 0);  
    13     address.sin_family = AF_INET;  
    14     address.sin_addr.s_addr = inet_addr("192.168.1.157");   
    15     address.sin_port = htons(8080);  
    16     len = sizeof(address);  
    17     result = connect(sockfd, (struct sockaddr *)&address, len);  
    18     if(result < 0)  
    19         return -1;  
    20     else  
    21     {  
    22         // send or receive operations  
    23     }  
    24     return 0;  
    25 }  

    服务器端程序创建socket的方法是一样的,只是要最后要调用bind()、listen()和accept(),示例代码如下:

     1 #include <sys/socket.h>  
     2 #include <netinet/in.h>  
     3 #include <arpa/inet.h>  
     4 int main(int argc, char **argv)  
     5 {  
     6     int server_sockfd, client_sockfd;  
     7     size_t server_len, client_len;  
     8     struct sockaddr_in server_address;  
     9     struct sockaddr_in client_address;  
    10     int nPort = 8080;  
    11     int keepAlive = 1;  
    12     server_sockfd = socket(AF_INET, SOCK_STREAM, 0);  
    13     server_address.sin_family = AF_INET;  
    14     server_address.sin_addr.s_addr = inet_addr("192.168.1.101");  
    15     printf("%s:%d/n", inet_ntoa(server_address.sin_addr), nPort);  
    16     server_address.sin_port = htons(nPort);  
    17     server_len = sizeof(server_address);  
    18     bind(server_sockfd, (struct sockaddr *)&server_address, server_len);  
    19     listen(server_sockfd, 5);  
    20     client_len = sizeof(client_address);  
    21     while (1)  
    22     {  
    23         client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);  
    24         // do something  
    25           
    26         close(client_sockfd);  
    27     }  
    28     close(server_sockfd);  
    29     return 0;  
    30 } 

    使用UDP:

     1 #include <sys/socket.h>  
     2 #include <netinet/in.h>  
     3 #include <arpa/inet.h>  
     4     int sockfd;  
     5     socklen_t len;  
     6     struct sockaddr_in address;  
     7     sockfd = socket(AF_INET, SOCK_DGRAM, 0);  
     8     address.sin_family = AF_INET;  
     9     address.sin_addr.s_addr = INADDR_ANY;     //inet_addr("192.168.1.105");  
    10     address.sin_port = htons(9000);  
    11     len = sizeof(address);  
    12     bind(sockfd, (struct sockaddr *)&address, len);  
    13     // do something here 

    若要发送数据给其他计算机,其中address.sin_addr.s_addr的值应为对方计算机的IP地址;若是接收数据,则该值在recvfrom()函数中会被赋为对方计算机的IP地址值。bind()函数只有在要监听某个端口的UDP数据时才使用。这时address.sin_addr.s_addr值可设为INADDR_ANY。

    On Windows:

    使用TCP连接:

     1 #include <winsock2.h>  
     2     WSADATA wsaData;  
     3     int iResult;  
     4     iResult = WSAStartup(MAKEWORD(2,2), &wsaData);  
     5     if (iResult != 0)  
     6     {  
     7         cout<<"WSAStartup failed: "<<iResult<<endl;  
     8     return -1;  
     9     }  
    10     struct sockaddr_in sa;  
    11     sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  
    12     sa.sin_family = AF_INET;  
    13     sa.sin_addr.s_addr = inet_addr("192.168.1.166");  
    14     sa.sin_port = htons(9000);  
    15     int len = sizeof(sa);  
    16     iResult = connect(sock, (struct sockaddr *)&sa, len);  
    17     if (iResult == SOCKET_ERROR)  
    18     {  
    19         cout<<"not connected"<<endl;  
    20     return -1;  
    21     }  
    22     // do something here  

    UDP:

     1 #include <winsock2.h>  
     2    WSADATA wsaData;  
     3    int iResult;  
     4    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);  
     5    if (iResult != 0)  
     6    {  
     7 //cout<<"WSAStartup failed: "<<iResult<<endl;  
     8 DbgLog((LOG_TRACE, 0, TEXT("WSAStartup failed:  %d"), iResult));  
     9 return -1;  
    10    }  
    11    struct sockaddr_in sa, from;  
    12    SOCKET sock;  
    13    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);  
    14    sa.sin_family = AF_INET;  
    15    sa.sin_addr.s_addr = INADDR_ANY;  
    16    sa.sin_port = htons(port);  
    17    int len = sizeof(sa);  
    18    bind(sock, (struct sockaddr *)&sa, len);  
    19    // do something here  
  • 相关阅读:
    Pearl Causal Hierarchy (PCH)
    Variational Autoencoders for Collaborative Filtering
    Towards Longterm Fairness in Recommendation
    Less is More: Reweighting Important Spectral Graph Features for Recommendation
    每日总结
    每日总结
    每日总结
    SpringIoCAnnotation 配置
    SpringIoCXML使用
    SpringIoC 条件装配
  • 原文地址:https://www.cnblogs.com/lumao1122-Milolu/p/8043949.html
Copyright © 2020-2023  润新知