TCP/IP网络编程复习(上)

第一章 理解网络编程和套接字

#include<sys/socket.h>
int socket(int domain, int type , int protocol);
//socket返回文件描述符或-1
int bind(int sockfd , struct sockaddr *myaddr, socklen_t addrlen);
//bind返回0或-1
int listen(int sockfd,int backlog);
//listen返回0或-1
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
//返回文件描述符或-1  
##以上为服务器端 编译指令:gcc hello_server.c -o hserver
  • Linux下socket被认为是文件的一种,windows区分socket和文件
  • 0,1,2这三个文件描述符(方便描述文件)为STDIN STDOUT STDERR
int open(const char *path, int flag);
//返回fd或-1
int close(int fd);
//返回0或-1
ssize_t write(int fd,const void *buf , size_t nbytes);
//写入文件,返回成功写入的字节数或-1
ssize_t read(int fd,void *buf,size_t nbytes);
//返回成功接收的字节数或-1
  • windows在这方面的函数与linux差不多,不过套接字有专属类型SOCKET

第二章 套接字类型与协议设置

  • int socket(int domain, int type , int protocol);
    第一个参数为协议族有PF_INET PF_INET6等;第二个参数为套接字类型:有SOCK_STREAM(传送带传糖果,面向连接,无数据边界,可靠有序)和SOCK_DGRAM)(摩托车,不可靠,无序,以数据的高速传输为目的的套接字);最后一个参数默认情况是0

第三章 地址族与数据序列

  • IPV4传数据是先向网络号传输数据(传到路由器,交换机),再由这个网络具体传给相应主机号的主机
  • A类地址首字节范围:0-127 B:128-191 C:192-223
  • NIC(网络接口卡)为数据传输设备,os会将传递到内部的数据分配给套接字,这时需要用到端口号,NIC接收的数据内有端口号,os参考此端口号把数据传给对应套接字;端口号范围0-65535,但0-1023为知名端口
struct sockaddr_in //本来就是给IPV4设计的
{
   
	sa_family_t sin_family; //地址族,有AF_INET;AF_INET6;AF_LOCAL,有这一栏是因为要和sockaddr这个老版本的结构体保持一致性
	uint16_t sin_port; //16位TCP/UDP端口号
	struct in_addr sin_addr; //32位IP地址
	char sin_zero[8];  //不使用
}
struct in_addr
{
   
	in_addr_t s_addr; //32位IP地址,为uint32_t
}

struct sockaddr
{
   
	sa_family_t sin_family;
	char sa_data[14];
}
  • 主机字节序一般为小端序,网络字节序为大端序
unsigned short htons(unsigned short);
unsigned short ntohs(unsigned short);
unsigned long htonl(unsigned long);
unsigned long htonl(unsigned long);
  • 数据在传输之前都需要经过转换吗:这个过程是自动的,除了向sockaddr_in结构体变量填充数据外,其他情况无需考虑字节序问题
in_addr_t inet_addr(const char * string);
##成功时返回32位大端序整数数值,失败时返回INADDR_NONE
int inet_aton(const char *string, struct in_addr * addr)
##成功返回1,失败返回0,和上面函数作用一样,不过可以直接给他弄到in_addr结构体里
char * inet_ntoa(struct in_addr adr);
##返回char*-1;需要将得到的char * 保存到新的内存空间里,否则下次用这个函数,他返回的char *就会变成新的
addr.sin_addr.s_addr = htonl(INADDR_ANY)
##自动分配本机IP地址,一般服务端才用这个
  • p52有两个不是特别清楚的点,到时候可以回头看看

第四章 基于TCP的服务器端/客户端(1)

  • listen中的sock成为服务器端套接字,是接收连接或请求的保安
  • accept会内部产生一个用于数据I/O的套接字,调用accept时,若等待队列为空,则accept函数不会返回,直到队列中出现新的客户端连接
int connect(int sock, struct sockaddr * servaddr, socklen_t addrlen);
##客户端调用connect后只有服务器端接收连接请求(服务器端接收他到等待队列)或发生断网等异常情况
而中断连接请求才会使connect返回;客户端的IP地址和端口在调用connect时自动分配,不用再用bind分
配

agrv agrc参数的描述

###echo服务端
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>

#define BUF_SIZE 1024
void error_handling(char *message);

int main(int argc,char *agrv[])
{
   
	int serv_sock,clnt_sock;
	char message[BUF_SIZE];
	int str_len,i;
	struct sockaddr_in serv_adr,clnt_adr;
	socklen_t clnt_adr_sz;

	if(argc!=2){
   
			printf("Usage : %s  <PORT>\n", agrv[0]);
			exit(1);
	}

	serv_sock=socket(PF_INET,SOCK_STREAM,0);
	if(serv_sock
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值