RST_FIN

FIN RST

server.c

#include <sys/socket.h>
#include <netdb.h>
#include <sys/types.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>//inet_ntop,没有头文件编译过得去,但是运行出错
#include <stdio.h>
//#include <strings.h>
#include <unistd.h>//fork
#include <sys/wait.h>

int main()
{
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if (sockfd < 0)
    {
        perror("create socket error");
    }

    struct sockaddr_in server_sock_addr;
    bzero(&server_sock_addr,sizeof(struct sockaddr_in));
    server_sock_addr.sin_family = AF_INET;
    server_sock_addr.sin_port = htons(12345);
    inet_pton(AF_INET,"127.0.0.1",(char *)&server_sock_addr.sin_addr);
    int ret = bind(sockfd,(struct sockaddr *) &server_sock_addr,sizeof(server_sock_addr));
    if(ret < 0)
        perror("bind error");

    ret = listen(sockfd,1);
    if(ret < 0)
        perror("listen error");

    struct sockaddr_in client_sock_addr ;
    int len;
    int client_fd;
    client_fd = accept(sockfd,(struct sockaddr *) &client_sock_addr,&len);
    if( client_fd < 0)
        perror("accpet error");
    char content [5];
    char msg[100] = "cwd";
    while(1)
    {
        int n = read(client_fd,content,sizeof(content));
        if(n == 0)//n == 0表示对方发送了FIN,发生在接受RST之前,若是在接受RST之后,则erron为ECONNRESET,阻塞情况下返回值只有>0和<0,
        {
            printf("read %d byte\n",n);
            int len = write(client_fd,msg,100);//引起对方发送RST
            printf("write %d byte ok\n",len);//client已经关闭,但是发送扔能成功,但是发送了字节是100
            len = read(client_fd,content,sizeof(content));//读到RST 
            printf("recv %d byte after recv RST\n",len);
            len = write(client_fd,msg,100);//对于接收到RST的进程再次写则收到sigpipe信号,默认行为是终止进程
            if(len < 0)
            {
                perror("read error");
            }
            break;
        }
        else
        {
            content[n] = '\0';
            printf("recv content is %s\n",content);
        }
    }

    /*
     * getpeername
     * getsockname
    printf("%d\n",client_fd);
    struct sockaddr_in sockaddrtmp;
    int length = sizeof(struct sockaddr_in);
    ret = getsockname(client_fd,(struct sockaddr *)&sockaddrtmp,&length);
    if(ret == -1)
        perror("getsockname error");
    printf("server port = %d\n",htons(sockaddrtmp.sin_port));//网络字节序
    printf("server family = %d\n",sockaddrtmp.sin_family);
    char addr[16];
    char *ptr;
    ptr = inet_ntop(AF_INET,(const void *)&sockaddrtmp.sin_addr,addr,16);//网络字节序 
    printf("server addr = %s\n",ptr);
    //printf("address = %s\n",inet_ntoa(sockaddrtmp.sin_addr));
    struct sockaddr_in  peer_sock;
    length = sizeof(peer_sock);
    ret = getpeername(client_fd,(struct sockaddr*)&peer_sock,&length);
    if(ret == -1)
        perror("getpeername error");
    printf("peer port = %d\n",htons(peer_sock.sin_port));//网络字节序
    printf("peer family = %d\n",peer_sock.sin_family);
    printf("peer address = %s\n",inet_ntop(AF_INET,&peer_sock.sin_addr,addr,16));

     */
    return 0;
}

client.c

#include <sys/socket.h>
#include <netdb.h>
#include <sys/types.h>
#include <stdio.h>
//#include <arpa/inet.h>//

int main()
{
    int fd = socket(AF_INET,SOCK_STREAM,0);
    if(fd < 0)
        perror("socket error");
    struct sockaddr_in server_sock_addr;
    server_sock_addr.sin_family = AF_INET;
    server_sock_addr.sin_port = htons(12345);
    inet_pton(AF_INET,"127.0.0.1",&server_sock_addr.sin_addr);
    /*
    int ret = bind(fd, (struct sockaddr*)&server_sock_addr, sizeof(client_sock_addr));
    if(ret < 0)
        perror("bind error");
    */
    int ret = connect(fd,(struct sockaddr*)&server_sock_addr,sizeof(server_sock_addr));
    if(ret < 0)
        perror("connect error");
    else printf("connect ok\n");
    /*
     * getpeername
     * getsockname
    struct sockaddr_in peer_sock,client_sock;
    int len = sizeof(peer_sock);
    ret = getpeername(fd,(struct sockaddr*)&peer_sock,&len);
    if(ret == -1)
        perror("getpeername error");
    char addr[16];
    printf("peer port  = %d\n",peer_sock.sin_port);
    printf("peer family = %d\n",peer_sock.sin_family);
    char * result = inet_ntop(AF_INET,&peer_sock.sin_addr,addr,16);

    if(result == NULL)
        perror("inet_ntop error");
    printf("peer address %s\n",result);

    len = sizeof(client_sock);
    ret=getsockname(fd,(struct sockaddr*)&client_sock,&len);
    if(ret == -1)
        perror("getsockname error");
    printf("client port  = %d\n",client_sock.sin_port);
    printf("client family = %d\n",client_sock.sin_family);
    printf("client address %s\n",inet_ntop(AF_INET,&client_sock.sin_addr,addr,16));
    */

    char msg[] = "hellor world";
    int n = write(fd,msg,strlen(msg));
    printf("send %d byte \n",n);
    close(fd);
    return 0;
}

FIN 关闭socket fd 则发送一个FIN
RST
SIGPIPE 当一个进程向某个已收到RST的套接字执行写操作时,内核向该进程发送一个SIGPIPE信号,该信号的默认行为是终止进程。
第一次写操作引发RST,第二次写操作引发SIGPIPE

代码文件一: “module seg_test( clk,rst_n,seg_sel,seg_data); input clk,rst_n; output [5:0]seg_sel; output [7:0]seg_data; wire clk_test; time_test time_test_m0(.rst_n(rst_n),.clk(clk),.en_1000hz( clk_test )); wire en_1hz; time_1hz time_1hz_m0(.rst_n(rst_n),.clk(clk),.en_1hz(en_1hz)); wire t0; wire [3:0]count0; count_m10 count10_m0(.clk(clk_test),.rst_n (rst_n),.en(en_1hz),.clr(1'b0),.data(count0),.t(t0)); wire t1; wire [3:0]count1; count_m10 count10_m1(.clk(clk_test),.rst_n (rst_n),.en(t0),.clr(1'b0),.data(count1),.t(t1)); wire t2; wire [3:0]count2; count_m10 count10_m2(.clk(clk_test),.rst_n (rst_n),.en(t1),.clr(1'b0),.data(count2),.t(t2)); wire t3; wire [3:0]count3; count_m10 count10_m3(.clk(clk_test),.rst_n (rst_n),.en(t2),.clr(1'b0),.data(count3),.t(t3)); wire t4; wire [3:0]count4; count_m10 count10_m4(.clk(clk_test),.rst_n (rst_n),.en(t3),.clr(1'b0),.data(count4),.t(t4)); wire t5; wire [3:0]count5; count_m10 count10_m5(.clk(clk_test),.rst_n (rst_n),.en(t4),.clr(1'b0),.data(count5),.t(t5)); wire[6:0] seg_data_0,seg_data_1,seg_data_2,seg_data_3,seg_data_4,seg_data_5; seg_decoder seg_decoder_m0(.bin_data(count0 ) , .seg_data(seg_data_0)); seg_decoder seg_decoder_m1(.bin_data(count1 ) , .seg_data(seg_data_1)); seg_decoder seg_decoder_m2(.bin_data(count2 ) , .seg_data(seg_data_2)); seg_decoder seg_decoder_m3(.bin_data(count3 ) , .seg_data(seg_data_3)); seg_decoder seg_decoder_m4(.bin_data(count4 ) , .seg_data(seg_data_4)); seg_decoder seg_decoder_m5(.bin_data(count5 ) , .seg_data(seg_data_5)); seg_scan seg_scan_m0(.clk(clk ),.rst_n(rst_n), .seg_data_0( seg_data_0),.seg_data_1( seg_data_1),.seg_data_2(seg_data_2),.seg_data_3(seg_data_3),.seg_data_4(seg_data_4),.seg_data_5(seg_data_5), .seg_sel(seg_sel),.seg_data(seg_data)); endmodule” 代码文件二: “module seg_decoder ( bin_data,seg_data); input [3:0] bin_data; output reg [6:0] seg_data; always@(*) begin case(bin_data) 4'd0:seg_data <= 7'b100_0000; 4'd1:seg_data <= 7'b111_1001; 4'd2:seg_data <= 7'b010_0100; 4'd3:seg_data <= 7'b011_0000; 4'd4:seg_data <= 7'b001_1001; 4'd5:seg_data <= 7'b001_0010; 4'd6:seg_data <= 7'b000_0010; 4'd7:seg_data <= 7'b111_1000; 4'd8:seg_data <= 7'b000_0000; 4'd9:seg_data <= 7'b001_0000; 4'ha:seg_data <= 7'b000_1000; 4'hb:seg_data <= 7'b000_0011; 4'hc:seg_data <= 7'b100_0110; 4'hd:seg_data <= 7'b010_0001; 4'he:seg_data <= 7'b000_0110; 4'hf:seg_data <= 7'b000_1110; default:seg_data <= 7'b111_1111; endcase end endmodule” 文件三: “ module seg_scan(clk,rst_n,seg_data_0,seg_data_1,seg_data_2,seg_data_3,seg_data_4,seg_data_5,seg_sel,seg_data); input clk,rst_n; output reg [5:0] seg_sel; output reg [7:0] seg_data;// ???????????? input [7:0] seg_data_0; input [7:0] seg_data_1; input [7:0] seg_data_2; input [7:0] seg_data_3; input [7:0] seg_data_4; input [7:0] seg_data_5; parameter SCAN_COUNT =50000000/(200*6)-1; reg[31:0]scan_timer; reg[3:0]scan_sel; always@(posedge clk or negedge rst_n) begin if(rst_n==1'b0) begin scan_timer<=32'd0; scan_sel<=4'd0; end else if(scan_timer==SCAN_COUNT ) begin scan_timer<=32'd0; if(scan_sel==4'd5) scan_sel<=4'd0; else scan_sel<=scan_sel+4'd1; end else scan_timer<=scan_timer+32'd1; end always@(posedge clk or negedge rst_n) begin if(rst_n==1'b0) begin seg_sel<=6'b111111; seg_data<=8'b11111111; end else begin case(scan_sel) 4'd0: begin seg_sel<=6'b111110; seg_data<=seg_data_0; end 4'd1: begin seg_sel<=6'b111101; seg_data<=seg_data_1; end 4'd2: begin seg_sel<=6'b111011; seg_data<=seg_data_2; end 4'd3: begin seg_sel<=6'b110111; seg_data<=seg_data_3; end 4'd4: begin seg_sel<=6'b101111; seg_data<=seg_data_4; end 4'd5: begin seg_sel<=6'b011111; seg_data<=seg_data_5; end default:begin seg_sel<=6'b111111; seg_data<=8'b11111111; end endcase end end endmodule ” 文件四: “//%%%% module count_m10(clk,rst_n, en,clr,data,t); input clk,rst_n,en,clr; output reg [3:0] data; output reg t; always@( posedge clk or negedge rst_n) begin if(rst_n==0) begin data<=4'd0; t<=1'd0; end else if(clr==1) begin data<=4'd0; t<=1'd0; end else if(en==1) begin if(data==4'd9) begin data<=4'd0; t<=1'd1; end else begin data<=data+4'd1;t<=1'd0; end end else t<=1'd0; end endmodule ” 文件五: “module time_1hz(rst_n,clk,en_1hz); input clk,rst_n; output en_1hz; reg en_1hz; reg [31:0]timer_cnt; always@(posedge clk or negedge rst_n) begin if(rst_n==1'b0) begin en_1hz<=1; timer_cnt<=32'd0; end else if(timer_cnt>=32'd49_999_999) begin timer_cnt<=32'd49_999_999; en_1hz<=0; end else begin en_1hz<=1; timer_cnt<=timer_cnt+32'd1; end end endmodule” 文件六: “module time_test(rst_n,clk,en_1000hz); input clk,rst_n; output en_1000hz; reg en_1000hz; reg [31:0]timer_cnt; always@(posedge clk or negedge rst_n) begin if(rst_n==1'b0) begin en_1000hz<=0; timer_cnt<=32'd0; end else if(timer_cnt>=32'd49_999) begin timer_cnt<=32'd0; en_1000hz<=1; end else begin en_1000hz<=0; timer_cnt<=timer_cnt+32'd1; end end endmodule” 对以上闸门时间为1s 的数字频率计工程代码加注释
最新发布
06-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值