网络编程作用在于,用来跨主机,远距离的数据通信。
网络编程离不开:
套接字:socket(网络程序的编程接口)
IP:互联网中主机的唯一标识
特殊IP:
回路IP 127.0.0.1 所有IP:INADDR_ANY(0.0.0.0)
端口:用于表示网络数据由那个程序来接受处理
网络字节序:用于避免不同主机由于数据存储方式不同而造成数据解析不一致,网络字节序规定,左右的主机以大端的方式来存储数据 。
1、创建一个数据包类型的套接字
int socket =socket(AF_INET,SOCK_DGRAM,0);
2、绑定地址信息
bind(socket,(struct sockaddr*)&server,sizeof(structsocjaddr_in));
3、接收客户端信息:
struct sockaddr_in client:
int len = sizeof(struct sockaddr_in);
recvfrom(socket,buf,sizeof(buf),0,(struct aockaddr*)&client,len);
4、发送消息给客户端
sento(socket,buf,strlen(buf),0,(structsockaddr*)&client,len);
5、关闭套接字
close(socket)
#include
#include
#include
#include
#include
#include
#include
#include
#define SOCKADDR struct sockaddr
int main(int c,char* v[])
{
if(c < 3)
{
puts("参数错误 请按照[exe ip PORT]方式传入!");
return -1;
}
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
struct sockaddr_in server = {0};
int len = sizeof(struct sockaddr_in);
if( sockfd < 0)
{
perror("socket");
return -1;
}
server.sin_family = AF_INET;
server.sin_port = htons(atoi(v[2]));
server.sin_addr.s_addr = inet_addr(v[1]);
if( bind(sockfd,(SOCKADDR*)&server,len) < 0)
{
perror("bind");
close(sockfd);
return -1;
}
char buf[256] = {0};
struct sockaddr_in client = {0};
while(1)
{
recvfrom(sockfd,buf,sizeof(buf)-1,0,(SOCKADDR*)&client,&len);
printf("(%s %d)发来信息:%s\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port),buf);
bzero(buf,sizeof(buf));
char *p="123";
sendto(sockfd,p,strlen(p),0,(SOCKADDR*)&client,len);
}
close(sockfd);
return 0;
}
1、创建一个流式类型的套接字,该套接字专用于监听客户端连接.
int sockl = socket(AF_INET,SOCK_STREAM,0);
2、绑定地址信息.注意:(sockaddr结构体需要用sockaddr_in 来替代)
bind(sockl,(struct sockaddr*)&server,sizeof(struct sockaddr_in));
3、监听客户端连接
listen(sockl,5);
4、接收客户端连接,当三次握手过程结束后,会返回一个专用于和客户端通讯的套接字
struct sockaddr_in client;
int len = sizeof(struct sockaddr_in);
sockc = accept(sockl,(struct sockaddr*)&client,&len);
5、接收客户端的信息.
recv(sockc,buf,sizeof(buf),0);
注意: recv函数返回0,表明客户端断开连接.
6、发送消息给客户端.
send(sockc,buf,strlen(buf),0);
7、关闭套接字
close(sockc);
close(sockl);
#include
#include
#include
#include
#include
#include
#include
#include
#define SOCKADDR struct sockaddr
int main(int c,char * v[])
{
if( c < 3)
{
puts("参数错误!");
return -1;
}
int sockl;
sockl = socket(AF_INET,SOCK_STREAM,0);
if(sockl < 0)
{
perror("socket");
return -1;
}
struct sockaddr_in server = {0};
int len = sizeof(struct sockaddr_in);
server.sin_family = AF_INET;
server.sin_port = htons(atoi(v[2]));
server.sin_addr.s_addr =inet_addr(v[1]);
if(bind(sockl,(SOCKADDR*)&server,len) < 0)
{
perror("bind");
close(sockl);
return -1;
}
listen(sockl,5);
struct sockaddr_in client = {0};
int sockc = accept(sockl,(SOCKADDR*)&client,&len);
if(sockc < 0)
{
perror("sockc");
close(sockl);
return -1;
}
printf("[%s %d],已连接!\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
char* pszWei ="welcome to Xian";
send(sockc,pszWei,strlen(pszWei),0);
char buf[256] = {0};
if ( !recv(sockc,buf,sizeof(buf) - 1,0))
{
printf("[%s %d]已退出!\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
close(sockc);
}
else
{
printf("[%s %d]发来消息:%s\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port),buf);
}
close(sockl);
return 0;
}
代码复制老早之前的,有问题请留言联系我。
记得刚学会UDP服务器,我们就迫不及待的写好服务器、客户端,实现了互相通信,虽然信息发过来了,但是还是不了解通信机制,发送过程中是以什么形式发送,随后联想到蓝牙、红外线、数据线等等,传输数据都是以什么形式,什么信号,怎么互相转换一系列问题,迫于资源有限,一直等到了现在,学习过程是特别枯燥的,但是学会一个技能并能在实际中运用它,那是特别开心的,也是学习下去的动力,这也就是多数人喜欢实践而不喜欢理论的原因,实践出真知,但也是基于理论上实践的,所以还是好好学习,接受汲取更多的知识,充实自己。