欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux下的网络编程

程序员文章站 2024-01-23 14:25:04
...

今天学习了下如何将同一局域网内的几台电脑之间进行一些交互,遵循3次握手原则和4次挥手原则,3次握手即本地发出请求,主机回应请求,再本地发出即将发出请求的信号,4次挥手即多了一次等待的过程,就是多个数据传输的时候可能不是同时到,会产生延迟,所以需要等待数据一起到达了再发送达本地。然后学长举了个例子,用c语言写了两个程序,一个叫main.c,还有一个叫client.c,分别是作为回应应答的主机程序和发出请求的本地程序,下面贴出这两个代码,用了本地向主机获得时间的程序,虽然都不太知道是什么意思。。。

main.c:

#include <stdio.h>
#include <netinet/in.h>  /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h>   /* inet(3) functions */
#include <sys/socket.h>
#include <memory.h>
#include <time.h>
#include <zconf.h>
#include <errno.h>
#include <stdlib.h>

#define MAXLINE    256
#define CLIENTNUM  3

int main() {
    int listenfd, connfd;
    socklen_t len;
    struct sockaddr_in serveraddr, cliaddr;
    char buff[MAXLINE];
    memset(buff, 0, MAXLINE);
    time_t  ticks;

    //创建套接字
    if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
        perror("Socket File Create: Error");
        exit(-1);
    } else{
        printf("Socket File Create: OK\n");
    }

    //将serveraddr置0
    bzero(&serveraddr, sizeof(serveraddr));

    //设置服务器地址
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serveraddr.sin_port = htons(9000);

    //将套接字和服务器地址绑定
    if((bind(listenfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr))) < 0){
        perror("Bind Socket: Error");
        exit(-1);
    }else{
        printf("Bind Socket: OK\n");
    }

    //开始监听socket
    if((listen(listenfd, CLIENTNUM)) < 0){
        perror("Start Listen Socket: Error");
        exit(-1);
    }else{
        printf("Start Listen Socket: OK\n");
        printf("Waitting for connection...\n");
    }

    for(;;){
        len = sizeof(cliaddr);
        //有连接请求的时候建立连接
        connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &len);
        printf("Connection from %s , port %d\n",
        inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff))),
        ntohs(cliaddr.sin_port);

        ticks = time(NULL);
        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
        write(connfd, buff, strlen(buff));
        close(connfd);
    }
    return 0;
}

client.c:

//
// Created by leo on 17-11-18.
//
#include <stdio.h>
#include <netinet/in.h>  /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h>   /* inet(3) functions */
#include <sys/socket.h>
#include <memory.h>
#include <time.h>
#include <zconf.h>
#include <errno.h>
#include <stdlib.h>

#define MAXLINE    256

int main(int argc, char **argv){
    char buf[MAXLINE];
    memset(buf, 0, MAXLINE);
    int sockfd;
    struct sockaddr_in serveraddr;

    if(argc != 2){
        perror("usage: tcpli <IPaddress>");
        exit(-1);
    }

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    bzero(&serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(9000);

    inet_pton(AF_INET, argv[1], &serveraddr.sin_addr);

    connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr));
    send(sockfd, "Hello", 5, 0);
    read(sockfd, buf, MAXLINE);
    printf("%s\n", buf);
    return 0;
}


然后如果代码过长想发给别人就用http://paste.ubuntu.com这个网址

还有是如果用vim直接复制进去他会产生很多换行符就会编译出错,所以后来我用gedit复制进去就好了,然后有些ubuntu可能没有zlib.h这个文件,会编译出错,这时就要在终端输入sudo apt-get install zlib1g-dev安装一下就好了,准备好了这两个文件以后来到这两个文件的目录,进行编译cc main.c -o main.o 和cc client.c -o client.o获得编译后的可执行文件,然后运行./client.o+同一局域网下另一台电脑的内网ip地址,如果不知道另一台电脑内网ip地址,就用ifconfig来查看,这时可能会没有权限(我的没有出现这种情况),就输入chmod 711 client.o修改文件的权限,这个数字和可读写的值有关,然后就可以正常使用了,这个时候就会向主机服务器发一个请求,如果主机运行了main.o就可以回应这种应答给请求的本地时间,另外因为vim太不好用了,学长推荐用emacs,有很多功能的一个文本编辑器,还是很好用的,只要sudo apt-get install emacs就可以安装