8.28号作业

1.TCP服务端

#include
#include       //错误码的头文件
#include  
#include
#include       //open的头文件
#include      //close\sleep的头文件
#include      //str系列函数头文件
#include        //数学头文件  
#include      //标准库文件       
#include        //时间头文件
#include      //目录头文件
#include
#include
#include   //无名信号头文件
#include      //信号头文件
#include     //进程间通信头文件
#include     //消息头文件
#include     //共享内存的头文件
#include     //信号灯集的头文件
#include  //套接字头文件
#include  //ip转换头文件
#include   //ip转换头文件
#define ERR_MSG(msg) do {\
    printf("%d\n",__LINE__);\
    perror("socket");\
}while(0);
#define PORT 8888
#define IP "192.168.114.5"
int main(int argc, const char *argv[])
{
    //创建流式套接字socket
    int sfd=socket(AF_INET,SOCK_STREAM,0);
        if(sfd<0)
        {
            ERR_MSG("socket");
            return -1;
        }
    printf("socket create success sdf=%d\n",sfd);
      //允许端口快速的被复用
    int reuse = 1;                                                            
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }
    printf("允许端口快速的被复用成功\n");
    
    //填充地址信息结构体给bind函数绑定
    //真实的地址信息结构体根据地址组指定 AF_INET:man 7 ip
    struct sockaddr_in sin;
    sin.sin_family =AF_INET;     //必须填AF_INET;
    sin.sin_port =htons(PORT);   //端口号的网络字节序
    sin.sin_addr.s_addr = inet_addr(IP);//本机IP
    //绑定服务器的地址信息-->必须绑定bind
    if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
    {
        ERR_MSG("bind");
        return -1;
    }
    //将套接字设置为被动监听状态listen
    if(listen(sfd,128)<0)
    {
        ERR_MSG("listen");
        return -1;
    
    }
    printf("listen seccess\n");
    int newfd=-1;                  //存储客户端的地址信息
    struct sockaddr_in cin;        //真实的地址信息结构体的大小
    socklen_t addrlen = sizeof(cin);
    //获取一个已经完成的客户端信息,生成一个新的文件描述符accept
    newfd=accept(sfd,(struct sockaddr*)&cin,&addrlen);
    if(newfd<0)
    {
        ERR_MSG("newfd");
        return -1;
    }
    printf("[%s:%d]客户端;连接成功 newfd=%d\n",\
            inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);
    char buf[128];
    ssize_t res = 0;
    while(1)
    {    
    //接受
    bzero(buf,sizeof(buf));
    res=recv(newfd,buf,sizeof(buf),0);
    if(res<0)
    {
        ERR_MSG("recv");
        return -1;
    }else if(0==res)
    {
    printf("[%s:%d]客户端;连接下线 newfd=%d\n",\
            inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);
    break;    
    }
    printf("[%s:%d] newfd=%d:%s\n",\
            inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,buf);
    //发送
    strcat(buf,"*_*");
    if(send(newfd,buf,sizeof(buf),0)<0)
    {
        ERR_MSG("send");
        return -1;
    }
    printf("send success\n");
    }
    //关闭文件描述符
    close(newfd);
    if (close(sfd)<0)
    {
        ERR_MSG("close");
    }
    return 0;
}
TCP客户端

#include
#include       //错误码的头文件
#include  
#include
#include       //open的头文件
#include      //close\sleep的头文件
#include      //str系列函数头文件
#include        //数学头文件  
#include      //标准库文件       
#include        //时间头文件
#include      //目录头文件
#include
#include
#include   //无名信号头文件
#include      //信号头文件
#include     //进程间通信头文件
#include     //消息头文件
#include     //共享内存的头文件
#include     //信号灯集的头文件
#include  //套接字头文件
#include  //ip转换头文件
#include   //ip转换头文件
#define ERR_MSG(msg) do {\
    printf("%d\n",__LINE__);\
    perror("socket");\
}while(0);
#define PORT 8888
#define IP "192.168.114.5"
int main(int argc, const char *argv[])
{
    //创建流式套接字socket
    int cfd=socket(AF_INET,SOCK_STREAM,0);
        if(cfd<0)
        {
            ERR_MSG("socket");
            return -1;
        }
    printf("socket create success cdf=%d\n",cfd);
      //允许端口快速的被复用
    //绑定客户端的地址信息-->非必须绑定
    //当不手动绑定时,操作系统会自动给客户端绑定本机IP和随机端口
    //填充地址信息结构体给bind函数绑定
    //真实的地址信息结构体根据地址组指定 AF_INET:man 7 ip
    struct sockaddr_in sin;
    sin.sin_family =AF_INET;     //必须填AF_INET;
    sin.sin_port =htons(PORT);   //服务器绑定的端口号
    sin.sin_addr.s_addr = inet_addr(IP);//服务器绑定的IP
    //连接指定服务器connect
    if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))<0)
    {
        ERR_MSG("connect");
        return -1;
    
    }
    printf("connect success");
    char buf[128];
    ssize_t res = 0;
    while(1)
    {
        bzero(buf,sizeof(buf));
        printf("请输入>>>");
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf)-1]=0;
        //发送
        if(send(cfd,buf,sizeof(buf),0)<0)
        {
            ERR_MSG("send");
            return -1;
        }
        printf("send success");
        bzero(buf,sizeof(buf));
        //接收
        res=recv(cfd,buf,sizeof(buf),0);
            if(res<0)
            {
                ERR_MSG("recv");
                return -1;
            }else if(0==res)
            {
                printf("服务器下线 cfd=%d\n",cfd);
                break;
            }
        printf("cfd=%d : %s\n",cfd,buf);
    }    
    //关闭文件描述符
    if (close(cfd)<0)
    {
        ERR_MSG("close");
    }
    return 0;
}
2.UDP服务端

#include
#include       //错误码的头文件
#include  
#include
#include       //open的头文件
#include      //close\sleep的头文件
#include      //str系列函数头文件
#include        //数学头文件  
#include      //标准库文件       
#include        //时间头文件
#include      //目录头文件
#include
#include
#include   //无名信号头文件
#include      //信号头文件
#include     //进程间通信头文件
#include     //消息头文件
#include     //共享内存的头文件
#include     //信号灯集的头文件
#include  //套接字头文件
#include  //ip转换头文件
#include   //ip转换头文件
#define ERR_MSG(msg) do {\
    printf("%d\n",__LINE__);\
    perror("socket");\
}while(0);
#define PORT 5250
#define IP "192.168.114.5"
int main(int argc, const char *argv[])
{
    //创建流式套接字socket
    int sfd=socket(AF_INET,SOCK_DGRAM,0);
        if(sfd<0)
        {
            ERR_MSG("socket");
            return -1;
        }
    printf("socket create success sdf=%d\n",sfd);
    //填充服务器的地址信息结构体,给bind函数使用
    //真实的地址信息结构体根据地址组指定,AF_INIT: man 7 IP;
    struct sockaddr_in sin;
    sin.sin_family   = AF_INET;  // 必须填AF_INIT;
    sin.sin_port     = htons(PORT); //端口号的网络字节序
    sin.sin_addr.s_addr = inet_addr(IP); //本机IP,ifconfig
    if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
    {
        ERR_MSG("bind");
        return -1;
    }
    printf("bind success\n");
    char buf[128];
    struct sockaddr_in cin;
    socklen_t addrlen=sizeof(cin);
    while(1)
    {
        bzero(buf,sizeof(cin));
        if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen)<0)
        {
            ERR_MSG("recv");
            return -1;
        }
        printf("[%s:%d] : %s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
        strcat(buf,"*_*");
        if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeof(cin))<0)
        {
            ERR_MSG("sendto");
            return -1;
        }
        printf("sendto success\n");
    }
    close(sfd);

    return 0;
}
UDP客户端

#include
#include       //错误码的头文件
#include  
#include
#include       //open的头文件
#include      //close\sleep的头文件
#include      //str系列函数头文件
#include        //数学头文件  
#include      //标准库文件       
#include        //时间头文件
#include      //目录头文件
#include
#include
#include   //无名信号头文件
#include      //信号头文件
#include     //进程间通信头文件
#include     //消息头文件
#include     //共享内存的头文件
#include     //信号灯集的头文件
#include  //套接字头文件
#include  //ip转换头文件
#include   //ip转换头文件
#define ERR_MSG(msg) do {\
    printf("%d\n",__LINE__);\
    perror("socket");\
}while(0);
#define PORT 5250
#define IP "192.168.114.5"
int main(int argc, const char *argv[])
{
    //创建报试套接字socket
    int cfd=socket(AF_INET,SOCK_DGRAM,0);
        if(cfd<0)
        {
            ERR_MSG("socket");
            return -1;
        }
    printf("socket create success cdf=%d\n",cfd);
    //填充服务器的地址信息结构体,给bind函数使用
    //真实的地址信息结构体根据地址组指定,AF_INIT: man 7 IP;
    struct sockaddr_in sin;
    sin.sin_family   = AF_INET;  // 必须填AF_INIT;
    sin.sin_port     = htons(PORT); //端口号的网络字节序
    sin.sin_addr.s_addr = inet_addr(IP); //本机IP,ifconfig
    char buf[128];
    struct sockaddr_in cin;
    socklen_t addrlen=sizeof(cin);
    while(1)
    {
        printf("请输入--->");
        bzero(buf,sizeof(buf));//memset也行,清空数组
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf)-1]=0;
        if(sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin))<0)
        {
            ERR_MSG("sendto");
            return -1;
        }
        printf("sendto success\n");
        bzero(buf,sizeof(cin));
        if (recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen)<0)
        {
            ERR_MSG("recv");
            return -1;
        }
        printf("[%s:%d] : %s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
    }
    
    if(close(cfd)<0)
    {
        ERR_MSG("close");
        return -1;
    }

    return 0;
}
 

你可能感兴趣的:(网络协议)