进程间通信—Socket编程

来源:互联网 发布:2016网络大电影排行 编辑:程序博客网 时间:2024/06/15 12:57

linux下Socket编程的原理大家参考下面这篇博客:

http://blog.csdn.net/xiaoweige207/article/details/6211577


我就不多介绍了,下面这是一个小例子。

客户端代码:

#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netdb.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <sys/wait.h>#include <sys/stat.h>int main(){int fd,ret;char buff[1024]={0};struct sockaddr_in servaddr;fd=socket(AF_INET,SOCK_STREAM,0);if(fd<0){perror("opening socket error");return -1;}memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family=AF_INET;if(inet_pton(AF_INET,"192.168.7.92",&servaddr.sin_addr.s_addr)<=0){perror("IP error");return -2;}servaddr.sin_port=9000;ret=connect(fd,(struct sockaddr *)&servaddr,sizeof(servaddr));if(ret < 0){perror("connecting error");goto failed;}while(1){printf("All ready,please enter the message....\n");memset(buff,0,sizeof(buff));if(fgets(buff,sizeof(buff)-1,stdin) == NULL){perror("input error");break;}ret=write(fd,buff,strlen(buff));if(ret < 0){perror("write to socket error");break;}if((ret=read(fd,buff,sizeof(buff)-1))<0){perror("reading error");break;}if(ret == 0){printf("Server disconnect...\n");break;}printf("The message is:%s",buff);}failed:close(fd);return 0;}

服务器端:

#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netdb.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <sys/wait.h>#include <sys/stat.h>int main(){int fd,ret;char buff[1024]={0};struct sockaddr_in servaddr,clivaddr;int len=sizeof(clivaddr);fd=socket(AF_INET,SOCK_STREAM,0);if(fd<0){perror("opening socket error");return -1;}memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family=AF_INET;if(inet_pton(AF_INET,"192.168.7.92",&servaddr.sin_addr.s_addr)<=0){perror("IP error");return -2;}servaddr.sin_port=9000;ret=bind(fd,(struct sockaddr *)&servaddr,sizeof(servaddr));if(ret < 0 ){perror("binding error");goto failed;}if((ret=listen(fd,10) != 0)){perror("listening error");goto failed;}int nsock;while(1){nsock=accept(fd,(struct sockaddr *)&clivaddr,&len);if(nsock < 0){perror("accept");break;}else{printf("socket service starting...\n");}//ret=connect(fd,(struct sockaddr *)&servaddr,sizeof(servaddr));pid_t pid;pid=fork();if(pid == 0){close(fd);while(1){memset(buff,0,sizeof(buff)-1);ret=read(nsock,buff,sizeof(buff)-1);if(ret < 0){perror("reading error\n");return -1;}ret=write(nsock,buff,strlen(buff));if(ret < 0){perror("write error\n");return -2;}}close(nsock);exit(0);}close(nsock);}failed:close(fd);return 0;}

运行时,首先运行服务器,

在客户端从键盘中循环读入数据,然后回车输出,

由于我用了fork()创建了子进程来处理接受的数据,所以就成了一个一个服务器对多个客户端,

可以同时运行多个服务器来发送数据。

程序运行结果:


我运行了两个客户端,可以同时收发数据。



原创粉丝点击