簡體   English   中英

簡單的套接字編程代碼工作

[英]Simple socket programming code working

我正在嘗試使用針對TCP-IP服務器和客戶端的這些簡單示例C ++代碼來研究和理解BSD套接字編程。 我已經閱讀了標准的API,例如socket(),bind(),listen(),accept()和read / recv(),甚至下面的代碼也可以在g ++ / Linux上進行編譯。

我想要做的是看到它在現實中工作,我的意思是運行服務器代碼,然后使用客戶端連接到它,並從客戶端到服務器發送數據,反之亦然,並驗證接收到的數據。 所有這些都在我同一個網段的兩個linux box(Ubuntu)中。 我為這兩個Linux機器提供了專用IPv4地址。

要實現此目標,應采用什么設置?需要通過上述網絡設置來實現以下服務器和客戶端代碼中的哪些代碼更改? 我真的想真正看到它通過網絡實時運行嗎?

同樣,有關代碼的更多指針,研究動手套接字編程/網絡編程的博客文章也將有所幫助。

//TCP SERVER
#include<sys/socket.h> 
#include<netinet/in.h> 
#include<stdio.h> 
#include<string.h>
#include<stdlib.h> 
#include <arpa/inet.h>
//#include <fcntl.h>
#include <unistd.h>

main()
{ 
    char buf[100]; 
    socklen_t len; 
    int k,sock_desc,temp_sock_desc; 
    struct sockaddr_in client,server; 
    memset(&client,0,sizeof(client)); 
    memset(&server,0,sizeof(server)); 
    sock_desc = socket(AF_INET,SOCK_STREAM,0); 
    server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    server.sin_port = 7777; 
    k = bind(sock_desc,(struct sockaddr*)&server,sizeof(server)); 
    k = listen(sock_desc,20); len = sizeof(client);
    temp_sock_desc = accept(sock_desc,(struct sockaddr*)&client,&len); 
    while(1)
    {     
        k = recv(temp_sock_desc,buf,100,0);     
        if(strcmp(buf,"exit")==0)        
            break;     
        if(k>0)         
            printf("%s",buf); 
    } close(sock_desc); 
    close(temp_sock_desc); 
    return 0; 
}

//TCP CLIENT
#include<sys/socket.h> 
#include<netinet/in.h> 
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h>
#include <arpa/inet.h>
//#include <fcntl.h>
#include <unistd.h>

main()
{ 
    char buf[100]; 
    struct sockaddr_in client; 
    int sock_desc,k; 
    sock_desc = socket(AF_INET,SOCK_STREAM,0);
    memset(&client,0,sizeof(client)); 
    client.sin_family = AF_INET; 
    client.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    client.sin_port = 7777; 
    k = connect(sock_desc,(struct sockaddr*)&client,sizeof(client)); 
    while(1)
    {     
        gets(buf);     
        k = send(sock_desc,buf,100,0);     
        if(strcmp(buf,"exit")==0)         
            break; 
    } 
    close(sock_desc); 
    return 0; 
}

在您的代碼中添加一些錯誤處理,可能會涉及一些錯誤,例如:

服務器:

#include <sys/socket.h>  
#include <netinet/in.h>  
#include <stdio.h>  
#include <string.h> 
#include <stdlib.h>  
#include <arpa/inet.h> 
//#include <fcntl.h> 
#include <unistd.h> 

main() 
{  
    int sock_desc = socket(AF_INET, SOCK_STREAM, 0);
    if (sock_desc == -1)
    {
        printf("cannot create socket!\n");
        return 0;
    }

    struct sockaddr_in server;  
    memset(&server, 0, sizeof(server));  
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;  
    server.sin_port = htons(7777);  
    if (bind(sock_desc, (struct sockaddr*)&server, sizeof(server)) != 0)
    {
        printf("cannot bind socket!\n");
        close(sock_desc);  
        return 0;
    }

    if (listen(sock_desc, 20) != 0)
    {
        printf("cannot listen on socket!\n");
        close(sock_desc);  
        return 0;
    }

    struct sockaddr_in client;  
    memset(&client, 0, sizeof(client));  
    socklen_t len = sizeof(client); 
    int temp_sock_desc = accept(sock_desc, (struct sockaddr*)&client, &len);  
    if (temp_sock_desc == -1)
    {
        printf("cannot accept client!\n");
        close(sock_desc);  
        return 0;
    }

    char buf[100];  
    int k;  

    while(1) 
    {      
        k = recv(temp_sock_desc, buf, 100, 0);      
        if (recv == -1)
        {
            printf("\ncannot read from client!\n");
            break;
        }

        if (recv == 0)
        {
            printf("\nclient disconnected.\n");
            break;
        }

        if (k > 0)          
            printf("%*.*s", k, k, buf);  

        if (strcmp(buf, "exit") == 0)         
            break;      
    }

    close(temp_sock_desc);  
    close(sock_desc);  

    printf("server disconnected\n");
    return 0;  
} 

客戶:

#include <sys/socket.h>  
#include <netinet/in.h>  
#include <stdio.h>  
#include <string.h>  
#include <stdlib.h> 
#include <arpa/inet.h> 
//#include <fcntl.h> 
#include <unistd.h> 

main() 
{  
    int sock_desc = socket(AF_INET, SOCK_STREAM, 0); 
    if (sock_desc == -1)
    {
        printf("cannot create socket!\n");
        return 0;
    }

    struct sockaddr_in client;  
    memset(&client, 0, sizeof(client));  
    client.sin_family = AF_INET;  
    client.sin_addr.s_addr = inet_addr("127.0.0.1");  
    client.sin_port = htons(7777);  

    if (connect(sock_desc, (struct sockaddr*)&client, sizeof(client)) != 0)
    {
        printf("cannot connect to server!\n");
        close(sock_desc);
    }

    char buf[100];
    char c = '\n';
    char *p_buf;
    int k, len;  

    while(1) 
    {      
        gets(buf);

        len = strlen(buf);
        p_buf = buf;

        while (len > 0)
        {
            k = send(sock_desc, p_buf, len, 0);      
            if (k == -1)
            {
                printf("cannot write to server!\n");
                break;
            }

            p_buf += k;
            len -= k;
        }

        k = send(sock_desc, &c, 1, 0);      
        if (k == -1)
        {
            printf("cannot write to server!\n");
            break;
        }

        if (strcmp(buf, "exit") == 0)          
            break;  
    }  

    close(sock_desc);  
    printf("client disconnected\n");

    return 0;  
} 

在服務器端,您需要將地址127.0.0.1更改為0.0.0.0,以啟用來自任何位置的連接。 您也可以使用telnet代替客戶端代碼,因此請檢查服務器是否按預期工作。 還要調查您在各種Linux上是否具有snoop命令。

在客戶端,您需要使用服務器計算機的IP地址

您需要進行以下更改。

端口號-使用htons

服務器server.sin_port = htons(7777); 客戶端client.sin_port = htons(7777);

服務器-從任何地址獲取它,即server.sin_addr.s_addr = INADDR_ANY;

希望能有所幫助

應該是這樣

if (connect(sock_desc, (struct sockaddr*)&client, sizeof(client)) != 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM