Linux tcp_socket实例

来源:互联网 发布:杭州汉聚网络老板 编辑:程序博客网 时间:2024/06/05 19:50

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

.PHONY:allall:tcp_server tcp_clienttcp_server:tcp_server.c    gcc -o $@ $^   tcp_client:tcp_client.c    gcc -o $@ $^   .PHONY:cleanclean:    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.交互
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

原创粉丝点击