Linux-6.3-TCP

来源:互联网 发布:linux wget 编辑:程序博客网 时间:2024/05/27 20:22

(1)基于TCP-服务器的程序设计:



(2)基于TCP-客户端的程序设计:


(3)基于TCP-通讯模型



TCP实例代码:

tcp_server.c


#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <errno.h>
#include <netdb.h>
#include <string.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];


    /*The server began to build the descriptor */
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {

 fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
        exit(1);
    }
    /*服务器端填充sockaddr结构*/
    bzero(&server_addr,sizeof(struct sockaddr_in)); //初始化,值0
    server_addr.sin_family=AF_INET;                //Internet
    server_addr.sin_addr.s_addr=htonl(INADDR_ANY);  //将本机上的long数据转化为网络上的long数据
    server_addr.sin_port=htons(portnumber);         //将本机上的short数据转化为>网络上的short数据

    /*捆绑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",strerror(errno));
            exit(1);
        }
        fprintf(stderr,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));
        if((nbytes=read(new_fd,buffer,1024))==-1)
        {
            fprintf(stderr,"Read error:%s\n\a",strerror(errno));
            exit(1);
        }
        buffer[nbytes]='\0';
        printf("Server received %s\n",buffer);


        /*这个通讯已经结束*/

       close(new_fd);
        /*继续循环*/
    }

    /*结束通讯*/


    return 0;

}


tcp_client.c:


#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.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");
        exit(1);
    }
    /*客户程序开始建立sockfd描述符*/
    if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
    {
        fprintf(stderr,"Socket error%s\a\n",strerror(errno));
        exit(1);
    }
    /*客户程序填充服务端的资料*/
    bzero(&server_addr,sizeof(server_addr)); //初始化,置0
    server_addr.sin_family=AF_INET;          //IPV4
    server_addr.sin_port=htons(portnumber);  //将本机上的short数据转化为网络上的short数据
    server_addr.sin_addr=*((struct in_addr *)host->h_addr); //IP地址


    /*客户程序发起连接请求*/
    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);


    return 0;

}


0 0