LinuxでC言語で実現したSocket通信


昨夜実験室の先生は1つの問題を出して、もとのシステムの中でネットワークが連通しているかどうかを判断するモジュールは、pingコマンドを使って、システムを通じて呼び出して、クライアントは絶えずpingサーバーの端に行きます.これにより、ネットワークが接続されているか否かを判断できるが、pingコマンドが約6秒かかるため、ネットワークがt時間で切断されると、すなわち、クライアントは(t+6)この時点でしかネットワークに問題があることを知ることができない可能性があるという問題も同時に発生する.このtimeout=6 sの過程で,クライアントがサーバ側から送信しようとしたデータが失われる.ネットワークが切断されると、クライアントがすぐに知ることができ、データの送信をすぐに停止する方法が切実です.
資料を探すことで、私の解決策はsocket通信でこの問題を解決することです.サーバ側はクライアントにデータを送信し続け、クライアントはサーバ側を傍受し、ある時間にサーバ側のデータを傍受できない場合は、ネットワークに問題が発生したことを示します.そこで、次のプログラムが誕生しました.
プログラムはlinuxでのみ使用できます.なぜなら、#includeはlinuxの下のライブラリで、windowsの下で実行する必要がある場合はwindows対応のライブラリに変更する必要があります.
1.サーバー側:
# include <stdio.h> 
# include <string.h> 
# include <sys/socket.h> 
# include <netinet/in.h> 

# define MAXDATASIZE 1024

# define SERVERPORT 8000
# define MAXCONN_NUM 10

int main( ) 
{ 
    char buf[ MAXDATASIZE]; 
    int sockfd, new_fd, numbytes; 
    struct sockaddr_in server_addr; 
    struct sockaddr_in client_addr; 
    int sin_size; 
    if ((sockfd = socket ( AF_INET , SOCK_STREAM , 0)) == - 1) { 
        perror ("socket error"); 
        return 1; 
    } 
    memset(&client_addr,0,sizeof(struct sockaddr)); 
    server_addr.sin_family = AF_INET; 
    server_addr.sin_port = htons(SERVERPORT); 
    server_addr.sin_addr.s_addr = INADDR_ANY; 
    if ( bind ( sockfd, (struct sockaddr *) & server_addr, sizeof (struct sockaddr)) == -1) {
        perror ("bind error"); 
        return 1; 
    } 
    if (listen(sockfd, MAXCONN_NUM) ==-1) { 
        perror("listen error"); 
        return 1; 
    } 

    while (1) {
        sin_size = sizeof ( struct sockaddr_in ); 
        if ( ( new_fd = accept ( sockfd, ( struct sockaddr * ) & client_addr, & sin_size) ) == - 1) { 
            perror ( "accept error" ); 
            continue ; 
        } 
        printf ( "server: got connection from %s
" , inet_ntoa( client_addr. sin_addr) ); if ( ( numbytes = recv ( new_fd, buf, MAXDATASIZE, 0) ) == - 1) { perror ( "recv error" ); return 1; } if(numbytes) { buf[ numbytes] = '/0'; printf ( "received: %s
" , buf); sleep ( 3);// 3s } printf ( "send: hi~~/n" ); if ( send ( new_fd, "hi~~" , 5, 0) == - 1) { perror ( "send error" ); return 1; } close ( new_fd); } return 0; }

2.クライアント:
# include <stdio.h> 
# include <string.h> 
# include <sys/socket.h> 
# include <netinet/in.h> 

# define MAXDATASIZE 1024

# define SERVERIP "127.0.0.1" 
# define SERVERPORT 8000

int main( int argc, char * argv[ ] ) 
{
    char buf[ MAXDATASIZE]; 
    int sockfd, numbytes; 
    struct sockaddr_in server_addr; 
    while(1){
    if ( ( sockfd = socket ( AF_INET , SOCK_STREAM , 0)) == - 1) { 
        perror("socket error"); 
        return 1; 
    } 
    memset ( & server_addr, 0, sizeof(struct sockaddr)); 
    server_addr. sin_family = AF_INET; 
    server_addr. sin_port = htons ( SERVERPORT); 
    server_addr. sin_addr. s_addr = inet_addr( SERVERIP); 
    if ( connect ( sockfd, ( struct sockaddr * ) & server_addr, sizeof( struct sockaddr ) ) == -1) { 
        perror ("connect error"); 
        return 1; 
    } 
    printf ( "send: Hello, world!
" ) ; if ( send ( sockfd, "Hello, world!" , 14, 0) == -1) { perror ( "send error" ); return 1; } if ( ( numbytes = recv ( sockfd, buf, MAXDATASIZE, 0) ) == -1) { perror( "recv error" ); return 1; } if ( numbytes) { buf[numbytes] = '/0'; printf("received: %s
",buf); } close (sockfd); } return 0; }