TCP网络编程

本文深入探讨了TCP网络编程的基本模型,包括服务器端和客户端的实现流程,并展示了如何使用多线程进行高效的数据处理。通过具体的程序例程,详细解释了socket操作、连接建立、数据读写等关键步骤,同时介绍了如何利用fork()函数实现子进程处理客户端请求,确保服务器能够同时响应多个并发连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TCP网络编程基本模型:
UNIX环境高级编程435页。
程序例程:
服务器:
#include
#include
#include
#include
#include
#include

#define portnumber 3333

int main( int argc, char **argv )
{
    int        sockfd;
    int     new_fd;
    int     sin_size;
    int     nbytes;
    char    buffer[1024];
    struct sockaddr_in    server_addr;
    struct sockaddr_in    client_addr;



    if( (sockfd=socket(AF_INET, SOCK_STREAM, 0)) == -1 )
    {
        perror( "socket error\n" );
        exit( 1 );
    }
    bzero( &server_addr, sizeof(struct sockaddr_in) );
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl( INADDR_ANY );
    server_addr.sin_port = htons( portnumber );
    if( bind(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1 )
    {
        perror( "bind error\n" );
        exit( 1 );
    }
    if( listen(sockfd, 5) == -1 )
    {
        perror( "listen error\n" );
        exit( 1 );
    }
   
    sin_size = sizeof( struct sockaddr_in );
    while( 1 )
    {
        if( (new_fd=accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size)) == -1 )
        {
            perror( "accept error\n" );
            exit( 1 );
        }
        fprintf( stdout," server get %s ", inet_ntoa(client_addr.sin_addr) );

        if( (nbytes=read(new_fd, buffer, 1024)) == -1 )
        {
            perror( "read error\n" );
            exit( 1 );
        }
        buffer[nbytes] = '\0';
        printf( "received %s\n", buffer );

        close( new_fd );
    }

    exit( 0 );
}

客户端:
#include
#include
#include
#include
#include

#define portnumber 3333

int main( int argc, char **argv )
{
    int sockfd;
    char buffer[1024];
    struct sockaddr_in server_addr;
   
    sockfd = socket( AF_INET, SOCK_STREAM, 0 );


    bzero( &server_addr, sizeof(server_addr) );
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons( portnumber );
    server_addr.sin_addr.s_addr = inet_addr( "127.0.1.1" );
    if( connect(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1 )
    {
        perror( "connet error\n" );
        exit( 1 );
    }
   
    printf( "please input char: \n");

    fgets( buffer, 1024, stdin );
    write( sockfd, buffer, strlen(buffer) );

    close( sockfd );
    exit( 0 );
}

遇到的问题:
刚开始由于在客户端中没有建立套接字,即
sockfd = socket( AF_INET, SOCK_STREAM, 0 );这一句,导致connect文件总是返回pemission denied。

多线程TCP编程:
while( 1 )
   
        if( (new_fd=accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size)) == -1 )
        {
            perror( "accept error\n" );
            exit( 1 );
        }
        fprintf( stdout," server get %s\n ", inet_ntoa(client_addr.sin_addr) );
        if( fork() == 0 )
        {

        if( (nbytes=read(new_fd, buffer, 1024)) == -1 )
        {
            perror( "read error\n" );
            exit( 1 );
        }
        buffer[nbytes] = '\0';
        printf( "received %s\n", buffer );

        close( new_fd );
        }
    }
主要思想是一个线程处理连接任务,连接后的事务用创建的子进程处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值