Linux下的网络编程

来源:互联网 发布:淘宝排版软件 编辑:程序博客网 时间:2024/06/05 16:23

今天学习了下如何将同一局域网内的几台电脑之间进行一些交互,遵循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  3int 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    256int 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就可以安装