tcp/ip程序

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<sys/wait.h>      //*进程用的头文件*/
#include<netinet/in.h>
#include<arpa/inet.h>

 #define MAXLINE  50  //通信内容的最大长度
int main()
{
    int sock_fd,new_fd;//sock_fd用于监听,new_fd用于连接
    struct sockaddr_in srv_addr;//服务器的地址信息
    struct sockaddr_in client_addr;//客户机的地址信息
    int size; //地址结构数据的长度
    pid_t  pid;  //子进程id
    ssize_t n;
    char buf[MAXLINE]; //用于存放通信的内容

    /*创建套接字*/
    sock_fd=socket(AF_INET,SOCK_STREAM,0);//采用IPv4协议
    if(sock_fd==-1)
    {
        perror("creat socket failed");
        exit(1);
    }

    /*服务器地址参数*/
    srv_addr.sin_family=AF_INET;
    srv_addr.sin_port=htons(3490);
    srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    bzero(&srv_addr.sin_zero,sizeof(struct sockaddr_in));//bzero位清零函数,将sin_zero清零,sin_zero为填充字段,必须全部为零

    int on=1; //表示开启reuseaddr
    if(setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))<0)  //打开地址、端口重用
        perror("setsockopt");

    /*绑定地址和端口*/
    if(bind(sock_fd,(struct sockaddr*)&srv_addr,sizeof(struct sockaddr))==-1)
    {
        perror("bind failed");
        exit(1);
    }

    /*连接到服务器
    if(connect(sock_fd,(struct sockaddr*)&srv_addr,sizeof(sock_fd))==-1)
    {
        perror("bind failed");
        exit(1);
    }*/

    /*设置监听模式,等待客户机的监听*/
    if((listen(sock_fd,5))==-1)
    {
        perror("listen failed");
        exit(1);
    }

    /*接受连接,采用非阻塞是的模式调用accep*/
    while(1)
    {
        size=sizeof(struct sockaddr_in);
        new_fd=accept(sock_fd,(struct sockaddr*)&client_addr,&size);
        if(new_fd==-1)
        {
            perror("accept failed");
            continue;//restart accept when EINTR
        }

        printf("server:got connection from IP= %s prot= %d \n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));//连接成功,打印客户机IP地址和端口号
        /*char *inet_nota(struct sockaddr_in in);
        头文件:
        arpa/inet.h
        Winsock2.h
        参数:
        一个网络上的IP地址
        返回值:
          如果正确,返回一个字符指针,指向一块存储着点分格式IP地址的静态缓冲区(同一线程内共享此内存);错误,返回NULL。
        uint31_t ntohs(uint32_t net32bitvalue);
        头文件:
        #include<netinet/in.h>
        把net32bitvalue有网络字节序转换为主机字节序。
        */
            if(send(new_fd,"Hello client,I am 192.168.229.125!\n",50,0)==-1)  //192.168.229.125为子进程IP,可更改
                           perror("send failed");

        pid=fork();  //父进程建立套接字的连接之后,创建子进程用于通信
        if(!pid)//创建新的子进程
        {
           // if(send(new_fd,"Hello client,I am 192.168.229.125!\n",50,0)==-1)  //192.168.229.125为子进程IP,可更改
              // perror("send failed");
            close(sock_fd);//子进程不需要监听,所以子进程关闭监听套接字
            while(1)
        {
                memset(buf,0,sizeof(buf));
             n=read(new_fd,buf,MAXLINE);
            if(n==0)
               break;
            write(new_fd,buf,n);
            fputs(buf,stdout);
            if(n<0)
               perror("read from client error");
           // exit(EXIT_SUCCESS);
                }
        exit(EXIT_SUCCESS);
        }
        else
            close(new_fd);//父进程不需要连接,所以关闭连接套接字

        //while(waitpid(-1,NULL,WNOHANG)>0);//等待子进程结束,进行新的连接
    }
}

服务器程序

支持服务器重启,并发服务器

客户机程序

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<sys/wait.h>      //*进程用的头文件*/
#include<netinet/in.h>
#include<arpa/inet.h>

#define MAXBYTEMUN   100
int main(int argc,char *argv[])
{
    int sock_fd,numbytes;
    char buf[MAXBYTEMUN];
    struct hostent *he;
    struct sockaddr_in client_addr;//客户机的地址信息

    if(argc!=2)
    {
        fprintf(stderr,"usage: client IPAddress\n");   //执行客户端程序时,输入客户端程序名称和其IP地址
        exit(1);
    }

    /*创建套接字*/
    sock_fd=socket(AF_INET,SOCK_STREAM,0);//采用IPv4协议
    if(sock_fd==-1)
    {
        perror("creat socket failed");
        exit(1);
    }

    /*服务器地址参数*/
    client_addr.sin_family=AF_INET;
    client_addr.sin_port=htons(3490);
    client_addr.sin_addr.s_addr=inet_addr(argv[1]);
    bzero(&client_addr.sin_zero,sizeof(struct sockaddr_in));//bzero位清零函数,将sin_zero清零,sin_zero为填充字段,必须全部为零

    /*连接到服务器*/
    if(connect(sock_fd,(struct sockaddr*)&client_addr,sizeof(struct sockaddr))==-1)
    {
        perror("connect failed");
        exit(1);
    }
            if((numbytes=recv(sock_fd,buf,MAXBYTEMUN,0))==-1)
                 {
                   perror("receive failed");
                   exit(1);
                 }
                 buf[numbytes]=‘\0‘;//在字符串末尾加上\0,否则字符串无法输出
                 printf("Received: %s\n",buf);

    while(fgets(buf,MAXBYTEMUN,stdin)!=NULL)
    {
           /* if((numbytes=recv(sock_fd,buf,MAXBTYEMUN,0))==-1)
                {
                      perror("receive failed");
                   exit(1);
                }
                buf[numbytes]=‘\0‘;//在字符串末尾加上\0,否则字符串无法输出
                printf("Received: %s\n",buf);
               // close(sock_fd);*/
        write(sock_fd,buf,strlen(buf));
        if(read(sock_fd,buf,MAXBYTEMUN)==0)
            perror("client: server terminated prematurely");
        fputs(buf,stdout);
    }

    /*接受数据
    if((numbytes=recv(sock_fd,buf,MAXBTYEMUN,0))==-1)
    {
        perror("receive failed");
        exit(1);
    }

    buf[numbytes]=‘\0‘;//在字符串末尾加上\0,否则字符串无法输出
    printf("Received: %s\n",buf);
    close(sock_fd);*/
    return 0;
}

参考:

http://blog.chinaunix.net/uid-26220063-id-3027117.html

http://blog.csdn.net/whuslei/article/details/6667471/

http://blog.chinaunix.net/uid-24517549-id-4044883.html

时间: 2024-10-09 18:55:40

tcp/ip程序的相关文章

TCP/IP之四书五经[转自2003.12程序员]

TCP/IP协议是当前广域网和局域网通用的网络协议,因此,基于TCP/IP的编程就格外重要.从应用上来说,现在直接利用C层次Socket API进行TCP/IP编程的人确实越来越少了,各种现成的框架(如ACE.Java..NET FCL)和控件(如IP*Works)大大简化了TCP/IP编程的难度.但是,如果想要在这个领域达到融会贯通的地步,不打下坚实的基础是不可想象的.正如Richard Stevens在TCP/IP Illustrated中所说,在网络编程领域,开发者所遇到的实际问题中,大约

关于TCP/IP [本文发表于《程序员》杂志2003年第12期,作者孟岩]

基于TCP/IP的编程格外重要.从应用上来说,现在直接利用C层次Socket API进行TCP/IP编程的人确实越来越少了,各种现成的框架(如ACE.Java..NET FCL)和控件(如IP*Works)大大简化了TCP/IP编程的难度.高层的框架和控件总结了TCP/IP的主要使用模式,并且进行了抽象和封装,这固然非常好,但是想要真正掌握TCP/IP网络编程的真谛,恐怕需要认真学习下面几本著作. [ 查看本指南所提及的书籍 ] [本文发表于<程序员>杂志2003年第12期,作者孟岩] TCP

TCP/IP的经典网络编程

                                                                         TCP/IP网络编程之四书五经                                                                                                                             孟岩 TCP/IP协议是眼下广域网和局域网通用的网络协议.因此.基于TCP

【程序猿笔试面试复习】之中的一个 网络与通信篇(一) 几大网络模型:OSI、TCP/IP、B/S与C/S、MVC结构

9.1网络模型 9.1.1. OSI七层模型 OSI(Open System Interconnection,开放系统互联)七层网络模型称为开放式网络互联參考模型.其为国际标准组织指定的一个指导信息互联.互通和协作的网络规范. 开放是指仅仅要遵循OSI标准,位于世界上不论什么地方的不论什么系统之间都能够进行通信,开放系统是指遵循互联协议的实际系统,如电话系统. 从逻辑上能够将OSI开放系统互联分为七层模型,由下至上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 当中.上三层称

支持嵌入式的TCP/IP协议可加载到用户的应用程序的条码控件TConnector

TConnector ActiveX条码控件可加载到用户的应用程序或MS-IE.VB.VC++.Excel.Access.WinWord.Delphi等应用程序中,用户可以在几分钟内连接任意设备(如一个条形码阅读器的加载时间). 产品特征: 支持嵌入式的TCP/IP协议,简化企业级网络应用. 标准的应用程序接口只需调用5个函数就可支持串行接口(读/写),并行接口(写),企业网(TCP/IP)读/写,空设备和文件IO读/写. TConnector主要是为了数据采集而开发的,但是由于其设计的灵活性,

tcp/ip通信第5期之服务器端程序

1 /* 2 此程序是tcp/ip通信服务器端程序,测试运行在redhat5上 3 重构readline函数,解决粘包问题——利用“\n”识别一个消息边界 4 */ 5 6 #include<stdio.h> 7 #include<netinet/in.h> 8 #include<arpa/inet.h> 9 #include<unistd.h> 10 #include<fcntl.h> 11 #include<sys/types.h>

tcp/ip通信第5期之客户机端程序

1 /*此程序是tcp/ip通信的客户机端程序, 2 测试运行在redhat6系统上 3 重构readline函数,解决粘包问题——利用“\n”识别一个消息边界 4 */ 5 #include<stdio.h> 6 #include<stdlib.h> 7 #include<unistd.h> 8 #include<sys/types.h> 9 #include<sys/socket.h> 10 #include<arpa/inet.h&g

【程序员笔试面试复习】之一 网络与通信篇(一) 几大网络模型:OSI、TCP/IP、B/S与C/S、MVC结构

9.1网络模型 9.1.1. OSI七层模型 OSI(Open System Interconnection,开放系统互联)七层网络模型称为开放式网络互联参考模型.其为国际标准组织指定的一个指导信息互联.互通和协作的网络规范. 开放是指只要遵循OSI标准,位于世界上任何地方的任何系统之间都可以进行通信,开放系统是指遵循互联协议的实际系统,如电话系统. 从逻辑上可以将OSI开放系统互联分为七层模型,由下至上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中,上三层称为高层,用

TCP/IP详解 卷一(第七、八章 Ping、Traceroute程序)

Ping程序 Ping程序由Mike Muuss编写,目的是为了测试另一台主机是否可达. 该程序发送一份ICMP回显请求报文给主句,并等待返回ICMP回显应答. ping程序还能测出到这台主机的往返时间 Traceroute程序 Traceroute程序是一个能更深入探索TCP/IP协议的方便可用的工具 Traceroute程序可以让我们看到IP数据报从一台主机传到另一台主机所经过的路由. 下图是书本的一个例子