关于Socket的客户端服务端的简单例子“本机回射”

来源:互联网 发布:淘宝店铺升天猫费用 编辑:程序博客网 时间:2024/05/17 06:11

个人记录,转自http://www.cnblogs.com/xudong-bupt/archive/2013/12/29/3483059.html


服务器端:

//测试Socket的服务端#include <sys/types.h>    // for socket#include <sys/socket.h>    // for socket#include <stdio.h>        // for printf#include <netinet/in.h>    // for sockaddr_in#include <arpa/inet.h>#include <unistd.h>#include <stdlib.h>        // for exit#include <string.h>        // for bzero#include <fcntl.h>#include <sys/shm.h>#define MYPORT    8887 #define QUEUE   20#define BUFFER_SIZE 1024 int main(){    //定义sockfdint server_sockfd = socket(AF_INET,SOCK_STREAM,0);//定义sockaddr_in    struct sockaddr_in server_sockaddr;    //bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0    server_sockaddr.sin_family = AF_INET;    server_sockaddr.sin_port = htons(MYPORT);    server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);     //bind,成功返回0,出错返回-1    if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1)    {          printf("Bind Failed!");        exit(1);    }         //listen,成功返回0,出错返回-1    if(listen(server_sockfd,QUEUE)==-1)    {        printf("Listen Failed!");         exit(1);    }     //客户端套接字char buffer[BUFFER_SIZE];struct sockaddr_in client_addr;socklen_t length = sizeof(client_addr);//成功返回非负描述字,出错返回-1;int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length);if(conn<0){printf("connect err");exit(1);}while(1){memset(buffer,0,sizeof(buffer));int len = recv(conn,buffer,sizeof(buffer),0);if(strcmp(buffer,"exit\n")==0)break;fputs (buffer,stdout);send(conn,buffer,len,0);}close(conn);close(server_sockfd);return 0;}
客户端:

//socket客户端程序//实现功能是将客户端发送的数据原样返回#include <sys/types.h>    // for socket#include <sys/socket.h>    // for socket#include <stdio.h>        // for printf#include <netinet/in.h>    // for sockaddr_in#include <arpa/inet.h>#include <unistd.h>#include <stdlib.h>        // for exit#include <string.h>        // for bzero#include <fcntl.h>#include <sys/shm.h> #define MYPORT    8887 #define BUFFER_SIZE 1024int main(){         //定义sockfdint sock_cli = socket(AF_INET,SOCK_STREAM,0);//定义sockaddr_in    struct sockaddr_in servaddr;memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(MYPORT);//服务器端口servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");//连接服务器,成功返回0,错误返回-1if(connect(sock_cli,(struct sockaddr *)&servaddr,sizeof(servaddr))<0){printf("connect fail");exit(1);}char sendbuf[BUFFER_SIZE];char recvbuf[BUFFER_SIZE];while(fgets(sendbuf,sizeof(sendbuf),stdin) != NULL){send(sock_cli,sendbuf,strlen(sendbuf),0); //发送if(strcmp(sendbuf,"exit\n")==0)break;recv(sock_cli,recvbuf,sizeof(recvbuf),0); //接收fputs (recvbuf,stdout);memset(sendbuf,0,sizeof(sendbuf));memset(recvbuf,0,sizeof(recvbuf));}close(sock_cli);return 0;    }
同时打开两个工程,先运行服务器端的程序,会等待连接,然后运行客户端程序,服务器端会返回从客户端接收到的数据。

阅读全文
0 0
原创粉丝点击