LINUX网络编程指导(一)
一、网络编程概述
详情见见本人另外一篇博文链接: 计算机网络.
二、字节序是什么?
详情见本人另外一篇博文链接: 字节序.
三、socket编程步骤
四、编程所涉及函数API讲解
1.socket,创建套接字。
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
参数一: 我们大部分是在IPV4的环境,所以我们将第一1个承参数配置为AF_INET 。
参数二:我们这里选择TCP协议进行数据传输,所以配置参数为SOCK_STREAM,
参数三:就配置为0即可。
2.bind函数,为套接字添加信息,比如我们添加的IP地址和端口号。
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
参数一:就是创建套接字的标识符。
参数二:通过查询函数原型我们看到系统上面显示的是:
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
//我们用下面这个来代替
struct sockaddr_in {
__kernel_sa_family_t sin_family; /* Address family */
__be16 sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
//结构体第一个是英特网域的意思,需要我们配置为AF_INET
//结构体第二个是端口号
//结构体第三个又是一个结构体中的一个数据,是IP地址,配置的过程中需要转换位小端字节序,所以我们需要查询struct in_addr 结构体中的sin_addr;
struct in_addr {
__be32 s_addr;
};
3.listen,监听函数,用来监听网络连接。
int listen(int sockfd, int backlog);
参数一:就是套接字返回的标识符。
参数二:backlog参数定义了sockfd的挂起连接队列可能增长到的最大长度。如果连接请求在队列满时到达,客户端可能会收到一个指示错误,或者,如果底层协议支持重传,则可能会忽略该请求,以便以后重新尝试连接时获得成功,这里我们配置为10。
4.accept函数接受客户端连接,连接成功会返回客户端的套接字的标识通道,这个新的套接字和socket函数创建的套接字不是一个概念,我们的服务器和客户端需要通过这个新的套接字进行通信。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数一:套接字标识符也就是listen函数中设置为监听状态的套接字。
参数二:是用来保存客户端套接字对应的内存空间变量包括客户端IP和端口信息等,可以参照我上面给出的结构体来查看。
参数三:参数二内存空间的占地大小。
API函数的讲解就到这里了。下面开始写代码。
五、代码展示
//sever
#include<stdio.h>
#include<netinet/in.h>
//#include<linux/in.h>//会与下面的文件起冲突
#include<string.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int s_fd;
int n_read;//the return value of read
struct sockaddr_in c_in;
struct sockaddr_in client_in;
char buff[128];
char *str = "hello!";
memset(&c_in,0,sizeof(struct sockaddr));
memset(&client_in,0,sizeof(struct sockaddr));
s_fd = socket(AF_INET,SOCK_STREAM,0);
// int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
if(s_fd==-1)
{
perror("socket");
exit(-1);
}
c_in.sin_family = AF_INET;
c_in.sin_port = htons(8989);//转化为网络能识别的字节序
inet_aton("127.0.0.1",&c_in.sin_addr);//同上
int size = sizeof(struct sockaddr_in);
bind(s_fd,(struct sockaddr *)&c_in,size);
listen(s_fd,10);
int len = sizeof(struct sockaddr );
int c_fd = accept(s_fd,(struct sockaddr*)&client_in,&len);
if(c_fd!=-1)
{
printf("connect!\n");
printf("the client IP is :%s\n",inet_ntoa(client_in.sin_addr));
}else
{
printf("failed!\n");
}
write(c_fd,str,sizeof(str));
n_read = read(c_fd,buff,128);
if(n_read==-1)
{
printf("read failed!\n");
}
else
{
printf("%d the msg is :%s\n",n_read,buff);
}
return 0;
我们可以通过telnet 指令用来检测是否已经连接成功。但是很奇怪的就是我们用Windows的CMD连接不上虚拟机的网络。
测试成功!!!链接: 网络编程二.