Linux tcp_socket实例

一、利用tcp协议、socket模拟实现网络通信
网络中不同主机间的通信,实质上是网络中两个唯一的进程间通信,而IP地址加端口号可以表示网络中唯一的一个进程,即socket。tcp协议则可以实现全双工通信,同时收发数据。IP可以使用ifconfig查看本机IP为10.100.32.52,端口使用8080端口。
这里写图片描述
二、代码实现
1、创建源文件并编写Makefile
这里写图片描述
Makefile代码

.PHONY:all
all:tcp_server tcp_client

tcp_server:tcp_server.c
    gcc -o $@ $^   

tcp_client:tcp_client.c
    gcc -o $@ $^   
.PHONY:clean
clean:
    rm -rf  tcp_server tcp_client

2.tcp_server.c

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

int startup(const char *_ip,int _port)
{
    //创建socket
    int sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock < 0){
        perror("socket");
        exit(2);
    }

    struct sockaddr_in local;
    local.sin_family = AF_INET;
    local.sin_port = htons(_port);
    local.sin_addr.s_addr = inet_addr(_ip);
    //绑定IP与端口
    if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0){

        perror("bind");
        exit(3);
    }
    //监听
    if(listen(sock,10)<0){
        perror("listen");
        exit(4);
    };  
    return sock;
}


static void usage(const char *proc)
{
    printf("%s [ip][port]\n",proc);
}
int main(int argc,char* argv[])
{
    if(argc != 3){
        usage(argv[0]);
        return 1;
    }
    int listen_sock = startup(argv[1],atoi(argv[2]));
    struct sockaddr_in remote;
    socklen_t len = sizeof(remote) ;
    char buf[1024];
    while(1){
            int sock = accept(listen_sock,(struct sockaddr*)&remote,&len);
            if(sock < 0){
                perror("accept");
                continue;
            }
            printf("client ip:%s,port:%d\n"\
                    ,inet_ntoa(remote.sin_addr),ntohs(remote.sin_port));
            while(1){
                ssize_t s = read(sock,buf,sizeof(buf)-1);
                if(s > 0){
                    buf[s] = 0;
                    printf("client say# %s\n",buf);
                    write(sock,buf,strlen(buf));
                }else if(s == 0){
                    printf("client quit!\n");
                    break;
                }
            }
        }
}
  1. tcp_client.c
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
static void usage(const char *proc)
{
    printf("%s[server_ip][server_port]\n",proc);
}
int main(int argc,char* argv[])
{
    if(argc != 3){
        usage(argv[0]);
        exit(1);
    }
    int sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock < 0){
        perror("socket");
        return 1;
    }
    struct sockaddr_in peer;
    peer.sin_family = AF_INET;
    peer.sin_port  =  htons(atoi(argv[2]));
    peer.sin_addr.s_addr = inet_addr(argv[1]);

    char buf[1024];

    if(connect(sock,(struct sockaddr*)&peer,sizeof(peer))<0){
        perror("connect");
        return 3;
    }
    while(1){
        printf("Please Enter#");
        fflush(stdout);
        ssize_t s = read(0,buf,sizeof(buf)-1);
        if(s>0){
            buf[s-1] = 0;
            write(sock,buf,strlen(buf));
            ssize_t _s = read(sock,buf,sizeof(buf)-1);
            if(_s > 0){
                buf[_s] = 0;
                printf("sever echo# %s\n",buf);
            }
        }
    }

    close(sock);
}

三、测试结果
在本机开启两个终端间,或在局域网内两台主机间测试
1.先开启server端服务器
这里写图片描述
这里没有任何变化,是因为没有客户端连接,server一直在阻塞式的等待
2.开启client客户端
这里写图片描述
这时client端提示输入,server端则出现client的socket
这里写图片描述
3.交互
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值