利用父进程,子进程分别监控同一socket文件的读与写,感觉应该加入两进程的互斥,也就是不能在同一时间又读又写,但现在没加也可以用。可能是使用频速不高。用pipe管道置一标准位来完成互斥。我现在用小熊猫c++来编程,发现不能编译此文件。但又想用此软件的编程提示功能。所以用此软件编好文本,再用gcc 编译就ok了。
此程序不完善,最主要是用两进程分别完成同一文件的读与写的功能这个方法。当然也可以用select()的端口复用或者线程来完成。
利用两进程分别读与写,就避免了聊天时一问一答,双方可以随时对话,想说就说。
服务器:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>int main(int argc,char *argv[]){int serv_sock;int ck;struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr; socklen_t clnt_addr_size; serv_sock=socket(PF_INET,SOCK_STREAM,0);setsockopt(serv_sock,SOL_SOCKET,SO_TYPE,NULL,0);if(serv_sock==-1){puts("socket error");}memset(&serv_addr,0,sizeof(serv_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);serv_addr.sin_port=htons(3000);struct sockaddr_in *myaddr=&serv_addr; if(bind(serv_sock,(struct sockaddr*)myaddr,sizeof(serv_addr))==-1){ puts("bind error|port binding");}if(listen(serv_sock,5)==-1)puts("listen() error");printf("%s\n","listening port");clnt_addr_size=sizeof(clnt_addr);struct sockaddr_in *myclnt=&clnt_addr;ck=accept(serv_sock,(struct sockaddr*)myclnt,&clnt_addr_size);if(ck==-1) puts("accept() error");//-------------------------------------------------------------int fz[2];int zf[2];pipe(fz);pipe(zf);pid_t pid=fork();char c[10];if(pid==0){while(1){scanf("%s",c);write(ck,c,10);}}else{while(1){char o[20]={};read(ck,o,20);printf("%s\n",o);}}return 0;
}
客户端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>int main(int argc,char *argv[]){int sock;struct sockaddr_in serv_addr;sock=socket(PF_INET,SOCK_STREAM,0);if(sock==-1)puts("socket() error");memset(&serv_addr,0,sizeof(serv_addr));serv_addr.sin_family=AF_INET;serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");serv_addr.sin_port=htons(3000);struct sockaddr_in *myaddr=&serv_addr;if(connect(sock,(struct sockaddr*)myaddr,sizeof(serv_addr))==-1)puts("connect() error");int fz[2];int zf[2];pipe(fz);pipe(zf);pid_t pid=fork();char c[10];if(pid==0){while(1){scanf("%s",c);write(sock,c,10);}}else{while(1){char o[20]={};read(sock,o,20);printf("%s\n",o);}}return 0;
}