一 前言
学习Unix网络编程快要20天,由于一直在忙各种事情,再加上网络理论比较多,一直缺乏对代码的实践。
往期回顾 Unix网络编程卷一第三章笔记
二 socket相关的头文件
先整理一下代码需要用到的头文件
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
sys/socket.h | netinet/in.h |
---|---|
struct sockaddr | struct sockaddr_in |
int socket (int family ,int type ,int protocol) | unistd.h |
int connect (int sockfd , const struct sockaddr *servaddr , socklen_t addrlen) | ssize_t read(int fd, void *buf, size_t count) |
#include<strings.h>
#include <arpa/inet.h>
strings.h | <arpa/inet.h> |
---|---|
void bzro(void *dest,size_t nbytes) | int inet_aton( const *strptr, struct in_addr *addrptr) |
三 代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include<strings.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAX_LINE 1024
void send_error(char *error);
int main ( int argc,char **argv) {
int sockfd;//套接字描述符
int message_length=0;
char message[MAX_LINE];
//定义一个套接字结构(IPV4)
struct sockaddr_in servaddr;
if(argc !=2) {
printf("argc :%d\n",argc);
exit(0);
}
if( (sockfd = socket(AF_INET,SOCK_STREAM,0)) <0) {
perror("socket fault");
}
//初始化套接字结构,TCP协议,server IP and port
bzero(&servaddr,sizeof(servaddr));//清0操作
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(13);//port
//IP
if( inet_pton(AF_INET,argv[1],&servaddr.sin_addr) <= 0){
send_error("inet_pton error");
}
//客户端发起连接,struct sockaddr *通用套接字结构
if ( connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) < 0) {
send_error("connetc error");
}
while ( (message_length = read(sockfd,message,1024))>0) {
message[message_length] = '\0';
if( fputs(message,stdout) == EOF) {
send_error("fputs error");
}
}
if(message_length<0) send_error("read error");
exit(0);//关闭所有描述符
}
void send_error(char *error){
perror(error);
exit(0);
}
四 运行
1.获取时间
gcc ClientGetTime.c
./a.out 127.0.0.1
30 APR 2021 13:41:21 BST
2.向路由器发送TCP报文
./a.out 192.168.x.1
connetc error: Connection refused
- 仿造不存在的IP
./a.out 192.168.12.11
connetc error: Connection timed out
4.向已存在的主机发送请求
./a.out 192.168.x.x
connetc error: Connection timed out
5.分析结果
Connection refused:一般情况是由于对方的端口号没有开放
Connection timed out:目的主机没有响应TCP