把服务器端的程序稍加修改,就可以形成客户端:
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h> #include <sys/socket.h> #include <arpa/inet.h> #include <ctype.h> #include <string.h> #define SERV_PROT 6666 #define SERV_IP "127.0.0.1" int main() { int clifd; struct sockaddr_in serv_addr; char buf[BUFSIZ]; int n; //填充结构体 serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(SERV_PROT); inet_pton(AF_INET,SERV_IP, &serv_addr.sin_addr.s_addr); clifd=socket(AF_INET,SOCK_STREAM,0); connect(clifd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)); fgets(buf,sizeof(buf),stdin); write(clifd,buf,strlen(buf)); n=read(clifd,buf,sizeof(buf)); printf("\n%s\n",buf); close(clifd); return 0; }把服务器端和客户端都添加上循环,以便可以一直执行下去。 为了让服务器端更好的工作,添加能显示连接的客户端信息:
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h> #include <sys/socket.h> #include <arpa/inet.h> #include <ctype.h> #define SERV_PROT 6666 #define SERV_IP "127.0.0.1" int main() { int serfd,clifd; struct sockaddr_in serv_addr,cli_addr; socklen_t cli_addr_len; cli_addr_len=sizeof(cli_addr); char buf[BUFSIZ]; char cli_ip[BUFSIZ]; int i,n; char * dst; serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(SERV_PROT); //serv_addr.sin_addr.s_addr=inet_pton(AF_INET,SERV_IP,dst); serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); serfd=socket(AF_INET,SOCK_STREAM,0); bind(serfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)); listen(serfd,128); clifd=accept(serfd,(struct sockaddr*)&cli_addr,&cli_addr_len); //显示客户端信息 printf("cliet ip:%s,cliet prot:%d\n", inet_ntop(AF_INET,&cli_addr.sin_addr.s_addr, cli_ip, sizeof(cli_ip)), ntohs(cli_addr.sin_port)); while(1) { n=read(clifd,buf,sizeof(buf)); for(i=0;i<n;i++) { buf[i]=toupper(buf[i]); } write(clifd,buf,n); } close(serfd); close(clifd); return 0; }实验成功,不过这种方式一次只能连接上一个客户端。 如果需要N个客户端连接的话,有两种大的方式。 第一种是多进程的服务器,第二种是多路IO转接。
