linux .sock?linux软件安装包
linux下的 socket编程问题!
第一个问题:
对,是那样的,用open打开文件,用read读取文件,在发送给对方,接收方接收到后,写入文件就可以了。不过在这个过程中最好别用字符串函数,除非你很熟悉。
第二个问题
首先你得去搞清楚什么是线程,什么是进程,fork出来的叫进程,pthread_create出来的才叫线程。服务器有很多种模型(多进程,多线程,select,epoll模型,这个我的blog上有,famdestiny.cublog.cn),不一定要用多进程。
给你写了个代码,自己先看看:
注意,在自己的目录下创建一个叫pserverb的文件,程序会把这个文件复制成test文件。你可以自己根据需要改改
server:
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<errno.h>
#include<signal.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<string.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#define SERV_PORT 5358
#define MAX_CONN 10
#define BUF_LEN 1024
void str_echo(FILE*fp, int sockfd){
ssize_t nread;
int file_fd;
char buf[BUF_LEN]={0};
file_fd= open("test", O_WRONLY| O_TRUNC| O_CREAT, 0755);
while(1){
bzero(buf, BUF_LEN);
if((nread= read(sockfd, buf, BUF_LEN))==-1){
if(errno== EINTR){
continue;
}
else{
printf("readn error:%s\n", strerror(errno));
continue;
}
}
else if(nread== 0){
break;
}
else{
printf("%s\n", buf);
write(file_fd, buf, nread);
}
}
close(file_fd);
}
void sig_chld(int sig){
pid_t pid;
int state;
while((pid= waitpid(-1,&state, WNOHANG))> 0){
printf("child process%d exited.", pid);
}
return;
}
int main(int argc, char**argv)
{
int listenfd, connfd;
socklen_t cliaddrlen;
pid_t childpid;
struct sockaddr_in servaddr, cliaddr;
if((listenfd= socket(AF_INET, SOCK_STREAM, 0))==-1){
printf("socket error:%s\n", strerror(errno));
return 0;
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family= AF_INET;
servaddr.sin_addr.s_addr= htonl(INADDR_ANY);
servaddr.sin_port= htons(SERV_PORT);
if(bind(listenfd,(struct sockaddr*)&servaddr, sizeof(servaddr))==-1){
printf("bind error:%s\n", strerror(errno));
return 0;
}
if(listen(listenfd, MAX_CONN)==-1){
printf("listen error:%s\n", strerror(errno));
return 0;
}
signal(SIGCHLD, sig_chld);
while(1){
cliaddrlen= sizeof(cliaddr);
if((connfd= accept(listenfd,(struct sockaddr*)&cliaddr,&cliaddrlen))==-1){
if(errno== EINTR){
continue;
}
else{
printf("accept error:%s\n", strerror(errno));
continue;
}
}
if((childpid= fork())== 0){
close(listenfd);
str_echo(stdin, connfd);
exit(0);
}
else if(childpid> 0){
close(connfd);
}
else{
printf("fork error!\n");
continue;
}
}
}
client:
#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#define SERV_ADDR"127.0.0.1"
#define SERV_PORT 5358
#define BUF_LEN 1024
void str_cli(char*path, int sockfd)
{
char sendbuf[BUF_LEN]={0};
int fd, n;
if((fd= open("./pserverb", O_RDONLY))==-1){
printf("%s\n", strerror(errno));
exit(0);
}
while((n= read(fd, sendbuf, BUF_LEN))!= 0){
if(n< 0){
printf("%s\n", strerror(errno));
exit(0);
}
write(sockfd, sendbuf, n);
bzero(sendbuf, BUF_LEN);
}
close(fd);
return;
}
int main(int argc, char**argv)
{
int fd;
struct sockaddr_in servaddr;
fd= socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family= AF_INET;
servaddr.sin_addr.s_addr= inet_addr(SERV_ADDR);
servaddr.sin_port= htons(SERV_PORT);
if(connect(fd,(struct sockaddr*)&servaddr, sizeof(servaddr))==-1){
printf("connect error:%s\n", strerror(errno));
return 0;
}
str_cli(argv[1], fd);
return 0;
}
linux socket和sock结构体的区别
//**************************************************************************
/* 1、每一个打开的文件、socket等等都用一个file数据结构代表,这样文件和socket就通过inode->u(union)中的各个成员来区别:
struct inode{
.....................
union{
struct ext2_inode_info ext2_i;
struct ext3_inode_info ext3_i;
struct socket socket_i;
.....................
} u;};
2、每个socket数据结构都有一个sock数据结构成员,sock是对socket的扩充,两者一一对应,socket->sk指向对应的sock,sock->socket
指向对应的socket;
3、socket和sock是同一事物的两个侧面,为什么不把两个数据结构合并成一个呢?这是因为socket是inode结构中的一部分,即把inode结
构内部的一个union用作socket结构。由于插口操作的特殊性,这个数据结构中需要有大量的结构成分,如果把这些成分全部放到socket
结构中,则inode结构中的这个union就会变得很大,从而inode结构也会变得很大,而对于其他文件系统这个union是不需要这么大的,
所以会造成巨大浪费,系统中使用inode结构的数量要远远超过使用socket的数量,故解决的办法就是把插口分成两部分,把与文件系
统关系密切的放在socket结构中,把与通信关系密切的放在另一个单独结构sock中;
*/
struct socket
{
socket_state state;//该state用来表明该socket的当前状态
typedef enum{
SS_FREE= 0,/* not allocated*/
SS_UNCONNECTED,/* unconnected to any socket*/
SS_CONNECTING,/* in process of connecting*/
SS_CONNECTED,/* connected to socket*/
SS_DISCONNECTING/* in process of disconnecting*/
} socket_state;
unsigned long flags;//该成员可能的值如下,该标志用来设置socket是否正在忙碌
#define SOCK_ASYNC_NOSPACE 0
#define SOCK_ASYNC_WAITDATA 1
#define SOCK_NOSPACE 2
struct proto_ops*ops;//依据协议邦定到该socket上的特定的协议族的操作函数指针,例如IPv4 TCP就是inet_stream_ops
struct inode*inode;//表明该socket所属的inode
struct fasync_struct*fasync_list;//异步唤醒队列
struct file*file;//file回指指针
struct sock*sk;//sock指针
wait_queue_head_t wait;//sock的等待队列,在TCP需要等待时就sleep在这个队列上
short type;//表示该socket在特定协议族下的类型例如SOCK_STREAM,
unsigned char passcred;//在TCP分析中无须考虑
};
linux.sock文件解析linux.sock
Linux的协议栈是什么呢?
Linux网络协议栈基于分层的设计思想,总共分为四层,从下往上依次是:物理层,链路层,网络层,应用层。Linux网络协议栈其实是源于BSD的协议栈,它向上以及向下的接口以及协议栈本身的软件分层组织的非常好。Linux的协议栈基于分层的设计思想,总共分为四层,从下往上依次是:物理层,链路层,网络层,应用层。物理层主要提供各种连接的物理设备,如各种网卡,串口卡等;链路层主要指的是提供对物理层进行访问的各种接口卡的驱动程序,如网卡驱动等;网路层的作用是负责将网络数据包传输到正确的位置,最重要的网络层协议当然就是IP协议了,其实网络层还有其他的协议如ICMP,ARP,RARP等,只不过不像IP那样被多数人所熟悉;传输层的作用主要是提供端到端,说白一点就是提供应用程序之间的通信,传输层最着名的协议非TCP与UDP协议末属了;应用层,顾名思义,当然就是由应用程序提供的,用来对传输数据进行语义解释的“人机界面”层了,比如HTTP,SMTP,FTP等等,其实应用层还不是人们最终所看到的那一层,最上面的一层应该是“解释层”,负责将数据以各种不同的表项形式最终呈献到人们眼前。Linux网络核心架构Linux的网络架构从上往下可以分为三层,分别是:用户空间的应用层。内核空间的网络协议栈层。物理硬件层。其中最重要最核心的当然是内核空间的协议栈层了。Linux网络协议栈结构Linux的整个网络协议栈都构建与LinuxKernel中,整个栈也是严格按照分层的思想来设计的,整个栈共分为五层,分别是:
1,系统调用接口层,实质是一个面向用户空间应用程序的接口调用库,向用户空间应用程序提供使用网络服务的接口。
2,协议无关的接口层,就是SOCKET层,这一层的目的是屏蔽底层的不同协议(更准确的来说主要是TCP与UDP,当然还包括RAWIP,SCTP等),以便与系统调用层之间的接口可以简单,统一。简单的说,不管我们应用层使用什么协议,都要通过系统调用接口来建立一个SOCKET,这个SOCKET其实是一个巨大的sock结构,它和下面一层的网络协议层联系起来,屏蔽了不同的网络协议的不同,只吧数据部分呈献给应用层(通过系统调用接口来呈献)。
3,网络协议实现层,毫无疑问,这是整个协议栈的核心。这一层主要实现各种网络协议,最主要的当然是IP,ICMP,ARP,RARP,TCP,UDP等。这一层包含了很多设计的技巧与算法,相当的不错。
4,与具体设备无关的驱动接口层,这一层的目的主要是为了统一不同的接口卡的驱动程序与网络协议层的接口,它将各种不同的驱动程序的功能统一抽象为几个特殊的动作,如open,close,init等,这一层可以屏蔽底层不同的驱动程序。
5,驱动程序层,这一层的目的就很简单了,就是建立与硬件的接口层。可以看到,Linux网络协议栈是一个严格分层的结构,其中的每一层都执行相对独立的功能,结构非常清晰。其中的两个“无关”层的设计非常棒,通过这两个“无关”层,其协议栈可以非常轻松的进行扩展。在我们自己的软件设计中,可以吸收这种设计方法。
linux系统mysql数据库怎么修改数据库存放路径?
mnt目录下建立mysql_data目录#cd/mnt#mkdirmysql_data把MySQL服务服务停掉。#servicemysqlstop把/var/lib/mysql整个目录移到/mnt/mysql_data。#mv/usr/local/mysql/data/mnt/mysql_data重新设置数据权限。#cd/mnt/mysql_data修改my.cnf配置文件#vi/etc/my.cnf指明mysql.sock文件的产生位置。用符号#注释掉原来socket,修改MySQL启动脚本。#vi/etc/init.d/mysql找到datadir。datadir=/mnt/mysql_data7重启mysql服务#servicemysqlstart好了,至此数据库目录位置已迁移完毕。
clash代理模式规则?
Clash是一个用Go语言开发,基于规则的多平台代理客户端,兼容Shadowsocks、VMess、Trojan和Snell等协议,而且拥有像Surge一样强大的自定义代理规则。
Clash具有自动测速、自动判断是否需要加速、自动选择高速节点的功能。目前,Clash占用内存和系统资源非常低,已经衍生出支持Windows、Mac、Linux、Android以及网关路由器等设备平台的GUI客户端,但是并没有iOS系统的移植版本。