客户端服务器编程模型:
客户端代码: #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <netdb.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/types.h> #include <arpa/inet.h> #define MAXLINE 100; #define RIO_BUFSIZE 8192; int main() { int clientfd = socket(AF_INET,SOCK_STREAM,0); //创建一个客户端套接字描述符 struct sockaddr_in serveraddr; struct hostent *hp; bzero((char *)&serveraddr,sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(15636); serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //创建服务器套接字 connect(clientfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)); //将客户端套接字描述符与服务器套接字进行连接 printf("connected.\n"); char buf[100]; //定义发送数据缓冲区 while(1){ printf("please input string:\n"); fgets(buf,100,stdin); //从键盘输入字符串 send(clientfd,buf,100,0); //将位于buf缓冲区的数据发送到clientfd描述符连接的套接字的IP地址对应的线程 recv(clientfd,buf,100,0); //从clientfd关联的服务器端进程获得数据。并保存在缓冲区中 printf("%s\n",buf); } close(clientfd); return EXIT_SUCCESS; }
服务器端代码:
#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <netdb.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/types.h> #include <arpa/inet.h> int main() { int port=15636 ; int listenfd = socket(AF_INET, SOCK_STREAM,0); //创建服务器端套接字描述符,用于监听客户端请求 struct hostent *hp; struct sockaddr_in serveraddr; bzero((char *)&serveraddr,sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); serveraddr.sin_port = htons(port); //创建用于服务的服务器端套接字,注意与 客户端创建的套接字的区别 IP段里,这里是可以为任何IP提供服务的,客户端里的IP是请求的端点 bind(listenfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)); //将服务器端的套接字描述符和服务器端套接字相关联 listen(listenfd,1024); //打开监听 char temp[100]; struct sockaddr_in clientaddr; int clientlen, connfd; clientlen = sizeof(clientaddr); connfd = accept(listenfd,(struct sockaddr *)&clientaddr, &clientlen); //等待接受客户端的请求,这是一个阻塞函数。若成功接受客户端请求则返回新的套接字描述符,这个描述符用于 send和recv函数 while(1){ recv(connfd,temp,100,0); printf("%s\n",temp); fgets(temp,100,stdin); send(connfd,temp,100,0); } //recv接收客户端发送过来的字符串,send发送给客户端字符串 EXIT_SUCCESS; }
注意:以上代码只是为了突出客户端服务器编程框架,因为并未判断出错及相关处理方法。
下面为完整代码:
客户端:
//the client code //copyright chenglibin http://blog.csdn.net/chenglibin1988#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <unistd.h>#include <netdb.h>#include <sys/socket.h>#include <netinet/in.h>#include <sys/types.h>#include <arpa/inet.h>#define MAXLINE 100;int main(){int clientfd = socket(AF_INET,SOCK_STREAM,0);if(clientfd < 0){ perror("socket"); exit(1);}struct sockaddr_in serveraddr;struct hostent *hp;bzero((char *)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(15636);
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if(connect(clientfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) < 0){
perror("connect");
exit(1);
}
printf("connected\n");
char buf[100];
int idata;
while(1){
idata = 0;
printf("input a string:\n");
fgets(buf,100,stdin);
send(clientfd,buf,100,0);
idata = recv(clientfd,buf,100,0);
if(idata < 0){
perror("recv");
exit(1);
}
printf("data received from server is:\n %s\n",buf);
}
close(clientfd);
return EXIT_SUCCESS;
}
***************************************************************************************************************************************************************************************
***************************************************************************************************************************************************************************************
服务器端代码如下:
//the server code //copyright chenglibin http://blog.csdn.net/chenglibin1988 #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <netdb.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/types.h> #include <arpa/inet.h> #define PORT 15636 int main() { int listenfd = socket(AF_INET, SOCK_STREAM,0); if(listenfd < 0){ perror("socket"); exit(1); } struct hostent *hp; struct sockaddr_in serveraddr; bzero((char *)&serveraddr,sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); serveraddr.sin_port = htons(PORT); if(bind(listenfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) < 0){ perror("connect"); exit(1); } if(listen(listenfd,1024) < 0){ perror("listen error"); exit(1); } char temp[100]; struct sockaddr_in clientaddr; int clientlen, connfd; clientlen = sizeof(clientaddr); connfd = accept(listenfd,(struct sockaddr *)&clientaddr, &clientlen); if(connfd < 0){ perror("accept error"); exit(1); } printf("Accepted!\n"); int idata; while(1){ idata = 0; idata = recv(connfd,temp,100,0); if(idata < 0){ perror("recv error"); exit(1); } printf("data received from client is :\n%s\n",temp); printf("input a string:\n"); fgets(temp,100,stdin); send(connfd,temp,100,0); } EXIT_SUCCESS; }