基于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
- 基于scoket通信的简单客户端—服务器通信程序
- 简单的客户端服务器通信程序
- 简单的客户端和服务器通信程序
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- Linux基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- Linux基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- 基于TCPClient的客户端服务器的简单通信demo
- 玩转cpu topology
- CAN 报文信号编码规则 intel & motorola
- 【Unity】Unity物体上下反复漂浮效果
- 内存简介
- STL源码剖析 [特殊的空间配置器](内存配置stl_alloc.h)
- 基于scoket通信的简单客户端—服务器通信程序
- getsockname()(cp:http://wiki.gimoo.net/view/11495.html)
- 链表排序问题
- tomcat web.xml配置详解
- MapReduce
- 执行上下文
- reveal
- 生命不易
- 关于图片的处理的一些收集