一个基于UDP的回显C/S(二)

来源:互联网 发布:宁夏干部网络培训平台 编辑:程序博客网 时间:2024/06/05 15:14

解决问题:通过connect,使服务器端意外崩溃,重启,客户端能通过read函数而得知

服务器端代码:

vi s4.c

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <arpa/inet.h>#include <errno.h>#include <string.h>#define SERV_PORT 9877#define MAXLINE 4096void server(int sockfd,struct sockaddr* servaddr,size_t len){    char buf[MAXLINE];    int n;    socklen_t  servlen = len;    for (; ;)    {    if ((n = recvfrom(sockfd,buf,MAXLINE,0,servaddr,&servlen)) < 0)    {        printf("recvfrom: %s\n",strerror(errno));        exit(1);    }    if (sendto(sockfd,buf,n,0,(struct sockaddr*)servaddr,servlen) != n)    {        printf("sendto %s\n",strerror(errno));        exit(1);    }    }}int main(){    int sockfd;    if ((sockfd = socket(AF_INET,SOCK_DGRAM,0)) < 0)    {    printf("socket: %s\n",strerror(errno));    exit(1);    }    struct sockaddr_in servaddr;    bzero(&servaddr,sizeof(servaddr));    servaddr.sin_family = AF_INET;    servaddr.sin_port = htons(SERV_PORT);    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);    if (bind(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) < 0)    {    printf("bind %s\n",strerror(errno));    exit(1);    }    server(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));    return 0;}

客户端代码:

vi c5.c

#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <unistd.h>#include <arpa/inet.h>#include <errno.h>#include <string.h>#define MAXLINE 4096#define SERV_PORT 9877void client(FILE *fp,int sockfd){    char buf[MAXLINE];    int n;    int fd = fileno(fp);    while (1)    {    if ((n = read(STDIN_FILENO,buf,MAXLINE)) < 0)    {        printf("read %s\n",strerror(errno));        exit(1);    }    if (write(sockfd,buf,n) != n)    {        printf("write %s\n",strerror(errno));        exit(1);    }    if ((n = read(sockfd,buf,MAXLINE)) < 0)    {        printf("read %s\n",strerror(errno));        exit(1);    }    if (write(fd,buf,n) != n)    {        printf("read %s\n",strerror(errno));        exit(1);    }    }}int main(int argc,char** argv){    if (argc != 2)    {    printf("add <ipadress\n");    exit(1);    }    int sockfd;    if ((sockfd = socket(AF_INET,SOCK_DGRAM,0)) < 0)    {    printf("socket: %s\n",strerror(errno));    exit(1);    }    struct sockaddr_in servaddr;    bzero(&servaddr,sizeof(servaddr));    servaddr.sin_family = AF_INET;    servaddr.sin_port = htons(SERV_PORT);    if (inet_pton(AF_INET,argv[1],&servaddr.sin_addr) < 0)    {    printf("inet_pton %s\n",strerror(errno));    exit(1);    }    if (connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) < 0)    {    printf("connect: %s\n",strerror(errno));    exit(1);    }    client(stdout,sockfd);    return 0;}

第二次键入时,服务器端进程已经终止
这里写图片描述

原创粉丝点击