Linux网络编程之echo server的实现

网络编程第一步,先实现一个echo server

一个echo server程序包含两部分
* 客户端
* 服务端
这里,服务端相对于客户端的代码要多一些。

这里简单说一下代码结构:

服务端

 1. socket
 2. bind
 3. listen
 4. accept
 5. 循环读写
 6. 关闭连接和套接字

客户端(相对比较简单一些 )

  1. socket
  2. connect
  3. 循环读写
  4. 关闭套接字

下面贴代码(C语言实现):
server.c

#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <memory.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>

#define ERR_EXIT(m) \
    do{         \
         perror(m);       \
        exit(EXIT_FAILURE);\
    }while(0)

int main(int argc, char *argv[])
{
    int socket_fd;
    if((socket_fd=socket(PF_INET,SOCK_STREAM,0))==-1)
    {
        ERR_EXIT("socket");
    }


    struct sockaddr_in servaddr;
    memset(&servaddr,0,sizeof(servaddr));
    servaddr.sin_family=AF_INET;
    servaddr.sin_port=htons(5678);
    servaddr.sin_addr.s_addr=inet_addr("127.0.0.1");

    /*
       servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
       inet_aton("127.0.0.1",&servaddr.sin_addr);
     */

    if(bind(socket_fd,(struct sockaddr*)&servaddr,sizeof(servaddr))==-1)
        ERR_EXIT("bind");

    if(listen(socket_fd,SOMAXCONN)==-1)
        ERR_EXIT("listen");

    struct sockaddr_in peeraddr;
    memset(&peeraddr,0,sizeof(peeraddr));
    socklen_t len=sizeof(peeraddr);
    int conn;

    if((conn=accept(socket_fd,(struct sockaddr*)&peeraddr,&len))==-1)
        ERR_EXIT("accept");
    char buf[1024]={};
    while(1){
        memset(buf,0,sizeof(buf));
        int rlen=read(conn,buf,sizeof(buf));
        fputs(buf,stdout);
        write(conn,buf,rlen);
    }

    close(conn);
    close(socket_fd);

    return 0;
}

客户端(C语言实现)
client.c

#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <memory.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>

#define ERR_EXIT(m)\
        do{\
        perror(m);\
        exit(EXIT_FAILURE);\
}  while(0)


int main(int argc, char *argv[])
{

    if(argc<2){
        ERR_EXIT("too little arguments");
    }
    int socket_fd;
    if((socket_fd=socket(AF_INET,SOCK_STREAM,0))==-1){
        ERR_EXIT("socket");
    }

    struct sockaddr_in servaddr;
    servaddr.sin_family=AF_INET;
    servaddr.sin_port=htons(5678);
    servaddr.sin_addr.s_addr=inet_addr(argv[1]);

    if(connect(socket_fd,(struct sockaddr*)&servaddr,sizeof(servaddr))==-1){
        ERR_EXIT("connect");
    }

    char sendbuf[1024]={};
    char recvbuf[1024]={};


    while(fgets(sendbuf,sizeof(sendbuf),stdin)!=NULL){
        write(socket_fd,sendbuf,strlen(sendbuf));
        read(socket_fd,recvbuf,sizeof(recvbuf));
        memset(sendbuf,0,sizeof(sendbuf));
        memset(recvbuf,0,sizeof(sendbuf));
    }

    close(socket_fd);

    return 0;
}

注:

  • 环境 :gcc (Ubuntu 5.4.0-6ubuntu1~16.04.1) 5.4.0 20160609
  • 编译后,先启动server端,然后启动client端,client需要传一个参数-服务器IP,若二者都在本机,传127.0.0.1即可
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值