环境配置
UNP在linux上环境搭建
UNIX网络编程(unp)源码下载和编译
按步骤走没啥问题
执行命令
./daytimetcpcli 127.0.0.1
connect error: Connection refused
./daytimetcpcli 127.0.0.1
16 MAY 2020 09:48:00 CST
windows下环境配置有问题,网上没找到相关解决方法,其实可以问老师,现在还是先用Linix吧。
跟着老师的课程阅读一遍代码
阅读代码daytime clinet
逐行阅读;
测试1:132.163.96.1
老师说是windows有效,ubuntu依旧有效
./daytimetcpcli 132.163.96.1
58985 20-05-16 02:27:57 50 0 0 536.3 UTC(NIST) *
阅读sockaddr_in的结构;
查看服务器端程序
相互调用
第一节课结束。。。。。。。。。。。。。。。
TCP客户/服务器的基本套接字程序
流程图解释
ppt解释:想象的结构
示例:homeip
看我自己的ip?
读这个代码
再测试一下应该就可以了
第二节,代码部分结束
遇到的小问题
Parsing filters is unsupported
sudo apt-get install unrar
自己做的小实验
测试老师给的daytime例程,通过两台电脑实现客户与服务机的通信
客户机程序:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <time.h>
#include <netinet/in.h>
#include <unistd.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#define MAXLINE 4094
int main(int argc, char **argv)
{
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
struct hostent *hptr;
char **pptr;
char str[16];
if (argc != 2) {
printf("Usage: %s <IP address>\n", argv[0]);
return 1;
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("Socket error.\n");
return 2;
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(135); /* daytime server */
// servaddr.sin_addr = the IP address obtained by follows.
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <=0 ) {
if ((hptr = gethostbyname(argv[1])) == NULL) {
printf("gethostbyname error.\n");
return 3;
}
pptr = hptr->h_addr_list;
inet_ntop(AF_INET, *pptr, str, sizeof(str));
if (inet_pton(AF_INET, str, &servaddr.sin_addr) <=0) {
printf("inet_pton error.\n");
return 3;
}
}
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
printf("connect error\n");
return 4;
}
while ( (n= read(sockfd, recvline, MAXLINE)) > 0 ) {
recvline[n] = 0;
if (fputs(recvline, stdout) == EOF) {
printf("fputs error\n");
return 5;
}
}
if ( n < 0) {
printf("read error\n");
return 6;
}
exit(0);
}
这里端口设为13,来取daytime,设为135来与服务器(也设为135)建立通信。
服务器端程序
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <time.h>
#include <netinet/in.h>
#include <unistd.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#define MAXLINE 4094
int main(int argc, char **argv)
{
int listenfd, connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(135);
bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
listen(listenfd, 4);
for (;;) {
printf("waiting\n");
connfd = accept(listenfd, (struct sockaddr *)NULL, NULL);
ticks = time(NULL);
printf("in\n");
snprintf(buff, sizeof(buff), "hello %.24s\r\n", ctime(&ticks));
write(connfd, buff, strlen(buff));
close(connfd);
}
}
服务器端终端编译运行
然后客户机端运行程序访问
得到有hello的字符串输出
同时
服务器端打印"in"表示已经连接
有个小问题
老师演示时用13端口有效,我用13 端口就没连接服务器程序,所以我换了个端口。
尝试一台电脑实现通信
。。。可能有点假,就是用一台电脑实现两个程序。。。
依旧有效,老爸的电脑可以放一放了