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