Menu Home

linux

linux c 使用socket处理HTTP请求

#include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <time.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/select.h> #define BUFSIZE 4096 int main(int argc, char **argv) { int sockfd; struct sockaddr_in servaddr; charhttpRequest[BUFSIZE], buf[BUFSIZE]; bzero(httpRequest, sizeof(httpRequest)); //构建请求信息,这里请求http://192.168.2.184:8090/test.flv,这是一个由ffserver搭建的流媒体服务 strcat(httpRequest, “GET /test.flv HTTP/1.1\n”); strcat(httpRequest, “Host: 192.168.2.184:8090\n”); strcat(httpRequest, “User-Agent: Mozilla/5.0 (X11; […]

linux网络编程: AF_INET, AF_INET6, AF_UNSPEC

int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); struct addrinfo { int ai_flags; int ai_family; int ai_socktype; int ai_protocol; socklen_t ai_addrlen; struct sockaddr *ai_addr; char *ai_canonname; struct addrinfo *ai_next; }; ai_family参数指定调用者期待返回的套接口地址结构的类型。 它的值包括三种: AF_INET: 函数返回IPV4相关的地址信息 AF_INET6: 函数返回IPV6相关的地址信息 AF_UNSPEC: 函数返回的是适用于指定主机名和服务名且适合任何协议族的地址 如果某个主机既有AAAA记录(IPV6)地址,同时又有A记录(IPV4)地址,那么AAAA记录将作为sockaddr_in6结构返回,而A记录则作为sockaddr_in结构返回。 ref: http://blog.sina.com.cn/s/blog_8184e033010134c4.html

Linux线程的调度策略与优先级

调度策略有3种: SCHED_OTHER: 分时调度策略。线程的默认策略。此策略不能设置线程优先级。 SCHED_FIFO: 实时调度策略,先到先服务。一旦线程占用cpu则一直运行。直到有更高优先级任务到达或自己放弃。此策略可设置线程优先级。 SCHED_RR: 实时调度策略,时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。保证了所有具有相同优先级的RR任务的调度公平此策略可设置线程优先级。 这3个宏在 sched.h 中定义。 线程优先级: 不同操作系统的优先级范围是不相同的,所以在设置线程优先级的时候需要先使用下面2个函数来查询其最大值和最小值: int sched_get_priority_max(int policy); int sched_get_priority_min(int policy); 参数policy是上面介绍的调度策略中的SCHED_FILO或SCHED_RR,注意不能是SCHED_OTHER,因为SCHED_OTHER不支持优先级。 查询和设置调度策略: int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param); int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param); 查询和设置线程优先级: 查询: struct sched_param param; //首先查询线程的调度策略,赋给param //参数attr是create线程时所使用的线程属性 pthread_attr_getschedparam(attr, &param); //从sched_param结构中获取线程优先级 param.__sched_priority; 设置: pthread_attr attr; struct sched_param param; […]

nvidia显卡的xorg配置

生成xorg配置 如果发现系统/etc/X11/xorg.conf文件丢失,你可以使用下面的命令生成一个新的xorg.conf文件 $ X –configure 新生成的xorg.conf.new一般在用户目录下,具体路径请查看输出结果,得到xorg.conf.new文件后需要把它拷贝到/etc/X11/下,并且更改文件名为xorg.conf。如果这个自动生成的文件不符合需求就需要根据具体情况做相应的修改。当然,更方便的方法就使从别的机器上拷贝/etc/X11/xorg.conf到你的系统中,针对Nvidia显卡的xorg配置都使通用的,然后再做相应的修改。 单屏xorg的配置 xorg.conf内容 # nvidia-xconfig: X configuration file generated by nvidia-xconfig # nvidia-xconfig: version 260.19.44 ([email protected]) Sun Feb 27 21:50:39 PST 2011 Section “ServerLayout” InputDevice “irtouch” “SendCoreEvents” Identifier “Layout0” Screen 0 “Screen0” InputDevice “Keyboard0” “CoreKeyboard” InputDevice “Mouse0” “CorePointer” Option “Xinerama” “0” EndSection Section “Files” EndSection […]

Linux串口编程详解

串口本身,标准和硬件 串口是计算机上的串行通讯的物理接口。计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备。虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口。虽然现在在很多个人计算机上,原来用以连接外部设备的串口已经广泛的被USB和Firewire替代;而原来用以连接网络的串口则被以太网替代,还有用以连接终端的串口设备则已经被MDA或者VGA取而代之。但是,一方面因为串口本身造价便宜技术成熟,另一方面因为串口的控制台功能RS-232标准高度标准化并且非常普及,所以直到现在它仍然被广泛应用到各种设备上。 某些计算机使用一个叫做UART的集成电路来作为串口设备。这个集成电路可以进行字符和异步串行通讯序列之间的转换,并且可以自动地处理数据的时序。而某些低端设备则会让CPU直接通过输出针来传送数据,这种技术叫做bit-banging。 因为“串口”,RS-232和UARTs基本上总是在同一个语境中出现,所以这些名词通常会被搞混。下面逐一解释以下一些重要的名词和术语。 什么是串行通信 计算机可以每次传送一个或者多个位(bit)的数据。“串行”指的式每次只传输一位(1bit)数据。 当需要通过串行通讯传输一个字(word)的数据时,只能以每次一位的方式接收或者发送。每个位可能是on(1)或者off(0)。很多技术术语中经常用mark表示on,而space表示off。 串行数据的速度通常用每秒传输的字节数bits-per-second(bps)或者波特率(baud)表示。这个值表示的是每秒钟被送出的0和1的个数。很久很久以前,300bps就是很快的速度了,而现在的电脑可以处理高达430,800的RS-232速率。表示波特率的单位还有kpbs和Mbps,1kps=1000bps而1Mbps=1000kbps。 一般有人提到串行设备的时候,它通常说可能是某种数据通讯设备-DCE(Data Communications Equipment)或者数据终端设备-DTE(Data Terminal Equipment)。它们之间的区别非常简单,每个信号对,比如传送和接收,它们俩正好是相反的。如果需要将两个DTE或者DCE设备连接起来的话,需要适配器或者交叉线缆将信号对交换。

linux coredump调试

os : ubuntu 12.04 开启coredump: ulimit -c 1024 g++ 添加编译参数: g++ -g -ggdb 执行程序,crash后会在项目文件夹中生成core文件,使用core文件调试: gdb –core=core 接下来就是常规gdb调试, 如需要导入源代码,在gdb中执行: file

ffmpeg的内部Video Buffer管理和传送机制

ffmpeg的内部Video Buffer管理和传送机制 本文主要介绍ffmpeg解码器内部管理Video Buffer的原理和过程,ffmpeg的Videobuffer为内部管理,其流程大致为:注册处理函数->帧级释放->帧级申请->清空。 1 注册get_buffer()和release_buffer() FFAPI_InitCodec() avcodec_alloc_context() avcodec_alloc_context2() avcodec_get_context_default2(AVCodecContext *s,…){ …… s->get_buffer = avcodec_default_get_buffer; s->release_buffer = avcodec_default_release_buffer; …… } 2帧级的内存申请和释放调用

开机自动启动x11vnc脚本

#!/bin/sh while true do AUTH_ID=`ps -ef | grep auth | grep -v grep |grep -v xinitrc | awk ‘{print $13}’` if [ “$AUTH_ID” = “” ];then echo “waiting for ready, retry 10s later…” else x11vnc -auth $AUTH_ID -display :0 -xdamage -ncache_cr fi sleep 10 done os: opensuse 11.4

linux c清理系统文件缓存—— posix_fadvise

OS : opensuse11.4 需求:判断磁盘是否存在,不想搞的很复杂也不想用写的方式来确定磁盘的存在,所以就想用读的方式来确定,但是呢,系统有cache,所有即使在拔去硬盘的情况下依然能读到文件,尝试了O_SYNC O_DIRECT对read都无效,搞了整1天,汗流浃背,找啊找啊,用posix_fadvise可以达到目的。有别的简单方法的,求指教。 ps : 一个好工具vmtouch 代码示例:

linux kernel driver自动创建设备

static int watchdog_init(void) { wdt_major = register_chrdev(0, “lte8718wdt”, <e8718wdt_fopts); wdt_class = class_create(THIS_MODULE, wdt_name); device_create(wdt_class, NULL, MKDEV(wdt_major, 0), NULL, wdt_name); } static int watchdog_exit(void) { device_destroy(wdt_class, MKDEV(wdt_major, 0)); class_destroy(wdt_class); unregister_chrdev(lte8718wdt_major, “lte8718wdt”); }

mac下vim + taglist + ctags

mac下vim + taglist + ctags 1 . 下载 taglist http://www.vim.org/scripts/script.php?script_id=273 2. 解压缩后拷贝 plugin和doc文件到~/.vim文件夹,进入doc文件夹,运行vim ,输入命令:helptags . 3. 因为mac自带的ctags程序不是exuberant ctags, 所以使用时会出现问题,需要自己下载ctags编译安装到非/usr/bin 目录下: http://sourceforge.net/projects/ctags/files/ctags/5.8/ctags-5.8.tar.gz/download 4.打开vimrc配置文件加入ctags路径:let Tlist_Ctags_Cmd=’/Users/xxx/bin/ctags’

LINUX下QT For ARM开发环境

LINUX下QT For ARM开发环境 OS: ubuntu 12.1 gcc: 4.6.3 arm gcc: 4.5.1 QT: qt-x11-opensource-src-4.5.3 QT-embedded: qt-embedded-linux-opensource-src-4.5.3 编译qt-x11-opensource-src-4.5.3 ./configure –qvfb make cd tools/qvfb //进入此目录,准备对它进行编译 make sudo make install 编译过程中出现的错误: error: ‘ppd_file_t’ does not name a type 解决方法: 打开src/gui/painting/qcups_p.h做如下修改: #ifndef QT_NO_CUPS #include //加入ppd头文件 QT_BEGIN_NAMESPACE 安装 arm-linux-gcc (略) 编译qt-embedded-linux-opensource-src-4.5.3 ./configure -embedded arm -qt-libpng make […]

ubuntu下设置ftp

ubuntu下设置ftp OS: ubuntu 12.04 安装vsftpd apt-get install vsftpd 编辑 /etc/vsftpd.conf listen=YES #anonymous_enable=YES local_enable=YES write_enable=YES #anon_upload_enable=YES anonymous_enable=NO #默认是允许 dirmessage_enable=YES # 允许进入文件夹 xferlog_enable=YES # 允许 ftp 日志记录允许 connect_from_port_20=YES # 允许使用20号端口作为数据传送端口 secure_chroot_dir=/var/run/vsftpd/empty pam_service_name=vsftpd rsa_cert_file=/etc/ssl/private/vsftpd.pem 设置ftp文件夹 mkdir -p /home/ftp/upload mkdir -p /home/ftp/download chmod 755 /home/ftp chmod 777 /home/ftp/upload chmod 755 /home/ftp/download 设置ftp用户 增加ftp组:groupadd ftpgroup […]

linux c获取系统网卡信息

OS:ubuntu 12.04 int getNetCardCount() { int nCount = 0; FILE *file = fopen(“/proc/net/dev”, “r”); if(!file) { debug(“Open /proc/net/dev failed by %s !\n”, strerror(errno)); return nCount; } char szLine[512]; fgets(szLine, sizeof(szLine), file); fgets(szLine, sizeof(szLine), file); while(fgets(szLine, sizeof(szLine), file)) { char szName[128] = {0}; sscanf(szLine, “%s”, szName); int nLen = strlen(szName); if(nLen <= […]

APUE的编译问题

APUE的编译问题 本文解决一些APUE一书中例子编译过程中的问题 OS: ubuntu 12.04 问题 /usr/include/bits/timex.h:31:7:error: expect ‘:’ , ‘,’ , ‘;’ , ‘}’ or ‘__attribute__’ 解决 apue.2e/ipp/ipp.h中 #define status u.st 与 timex.h中的 status 冲突,更改 #define Status u.st 问题 ARG_MAX 未定义 解决 在include/apue.h中加入 #define ARG_MAX 4096 在threadctl/getenv1.c 加入 #include “../include/apue.h” 在threadctl/getenv3.c 加入 #include “../include/apue.h” OS: mac os 10.7.4 问题 […]

使用modeline强制屏幕分辨率

OS:ubuntu 12.04 生成Modeline cvt 1440 900 60 #命令格式:横向分辨率 纵向分辨率 刷新率 输出结果可能如下,其中Modeline行即是我们需要的: # 1440×900 59.89 Hz (CVT 1.30MA) hsync: 55.93 kHz; pclk: 106.50 MHz Modeline “1440x900_60.00” 106.50 1440 1528 1672 1904 900 903 909 934 -hsync +vsync 查看系统当前的屏幕输出端口 xrandr 我的输出结果如下: HDMI-1 connected 1920×1080+0+0 (normal left inverted right x axis y axis) […]

编译单个linux kernel 模块

kernel 编译单个模块 假设需要单独编译resiserfs内核模块: 1)make menuconfig load 一下当前目录下的.config 文件 进入文件系统选项,选择reiserfs 模块,使其前面有个M 保存退出 2)make prepare 不运行该命令make 时将会报错 3)make scripts 4)make M=fs/reiserfs 开始编译单个模块,编译完成后模块生成在fs/reiserfs.ko

确定wifi网卡是否支持hostap

确定wifi网卡是否支持hostap 对老网卡(没有使用mac80211驱动的) ethtool  -i  wlan0 sudo iwconfig wlan0  mode  master 输出: Error for wireless request “Set Mode” (8B06) : SET failed on device wlan0 ; Invalid argument. 表示不支持 对新网卡(使用mac80211驱动的) iw list  |  grep Supported   输出: * AP 表示支持hostap

iptables 代理上网

iptables 代理上网 OS : opensuse 11.4 需求 eth0 (出外网) : 192.168.1.105   gataway : 192.168.1.1 wlan0 : 192.168.8.1 解决方法 echo 1 > /proc/sys/net/ipv4/ip_forward iptabes -t nat -A POSTROUTING -o eth0 -s 192.168.80/24 -j SNAT –to 192.168.1.105

ubuntu升级nvidia driver

buntu升级nvidia driver ubuntu升级nvidia显卡驱动分以下几步完成: 删除旧版本驱动: apt-get – -purge remove nvidia-* 删除系统自带的显卡驱动: apt-get – -purge remove xserver-xorg-video-nouveau 停止ubuntu的桌面环境: /etc/init.d/lightdm stop 切换到字符终端台 安装下载的新版nvidia驱动 重启桌面环境: /etc/init.d/lightdm start