基于scoket通信的简单客户端—服务器通信程序

来源:互联网 发布:多线程编程c 编辑:程序博客网 时间:2024/05/23 21:47

      在阅读了上一篇基本套接字变成后,采用socket通信机制,参考网上的例子写了一个客户端-服务器通信程序,该程序实现了服务器向客户端发送“Hello world!”,客户端将从客户端接收的字符串反转然后在发送给服务器。网上得参考程序一些小的错误,导致程序无法运行。服务器端采用127.0.0.1为地址,以便能够在同一台主机上测试。

错误一:出现Segmentation fault (core dumped)错误,原因是没有为套接字地址分配存储空间,添加memset进行空间分配后错误得以解决

错误二:server从客户端只能接受到4个字符,原因在于client在fwrite过程中没有设定好传输的字节大小。


源代码如下所示:

server.c

#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <sys/wait.h>#define serverport 2222#define maxlen 10int main(){    FILE *fp;    int sockfd,client_fd;    int sin_size;//length of address    struct sockaddr_in server_addr;    memset(&server_addr,0,sizeof(server_addr));    struct sockaddr_in client_addr;    memset(&client_addr,0,sizeof(client_addr));    char msg[]={"Hello world!"};    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)    {        perror("socket create error!");        exit(1);    }    server_addr.sin_family=AF_INET;    server_addr.sin_port=htons(serverport);    inet_aton("127.0.0.1",server_addr.sin_addr.s_addr);    bzero(&(server_addr.sin_zero),8);    if(bind(sockfd,(const struct sockaddr *)&server_addr,sizeof(struct sockaddr))==-1)    {        perror("bind error!");        exit(1);    }    if(listen(sockfd,maxlen)==-1)    {          perror("listen error!\n");        exit(1);    }    while(1)    {        sin_size=sizeof(struct sockaddr_in);        if((client_fd=accept(sockfd,(struct sockaddr*)&client_addr,&sin_size))==-1)        {             perror("accept error!\n");             continue;        }        printf("received a connection from %s\n",inet_ntoa(client_addr.sin_addr.s_addr));        if(fork()==0)        {            char buffer[1024];            if(write(client_fd,msg,strlen(msg))==-1)                perror("send error!\n");            if(read(client_fd,buffer,1024)==-1)                perror("read error!\n");            if((fp=fopen("s_backup.c","ab"))==NULL)            {                printf("cannot open/create a file!");                exit(0);            }            fwrite(msg,strlen(buffer),1,fp);            printf("the massage received from the client:%s\n",buffer);            exit(0);            fclose(fp);       }       close(client_fd);    }    close(sockfd);    return 0;}

client.c

#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#define servport 2222#define maxdatasize 1024int reverse(char msg[],int len){    int begin=0;    int end=len-1;    char temp;    while((begin+1)<=end)    {        temp=msg[begin];        msg[begin]=msg[end];        msg[end]=temp;        begin++;        end--;    }    msg[len]='\0';    return 0;}int main(){    FILE *fp;    int sockfd=0;    int recvbytes=0;    char *buf=(char*)malloc(sizeof(char)*maxdatasize);    struct sockaddr_in serv_addr;    //int reverse(char a[],int len);    memset(&serv_addr,0,sizeof(serv_addr));    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)    {        perror("socket create error!");        exit(1);    }    serv_addr.sin_family=AF_INET;    serv_addr.sin_port=htons(servport);    inet_aton("127.0.0.1",serv_addr.sin_addr.s_addr);    bzero(&(serv_addr.sin_zero),8);    if(connect(sockfd,(struct sockaddr *)(&serv_addr),sizeof(struct sockaddr))==-1)    {       perror("connect error!");       exit(1);    }    if((recvbytes=read(sockfd,buf,30))==-1)    {        perror("read error!");        exit(1);    }    buf[recvbytes]='\0';    printf("the massage received from the server :%s\n",buf);    if((fp=fopen("c_backuo.txt","ab"))==NULL)    {        printf("cannot open/create a file!");        exit(0);    }    fwrite(buf,strlen(buf),1,fp);    reverse(buf,strlen(buf));    if(write(sockfd,buf,strlen(buf))==-1)    {        perror("sending failed!\n");        exit(1);    }    close(sockfd);    fclose(fp);    return 0;}

调试方法:

首先打开一个运行终端,编译运行上述的服务器程序,然后再打开一个运行终端,编译运行上述的客户端程序。此处给出运行结果

服务器的结果如下


客户端的结果如下


0 0
原创粉丝点击