c语言网络编程学习,网络编程学习

========================================================

网络编程

========================================================

1,网络通信:

操作系统进程间的通信UNIX BSD:管道(pipe)、有名管道、信号(signal)

UNIX system V: 消息(message)、共享存取区(shared memory)、信号量(semaphore)

他们都只能进行进程间的通信,因此网间的通信使用的是TCP/IP网络协议,最常用的

编程接口是: UNIX BSD(套接字)SOcket、UNIX SYstem V的TLI(已经淘汰)

即SOcket---->套接字

2,TCP/IP、UDP协议

TCP/IP:传输控制协议,为广域网而设计的。

UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。如图:

spacer.gif

TCP/IP协议存在于OS中,网络服务通过OS提供,在OS中增加支持TCP/IP的系统调用——Berkeley套接字,如Socket,Connect,Send,Recv等

TCP/IP协议族包括运输层、网络层、链路层,而socket所在位置如图,Socket是应用层与TCP/IP协议族通信的中间软件抽象层。

spacer.gif

物理结构:应用层---->运输层----->网络层----->链路层(一般四层),细分为:七层结构

SOcket: 是应用层和运输层间通信的抽象层

3,SOcket:

1)服务器:先初始化SOcket----->端口绑定(bind)----->对端口进行监听(listen)---->调用accept组             塞------>等待客户连接

2)客户端:初始化SOcket------->连接服务器(connect)---->连接成功则通信开始(客户端发送数据请           求,服务器接受请求并处理请求;回发数据给客户端,客户端读取数据,关闭连接)初始化

SOcket: int socket() 返回socketfd(描述符)

bind: int bind() 进行客户端ip的绑定(IP地址+端口号)

网络字节序:小端模式(低字节在高位)绑定时必须进行字节序转化

listen: 监听socket  listen(int socktefd, int backlog); backlog: socket最大连接个数

connect: connect(int sockfd, const struct sockaddr *add, socklen_t addrlen) : 第二个参数是服务器的ip地址

4,socket创建TCP经过三次握手:请求--->应答---->确认

TCP接收终止:四次握手释放

sercer.c:

#include

#include

#include

#include

#include

#include

#include

#include

int main(int argc ,char **argv)

{

int sockfd = socket(AF_INET, SOCK_STREAM, 0);

struct sockaddr_in saddr, caddr;

memset(&saddr, 0, sizeof(saddr));

saddr.sin_family = AF_INET;

saddr.sin_port = htons(atoi(argv[1]));

saddr.sin_addr.s_addr = INADDR_ANY;

/************定端口号和IP***/

if(bind(sockfd, (struct sockaddr *)&saddr,sizeof(struct sockaddr)) == -1)

printf("bind is error\n");

/************监听**************/

if(listen(sockfd, 5) == -1)

printf("listen is error\n");

printf("LINE : %d\n", __LINE__);

int size = sizeof(struct sockaddr);

/************接受连接请求**************/

printf("connet\n");

int newsockfd = accept(sockfd, (struct sockaddr *)&caddr, &size);

if(newsockfd == -1)

printf("accept is error\n");

printf("connet\n");

close(sockfd);

close(newsockfd);

return 0;

}

client.c:

#include

#include

#include

#include

#include

#include

#include

int main(int argc,char**argv)

{

int sockfd = socket(AF_INET, SOCK_STREAM, 0);

struct sockaddr_in saddr, caddr;

memset(&saddr, 0, sizeof(saddr));

saddr.sin_family = AF_INET;

saddr.sin_port = htons(atoi(argv[2]));

saddr.sin_addr.s_addr = inet_addr(argv[1]);

/************定端口号和IP***/

printf("LINE : %d\n", __LINE__);

int size = sizeof(struct sockaddr);

/************接受连接请求**************/

int ret = connect(sockfd,(struct sockaddr*)&saddr,sizeof(struct sockaddr));

if(ret == -1)

printf("accept is error\n");

perror("connet");

close(sockfd);

return 0;

}

------------------------------------------------------------完成:2015年4月13日

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值