ubuntu的网络编程
网络编程 一般有两种 TCP 和 UDP
TCP 是面向连接层的传输协议 是无误的 数据没有丢失的失序 和 数据不会重复到达的
UDP是用户数据协议 是不可靠的无连接的协议,但是可以进行高效率的传输。
说起TCP和UDP 就要提到 SOCKET
这个是一个编程接口 和 特殊的文件描述符 面向有连接和无连接的
1:在进行网络编程的时候不管是 TCP 和 UDP 都要创建一个 套接字 有3种 不同的套接字 SOCK_STREAM,SOCK_DGRAM,SOCK_RAW,第一种是UDP传输的 ,2 是TCP,
第三种是 越过传输层直接作用于网络层的 PING 命令就是用这种套接字类型的。
2:在创建好了 之后 要对 struct sockaddr_in 要进行填充的
struct sockaddr_in {
short int sin_family; /* 地址族 */
unsigned short int sin_port; /* 端口号 */
struct in_addr sin_addr; /* IPV4 */
unsigned char sin_zero[8]; /* 这个是为了传输的时候可以对齐 */
};
因为在网络传输的时候 一般规定的是
struct sockaddr
{
unsignedshort sa_family; /* address family */ |
char sa_data[14]; /* up to 14 bytes of direct address */
};
所以在传输的时候要进行强行转化
前面基本上是这样的 在接下来 就要分 TCP 和UDP 以及server client 的区别了。
先说TCP,server
在TCP 编程的时候 是有3次握手的
要进行绑定套接字
bind(scokfd,(struct sockaddr *)&myaddr,sizeof(struct sockaddr));
然后监听
listen(sockfd);
之后就是等待接受client的连接请求
newsock=accept(sockfd,(struct sockaddr *)&cliaddr,sizeof(cliaddr)); 这个时候会创建一个新的套接字用于接收client的消息;
recv(newsock,buf,sizeof(buf),0);
send(newsock,buf,sizeof(buf));
client
也是要绑定套接字的
bind();
然后请求连接
connect(scokfd,(struct sockaddr *)&serveraddr,sizeof(struct scokaddr));
send(sockfd,buf,sizeof(buf),0);
recv(scokfd,buf,sizeof(buf));
UDP
server
前面也是创建sockfd 填充 sockaddr bind()
len =strlen(struct sockaddr);
接收的用recvfrom(scokfd,buf,sizeof(buf),(struct scokaddr *)&cliaddr)&cliaddr,&len);
sendto(scokfd,buf,sizeof(buf),(struct sockaddr *)&cliaddr,sizeof(struct sockaddr));
clinet 和 server 差不多的。
有几个 有用的小命令 chown root.root 文件名 改变文件的主属性
chmod +是 文件名 执行的时候以文件的属主执行。
有的时候或用到 strcmp()是比较字符
strncmp(buf,"quit",4);
strcpy()
UDP 可以多次使用 sockfd
inet_addr()错误的返回值是 ANADDR_NONE =0XFFFFFFFF 也就是-1;
signal(SIGCHLD,SIG_IGN) 忽略信号 将其处理 一般是用在 多路复用 和 并发执行的时候 容易产生僵尸进程 导致 套接字(1024个) 数量减少;