网络编程场景
自己是客户端站在5栋楼前,自己要找到5栋楼中的一座并进入某一间房间,这时第二座楼上有人在用汉语(tcp/udp)说话,我的ip地址(楼号)是…,我的端口号(房间号)是…,就是先告诉你你的ip地址和端口号,确定你的服务器在哪里,然后回房间监听(等待大家的来访,来了敲门)
Socket服务器和客户端的开发步骤
服务器开发
第一步
socket()获得一个套接字,返回套接字的描述符,后面都是基于这个描述符向外面进行网络访问,这个作用有点像open()
第二步
bind()为套接字添加信息,将ip地址和端口号绑定到套接字。
第三步
listen()监听网络连接
第四步
accept()监听到有客户端接入的时候,接受一个连接。
第五步
数据交互(read从网络通道上读数据,write向网络通道发数据)
第六步
关闭套接字,断开连接。
客户端开发
socket()给客户端一个通道,知道IP地址和端口号调用connect()连接,然后客户端write服务端read,服务端write客户端read。
linux提供的API简析
1、创建套接字时指定用哪种协议进行连接
2、地址准备好
地址转换API
4、监听
4、连接
数据收发
数据的收发第二套API
客户端connect函数
字节序转换API
查找结构体方法
-nir中 n表示显示行号,i表示不区分大小写,r表示逐行扫描
socket服务端代码演示
#include<stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include<linux/in.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<netinet/in.h>
int main()
{
int s_fd;
int n_read;
char readbuf[128];
char*msg="I have get your messange";
//1.socket
s_fd=socket(AF_INET,SOCK_STREAM,0);//AF_INET表示IPV4因特网域,SOCK_STREAM表示TCP协议
if(s_fd==-1){
perror("socket");//打印错误
exit(-1);
}
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
memset(&s_addr,0,sizeof(struct sockaddr_in));
memset(&c_addr,0,sizeof(struct sockaddr_in));
s_addr.sin_family=AF_INET;//IPV4因特网域
s_addr.sin_port=htons(8988);//htons将字节序转换为网络字节序
inet_aton("192.168.183.128",&s_addr.sin_addr);//sin_addr是ip地址
//2.bind
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
//3.listen
listen(s_fd,10);
int clen=sizeof(struct sockaddr_in);
//4.accept
int c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&clen);//这里的c_fd就是接下来的操作对象,s_fd继续等待其他客户端的接入,accept的第二个参数是接入服务器者的信息
if(c_fd==-1){
perror("accept");
}
printf("get connect :%s\n",inet_ntoa(c_addr.sin_addr));//打印接入客户端的IP地址
//5.read
n_read=read(c_fd,readbuf,128);
if(n_read ==-1){
perror("read");
}
else{
printf("get message :%d,%s\n",n_read,readbuf);
}
//6.write
write(c_fd,msg,strlen(msg));
return 0;
}
socket客户端代码演示
#include<stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include<linux/in.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<netinet/in.h>
int main()
{
int c_fd;
int n_read;
char* readbuf;
readbuf=(char *)malloc(128);
char*msg="message from client";
//1.socket
c_fd=socket(AF_INET,SOCK_STREAM,0);
if(c_fd==-1){
perror("socket");
exit(-1);
}
struct sockaddr_in c_addr;
memset(&c_addr,0,sizeof(struct sockaddr_in));
c_addr.sin_family=AF_INET;
c_addr.sin_port=htons(8988);
inet_aton("192.168.183.128",&c_addr.sin_addr);
//2.connect
if(connect(c_fd,(struct sockaddr*)&c_addr,sizeof(struct sockaddr_in))==-1){
perror("connect");
exit(-1);
}
//3.send
write(c_fd,msg,strlen(msg));
//4.read
n_read=read(c_fd,readbuf,128);
if(n_read ==-1){
perror("read");
}
else{
printf("get message from server:%d,%s\n",n_read,readbuf);
}
return 0;
}