LINUX C網絡編程學習筆記-----------一個簡單的TCP程序設計


TCP程序設計

 

下面的一幅圖是取自《UNIX網絡編程卷一》,這個簡單的C/S程序的框架,應該可以一下很容易看懂。 

 

下面是我寫的一個例子:

服務端: 

 

/*
          tcp_server.c

*/

#include <stdio.h>
#include <stdlib.h>
#include < string.h>
#include <netdb.h>
#include <sys/types.h>
#include <errno.h>
#include <netinet/ in.h>
#include <sys/socket.h>

#define portnumber 3333

int main( int argc, char * argv[])
{
     int sockfd,new_fd;
     struct sockaddr_in server_addr;
     struct sockaddr_in client_addr;
     int sin_size;
     int nbytes;
     char buffer[ 1024];
// 創建sockfd描述符,AF_INET代表IPv4,SOCK_STREAM代表TCP    
     if ((sockfd = socket(AF_INET,SOCK_STREAM, 0)) == - 1)
    {
        fprintf(stderr, " socket error %s ",strerror(errno));
        exit( 1);
    }
// 服務器填充sockaddr結構
    bzero(&server_addr, sizeof( struct sockaddr_in)); // 初始化,置0。
    server_addr.sin_family = AF_INET;
// 將本機器上的long數據轉化為網絡上的long數據
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
// 將本機的short數據轉化為網絡上的short數據
    server_addr.sin_port = htons(portnumber);
// 捆綁sockfd描述符到IP地址
     if (bind(sockfd,( struct sockaddr *)(&server_addr), sizeof( struct sockaddr)) == - 1)
    {
        fprintf(stderr, " bind error %s\n\a ",strerror(errno));
        exit( 1);
    }
// 設置允許的最大客戶端連接數
     if (listen(sockfd, 5) == - 1)
    {
        fprintf(stderr, " listen error %s\n\a ",strerror(errno));
        exit( 1);
    }
     while( 1)
    {
// 服務器阻塞知道客戶程序建立連接
        sin_size ==  sizeof( struct sockaddr_in);
         if ((new_fd = accept(sockfd,( struct sockaddr *)(&client_addr),&sin_size)) == - 1)
        {
            fprintf(stderr, " accept error %s\n\a ",strerror(errno));
            exit( 1);
        }
        fprintf(stderr, " server get connection from %s\n\a ",inet_ntoa(client_addr.sin_addr));
         if ((nbytes = read(new_fd,buffer, 1024)) == - 1)
        {
            fprintf(stderr, " read error %s \a\n ",strerror(errno));
            exit( 1);
        }
        buffer[nbytes] =  ' \0 ';
        printf( " server received %s\n ",buffer);
        close(new_fd);
    }
    exit( 0);


客戶端:

 

/*

          tcp_client.c

*/


#include <stdio.h>
#include < string.h>
#include <stdlib.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ in.h>

#define portnumber 3333

int main( int argc, char *argv[])
{
     int sockfd;
     char buffer[ 1024];
     struct sockaddr_in server_addr;
     struct hostent * host;
     if (argc !=  2)
    {
        fprintf(stderr, " Usage: %s hostname\a\n ",argv[ 0]);
        exit( 1);
    }
     if ((host = gethostbyname(argv[ 1])) == NULL)
    {
        fprintf(stderr, " gethostname error \n\a ");
        exit( 1);
    }
// 客戶端開始建立sockfd描述符
     if ((sockfd = socket(AF_INET,SOCK_STREAM, 0)) == - 1)
    {
        fprintf(stderr, " scoket error %s\a\n ",strerror(errno));
        exit( 1);
    }
    bzero(&server_addr, sizeof(server_addr)); // 初始化,置0.
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(portnumber); // 將本機的short數據轉化為網絡的short數據
    server_addr.sin_addr = *(( struct in_addr *)host->h_addr);
// 客戶程序發起連接請求
     if (connect(sockfd,( struct sockaddr *)(&server_addr), sizeof( struct sockaddr)) == - 1)
    {
        fprintf(stderr, " connect error %s\a\n ",strerror(errno));
        exit( 1);
    }
// 連接成功
    printf( " Please input char:\n ");
// 發送數據
    fgets(buffer, 1024,stdin);
    write(sockfd,buffer,strlen(buffer));
// 結束通訊    
    close(sockfd);
    exit( 0)}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM