为什么80%的码农都做不了架构师?>>>   

des.h

/*********************************************************************/
/*-文件名:des.h
/*-功能: 实现DES加密算法的加密解密功能    for linux
/*********************************************************************/
#define SUCCESS 1;
typedef  int INT32;
typedef  char INT8;
typedef  unsigned char  ULONG8;
typedef  unsigned short ULONG16;
typedef  unsigned long  ULONG32;
static const ULONG8 DESENCRY=11;
static const ULONG8 DESDECRY=22;
static const ULONG8  pc_first[64] = {/*初始置换IP*/58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7 } ;
static const ULONG8 pc_last[64] = { /*逆初始置换IP-1*/40,8,48,16,56,24,64,32, 39,7,47,15,55,23,63,31,38,6,46,14,54,22,62,30, 37,5,45,13,53,21,61,29,36,4,44,12,52,20,60,28, 35,3,43,11,51,19,59,27,34,2,42,10,50,18,58,26, 33,1,41,9,49,17,57,25};
static const ULONG32  pc_by_bit[64] = { /*按位取值或赋值*/0x80000000L,0x40000000L,0x20000000L,0x10000000L, 0x8000000L, 0x4000000L, 0x2000000L, 0x1000000L, 0x800000L, 0x400000L,0x200000L, 0x100000L,  0x80000L, 0x40000L, 0x20000L,0x10000L, 0x8000L, 0x4000L, 0x2000L, 0x1000L, 0x800L, 0x400L, 0x200L,0x100L, 0x80L,0x40L,0x20L, 0x10L, 0x8L, 0x4L, 0x2L, 0x1L,0x80000000L,0x40000000L,0x20000000L,0x10000000L, 0x8000000L,0x4000000L, 0x2000000L, 0x1000000L, 0x800000L, 0x400000L,0x200000L, 0x100000L,  0x80000L, 0x40000L, 0x20000L, 0x10000L, 0x8000L, 0x4000L, 0x2000L, 0x1000L, 0x800L, 0x400L, 0x200L, 0x100L, 0x80L, 0x40L,0x20L, 0x10L, 0x8L,  0x4L, 0x2L, 0x1L,   };
static const ULONG8 des_P[32] = {/*置换运算P*/16,7,20,21, 29,12,28,17, 1,15,23,26,5,18,31,10, 2,8,24,14, 32,27,3,9,19,13,30,6, 22,11,4,25};
static const ULONG8 des_E[48] = {/*数据扩展*/32,1,2,3,4,5,4,5,6,7,8,9,8,9,10,11,12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,22,23,24,25,24,25,26,27,28,29,28,29,30,31,32,1 };
static const ULONG8 des_S[8][64] = {/*数据压缩*/{0xe,0x0,0x4,0xf,0xd,0x7,0x1,0x4,0x2,0xe,0xf,0x2,0xb,0xd,0x8,0x1,0x3,0xa,0xa,0x6,0x6,0xc,0xc,0xb,0x5,0x9,0x9,0x5,0x0,0x3,0x7,0x8,0x4,0xf,0x1,0xc,0xe,0x8,0x8,0x2,0xd,0x4,0x6,0x9,0x2,0x1,0xb,0x7,0xf,0x5,0xc,0xb,0x9,0x3,0x7,0xe,0x3,0xa,0xa,0x0,0x5,0x6,0x0,0xd  },{ 0xf,0x3,0x1,0xd,0x8,0x4,0xe,0x7,0x6,0xf,0xb,0x2,0x3,0x8,0x4,0xf,0x9,0xc,0x7,0x0,0x2,0x1,0xd,0xa,0xc,0x6,0x0,0x9,0x5,0xb,0xa,0x5,0x0,0xd,0xe,0x8,0x7,0xa,0xb,0x1,0xa,0x3,0x4,0xf,0xd,0x4,0x1,0x2,0x5,0xb,0x8,0x6,0xc,0x7,0x6,0xc,0x9,0x0,0x3,0x5,0x2,0xe,0xf,0x9},{ 0xa,0xd,0x0,0x7,0x9,0x0,0xe,0x9,0x6,0x3,0x3,0x4,0xf,0x6,0x5,0xa,0x1,0x2,0xd,0x8,0xc,0x5,0x7,0xe,0xb,0xc,0x4,0xb,0x2,0xf,0x8,0x1,0xd,0x1,0x6,0xa,0x4,0xd,0x9,0x0,0x8,0x6,0xf,0x9,0x3,0x8,0x0,0x7,0xb,0x4,0x1,0xf,0x2,0xe,0xc,0x3,0x5,0xb,0xa,0x5,0xe,0x2,0x7,0xc                                          },{ 0x7,0xd,0xd,0x8,0xe,0xb,0x3,0x5,0x0,0x6,0x6,0xf,0x9,0x0,0xa,0x3,0x1,0x4,0x2,0x7,0x8,0x2,0x5,0xc,0xb,0x1,0xc,0xa,0x4,0xe,0xf,0x9,0xa,0x3,0x6,0xf,0x9,0x0,0x0,0x6,0xc,0xa,0xb,0xa,0x7,0xd,0xd,0x8,0xf,0x9,0x1,0x4,0x3,0x5,0xe,0xb,0x5,0xc,0x2,0x7,0x8,0x2,0x4,0xe                         },{ 0x2,0xe,0xc,0xb,0x4,0x2,0x1,0xc,0x7,0x4,0xa,0x7,0xb,0xd,0x6,0x1,0x8,0x5,0x5,0x0,0x3,0xf,0xf,0xa,0xd,0x3,0x0,0x9,0xe,0x8,0x9,0x6,0x4,0xb,0x2,0x8,0x1,0xc,0xb,0x7,0xa,0x1,0xd,0xe,0x7,0x2,0x8,0xd,0xf,0x6,0x9,0xf,0xc,0x0,0x5,0x9,0x6,0xa,0x3,0x4,0x0,0x5,0xe,0x3},{ 0xc,0xa,0x1,0xf,0xa,0x4,0xf,0x2,0x9,0x7,0x2,0xc,0x6,0x9,0x8,0x5,0x0,0x6,0xd,0x1,0x3,0xd,0x4,0xe,0xe,0x0,0x7,0xb,0x5,0x3,0xb,0x8,0x9,0x4,0xe,0x3,0xf,0x2,0x5,0xc,0x2,0x9,0x8,0x5,0xc,0xf,0x3,0xa,0x7,0xb,0x0,0xe,0x4,0x1,0xa,0x7,0x1,0x6,0xd,0x0,0xb,0x8,0x6,0xd},{ 0x4,0xd,0xb,0x0,0x2,0xb,0xe,0x7,0xf,0x4,0x0,0x9,0x8,0x1,0xd,0xa,0x3,0xe,0xc,0x3,0x9,0x5,0x7,0xc,0x5,0x2,0xa,0xf,0x6,0x8,0x1,0x6,0x1,0x6,0x4,0xb,0xb,0xd,0xd,0x8,0xc,0x1,0x3,0x4,0x7,0xa,0xe,0x7,0xa,0x9,0xf,0x5,0x6,0x0,0x8,0xf,0x0,0xe,0x5,0x2,0x9,0x3,0x2,0xc},{ 0xd,0x1,0x2,0xf,0x8,0xd,0x4,0x8,0x6,0xa,0xf,0x3,0xb,0x7,0x1,0x4,0xa,0xc,0x9,0x5,0x3,0x6,0xe,0xb,0x5,0x0,0x0,0xe,0xc,0x9,0x7,0x2,0x7,0x2,0xb,0x1,0x4,0xe,0x1,0x7,0x9,0x4,0xc,0xa,0xe,0x8,0x2,0xd,0x0,0xf,0x6,0xc,0xa,0x9,0xd,0x0,0xf,0x3,0x3,0x5,0x5,0x6,0x8,0xb} };
static const ULONG8 keyleft[28] = {/*等分密钥*/57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36};static const ULONG8 keyright[28] = {/*等分密钥*/63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4};
static const ULONG8 lefttable[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};/*密钥移位*/
static const ULONG8 keychoose[48] ={/*密钥选取*/14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32};
static const ULONG32 wz_leftandtab[3] = {0x0 , 0x80000000 , 0xc0000000 } ;class CDesOperate
{
private:ULONG32 m_arrOutKey[16][2];/*输出的key*/ULONG32 m_arrBufKey[2];/*形成起始密钥*/INT32 MakeData(ULONG32  *left ,ULONG32  *right ,ULONG32 number) {INT32 j; ULONG32 oldright = *right;         ULONG8 rexpbuf[8] = { 0} ;ULONG32 datatmp = 0;        ULONG32 exdes_P[2] = { 0} ;                         //由32扩充至48位for ( j = 0 ; j < 48 ; j++){/*两个32位,每个存放24位*/if ( j < 24 ){if ( *right&pc_by_bit[des_E[j]-1] ){exdes_P[0] |= pc_by_bit[j] ;}            }            else{if ( *right&pc_by_bit[des_E[j]-1] ){exdes_P[1] |= pc_by_bit[j-24] ;}}}for ( j = 0 ; j < 2 ; j++){            exdes_P[j] ^= m_arrOutKey[number][j] ;}    /*由48->32*/      exdes_P[1] >>= 8 ;rexpbuf[7] = (ULONG8) (exdes_P[1]&0x0000003fL) ;exdes_P[1] >>= 6 ;rexpbuf[6] = (ULONG8) (exdes_P[1]&0x0000003fL) ;exdes_P[1] >>= 6 ;rexpbuf[5] = (ULONG8) (exdes_P[1]&0x0000003fL) ;exdes_P[1] >>= 6 ;rexpbuf[4] = (ULONG8) (exdes_P[1]&0x0000003fL) ;exdes_P[0]  >>=  8 ;rexpbuf[3] = (ULONG8) (exdes_P[0]&0x0000003fL) ;     exdes_P[0] >>= 6 ;rexpbuf[2] = (ULONG8) (exdes_P[0]&0x0000003fL) ;exdes_P[0] >>= 6 ;rexpbuf[1] = (ULONG8) (exdes_P[0]&0x0000003fL) ;exdes_P[0] >>= 6 ;rexpbuf[0] = (ULONG8) (exdes_P[0]&0x0000003fL) ;     exdes_P[0] = 0 ;exdes_P[1] = 0 ;/*由48-> 32*/*right = 0 ;for ( j = 0 ; j < 7 ; j++){*right |= des_S[j][rexpbuf[j]] ;*right <<= 4 ;}*right |= des_S[j][rexpbuf[j]] ;/*又要换位了*/datatmp = 0;for ( j = 0 ; j < 32 ; j++){if ( *right&pc_by_bit[des_P[j]-1] ){datatmp |= pc_by_bit[j] ;}}*right = datatmp ;/*一轮结束收尾操作*/                *right ^= *left;       *left = oldright;return SUCCESS;}INT32 HandleData(ULONG32 *left , ULONG8 choice){INT32  number = 0 ,j = 0;   ULONG32 *right = &left[1] ;ULONG32 tmp = 0;       ULONG32 tmpbuf[2] = { 0 };             /*第一次调整pc_first[64]*/for ( j = 0 ; j < 64 ; j++){if (j < 32 ) {if ( pc_first[j] > 32)/*属于right*/{if ( *right&pc_by_bit[pc_first[j]-1] ){tmpbuf[0] |= pc_by_bit[j] ;}}else{if ( *left&pc_by_bit[pc_first[j]-1] ){tmpbuf[0] |= pc_by_bit[j] ;}}}else{if ( pc_first[j] > 32)/*属于right*/{if ( *right&pc_by_bit[pc_first[j]-1] ){tmpbuf[1] |= pc_by_bit[j] ;}}else{if ( *left&pc_by_bit[pc_first[j]-1] ){tmpbuf[1] |= pc_by_bit[j] ;}}}}*left  = tmpbuf[0];*right = tmpbuf[1];tmpbuf[0] = 0 ;tmpbuf[1] = 0 ;switch(choice){case DESENCRY:for ( number = 0 ; number < 16 ; number++){            MakeData( left , right , (ULONG32)number);}break;case DESDECRY:for (number=15;number>=0;number--){            MakeData( left , right ,(ULONG32)number);}break;default:break;}/*最后一轮操作不交换左右值*/tmp = *left ;*left = *right ;*right = tmp ;        /*最后一次调整pc_last[64]*/for ( j = 0 ; j < 64 ; j++){if (j < 32 ) {if ( pc_last[j] > 32)/*属于right*/{if ( *right&pc_by_bit[pc_last[j]-1] ){tmpbuf[0] |= pc_by_bit[j] ;}}else{if ( *left&pc_by_bit[pc_last[j]-1] ){tmpbuf[0] |= pc_by_bit[j] ;}}}else{if ( pc_last[j] > 32)/*属于right*/{if ( *right&pc_by_bit[pc_last[j]-1] ){tmpbuf[1] |= pc_by_bit[j] ;}}else{if ( *left&pc_by_bit[pc_last[j]-1] ){tmpbuf[1] |= pc_by_bit[j] ;}}}}*left =  tmpbuf[0] ;*right = tmpbuf[1];return SUCCESS;}INT32 MakeKey(  ULONG32 *keyleft,ULONG32 *keyright ,ULONG32 number){ULONG32 tmpkey[2] ={0};ULONG32 *Ptmpkey = (ULONG32*)tmpkey;     ULONG32 *Poutkey = (ULONG32*)&m_arrOutKey[number]; INT32 j;        memset((ULONG8*)tmpkey,0,sizeof(tmpkey));          /*要最高的一位或两位*/*Ptmpkey = *keyleft&wz_leftandtab[lefttable[number]] ;           Ptmpkey[1] = *keyright&wz_leftandtab[lefttable[number]] ;              if ( lefttable[number] == 1){*Ptmpkey >>= 27;Ptmpkey[1] >>= 27;}else{*Ptmpkey >>= 26;Ptmpkey[1] >>= 26;                    }Ptmpkey[0] &= 0xfffffff0;Ptmpkey[1] &= 0xfffffff0;/*得到高位的值*/*keyleft <<= lefttable[number] ;*keyright <<= lefttable[number] ;*keyleft |= Ptmpkey[0] ;*keyright |= Ptmpkey[1] ;            Ptmpkey[0] = 0;Ptmpkey[1] = 0;/*从56位中选出48位,3个16位*/for ( j = 0 ; j < 48 ; j++){if ( j < 24 ){if ( *keyleft&pc_by_bit[keychoose[j]-1]){Poutkey[0] |= pc_by_bit[j] ;}                   }            else /*j>=24*/{                   if ( *keyright&pc_by_bit[(keychoose[j]-28)]){Poutkey[1] |= pc_by_bit[j-24] ;}                   }}return SUCCESS;}INT32 MakeFirstKey( ULONG32 *keyP ){ULONG32 key[2] = {0};ULONG32 *Pkey ;ULONG32 *Pbufkey ;INT32 j; Pbufkey = (ULONG32*)m_arrBufKey ;Pkey = (ULONG32*)key;memset((ULONG8*)m_arrBufKey,0,sizeof(m_arrBufKey));    memcpy((ULONG8*)&key,(ULONG8*)keyP ,8) ;      memset((ULONG8*)m_arrOutKey,0,sizeof(m_arrOutKey));for(  j = 0 ; j < 28 ; j++){if ( keyleft[j] > 32 ) {if ( Pkey[1]&pc_by_bit[keyleft[j]-1] ){Pbufkey[0] |= pc_by_bit[j] ;}}else{if ( Pkey[0]&pc_by_bit[keyleft[j]-1] ){Pbufkey[0] |= pc_by_bit[j] ;}}if ( keyright[j] > 32 ) {if ( Pkey[1]&pc_by_bit[keyright[j]-1] ){Pbufkey[1] |= pc_by_bit[j];}}else{if ( Pkey[0]&pc_by_bit[keyright[j]-1] ){Pbufkey[1] |= pc_by_bit[j];}}}for (j = 0 ; j < 16 ; j++){MakeKey(&Pbufkey[0],&Pbufkey[1] , j ) ;}return SUCCESS;}public:CDesOperate(){for(int i =0 ;i<2;i++){for(int j = 0;j<16;j++){this->m_arrOutKey[j][i] = 0;}this->m_arrBufKey[i] = 0;}}INT32 Encry(char* pPlaintext,int nPlaintextLength,char *pCipherBuffer,int &nCipherBufferLength, char *pKey,int nKeyLength){if(nKeyLength != 8){return 0;}MakeFirstKey((ULONG32 *)pKey);int nLenthofLong = ((nPlaintextLength+7)/8)*2;if(nCipherBufferLength<nLenthofLong*4){//out put buffer is not enoughnCipherBufferLength=nLenthofLong*4;return 0;}memset(pCipherBuffer,0,nCipherBufferLength);ULONG32 *pOutPutSpace = (ULONG32 *)pCipherBuffer;ULONG32 *pSource;if(nPlaintextLength != sizeof(ULONG32)*nLenthofLong){pSource = new ULONG32[nLenthofLong];memset(pSource,0,sizeof(ULONG32)*nLenthofLong);memcpy(pSource,pPlaintext,nPlaintextLength);}else{pSource = (ULONG32 *)pPlaintext;}ULONG32 gp_msg[2] = {0,0};for (int i=0;i<(nLenthofLong/2);i++){gp_msg[0] = pSource[2*i];gp_msg[1] =pSource[2*i+1];HandleData(gp_msg,DESENCRY);pOutPutSpace[2*i] = gp_msg[0];pOutPutSpace[2*i+1] = gp_msg[1];}if(pPlaintext!=(char *)pSource){delete []pSource;}return SUCCESS;}INT32 Decry(char* pCipher,int nCipherBufferLength,char *pPlaintextBuffer, int &nPlaintextBufferLength, char *pKey,int nKeyLength){if(nCipherBufferLength%8!=0){return 0;}if(nPlaintextBufferLength<nCipherBufferLength){nPlaintextBufferLength = nCipherBufferLength;return 0;}if(nKeyLength != 8){return 0;}MakeFirstKey((ULONG32 *)pKey);memset(pPlaintextBuffer,0,nPlaintextBufferLength);ULONG32 *pSouce = (ULONG32 *)pCipher;ULONG32 *pDest = (ULONG32 *)pPlaintextBuffer;ULONG32 gp_msg[2] = {0,0};for (int i=0;i<(nCipherBufferLength/8);i++){gp_msg[0] = pSouce[2*i];gp_msg[1] = pSouce[2*i+1];HandleData(gp_msg,DESDECRY);pDest[2*i] = gp_msg[0];pDest[2*i+1] = gp_msg[1];}return SUCCESS;}
};

chat.cpp

#include <stdio.h>
#include <netdb.h>
#include <unistd.h>
#include <iostream>
#include <stdlib.h>
#include <errno.h>
#include <net/if.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <memory.h>
#include <sys/ioctl.h>
#include "des.h"
using namespace std;
#define SERVERPORT 9527
#define BUFFERSIZE 32
char strStdinBuffer[BUFFERSIZE];
char strSocketBuffer[BUFFERSIZE];
char strEncryBuffer[BUFFERSIZE];
char strDecryBuffer[BUFFERSIZE];
void SecretChat(int nSock,char *pRemoteName, char *pKey)
{CDesOperate cDes;if(strlen(pKey)!=8){printf("Key length error");return ;}pid_t nPid;nPid = fork();if(nPid != 0){while(1){bzero(&strSocketBuffer, BUFFERSIZE);int nLength = 0;nLength = recv(nSock, strSocketBuffer,BUFFERSIZE,0);if(nLength !=BUFFERSIZE){break;}else{int nLen = BUFFERSIZE;cDes.Decry(strSocketBuffer,BUFFERSIZE,strDecryBuffer,nLen,pKey,8);strDecryBuffer[BUFFERSIZE-1]=0;if(strDecryBuffer[0]!=0&&strDecryBuffer[0]!='\n'){printf("Receive message form <%s>: %s\n", pRemoteName,strDecryBuffer);if(0==memcmp("quit",strDecryBuffer,4)){printf("Quit!\n");break;}}}}}else{ while(1){bzero(&strStdinBuffer, BUFFERSIZE);while(strStdinBuffer[0]==0){if (fgets(strStdinBuffer, BUFFERSIZE, stdin) == NULL) {continue;}}      int nLen = BUFFERSIZE;cDes.Encry(strStdinBuffer,BUFFERSIZE,strEncryBuffer,nLen,pKey,8);if(send(nSock, strEncryBuffer, BUFFERSIZE,0)!=BUFFERSIZE){perror("send");}else{if(0==memcmp("quit",strStdinBuffer,4)){printf("Quit!\n");break;}}}}
}
int main(int argc,char * [])
{printf("Client or Server?\r\n");cin>>strStdinBuffer;if(strStdinBuffer[0]=='c'||strStdinBuffer[0]=='C'){//be a clientchar strIpAddr[16];printf("Please input the server address:\r\n");cin>>strIpAddr;int nConnectSocket, nLength;struct sockaddr_in sDestAddr;if ((nConnectSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("Socket");exit(errno);}bzero(&sDestAddr, sizeof(sDestAddr));sDestAddr.sin_family = AF_INET;sDestAddr.sin_port = htons(SERVERPORT);sDestAddr.sin_addr.s_addr = inet_addr(strIpAddr);/* 连接服务器 */if (connect(nConnectSocket, (struct sockaddr *) &sDestAddr, sizeof(sDestAddr)) != 0) {perror("Connect ");exit(errno);}else{printf("Connect Success!  \nBegin to chat...\n");SecretChat(nConnectSocket,strIpAddr,"benbenmi");}close(nConnectSocket);  }else{//be a serverint nListenSocket, nAcceptSocket;socklen_t nLength = 0;struct sockaddr_in sLocalAddr, sRemoteAddr;if ((nListenSocket = socket(PF_INET, SOCK_STREAM, 0)) == -1) {perror("socket");exit(1);}bzero(&sLocalAddr, sizeof(sLocalAddr));sLocalAddr.sin_family = PF_INET;sLocalAddr.sin_port = htons(SERVERPORT);sLocalAddr.sin_addr.s_addr = INADDR_ANY;if (bind(nListenSocket, (struct sockaddr *) &sLocalAddr, sizeof(struct sockaddr))== -1){perror("bind");exit(1);}if (listen(nListenSocket, 5) == -1) {perror("listen");exit(1);}printf("Listening...\n");nLength = sizeof(struct sockaddr);if ((nAcceptSocket = accept(nListenSocket, (struct sockaddr *) &sRemoteAddr,&nLength)) == -1) {perror("accept");exit(errno);} else{close(nListenSocket);printf("server: got connection from %s, port %d, socket %d\n",inet_ntoa(sRemoteAddr.sin_addr),ntohs(sRemoteAddr.sin_port), nAcceptSocket);SecretChat(nAcceptSocket,inet_ntoa(sRemoteAddr.sin_addr),"benbenmi");close(nAcceptSocket);}}
}

转载于:https://my.oschina.net/ism/blog/363632

Linux下DES安全通信编程相关推荐

  1. linux c语言工具,Linux下C语言编程环境的工具.doc

    Linux下C语言编程环境的工具 Linux下C语言编程环境的工具 Linux下C语言编程环境的工具 要想在Linux下进行C语言编程,首先得搭建好一个编程环境.这里分别说明一下几个非常有用的软件包. ...

  2. Linux下C语言编程-进程的创建

    Linux下C语言编程-进程的创建 作者:hoyt 1.进程的概念 Linux操作系统是面向多用户的.在同一时间可以有许多用户向操作系统发出各种命令.那么操作系统是怎么实现多用户的环境呢?在现代的操作 ...

  3. linux下的c编程

    vi编译器简介 vi的三种模式,分别为命令行模式,插入模式以及底行模式,这里游客去看,这里提供好几个小技巧:G表示移动到文件末尾nG表示移动到第几行 gcc优化选项 gcc可以对代码进行优化,他可以通 ...

  4. linux+下c语言编程项目,精通UNIX下C语言编程与项目实践

    cc -I  //include 目录 -L //静态库目录?动态也可以 -l //小写L,接静态库名称?动态也可以 -DXXX='"XXFF"' //-D直接定义宏 -c 只编译 ...

  5. 您知道Linux下C语言编程的一些注意事项吗_教育中国

    您知道Linux下C语言编程的一些注意事项吗_教育中国 云风的 BLOG: 一个 C 接口设计的问题 一个 C 接口设计的问题 C 语言在本质上,参数传递都是值传递.不像 Pascal 和 C++ 可 ...

  6. Linux下TCP网络编程-创建服务器与客户端

    一.前言 互联网概念诞生于20世纪60年代末,从9几年中国接入互联网开始到现在,生活的每个角落都能看到网络的使用.现在物联网时代.共享经济的到来,生活中不仅仅电脑.手机可以接入网络,身边的各个设备也能 ...

  7. c 调用 linux驱动程序,Linux下的C编程实战(五)――驱动程序设计

    Linux下的C编程实战(五) ――驱动程序设计 1.引言 设备驱动程序是操作系统内核和机器硬件之间的接口,它为应用程序屏蔽硬件的细节,一般来说,Linux的设备驱动程序需要完成如下功能: (1)初始 ...

  8. linux c语言 ppt,Linux下C语言编程.ppt

    Linux下C语言编程 Linux中C语言的重要性 Linux和C天生有不解之缘. Linux操作系统的内核主要是用C写的,另外Linux下的很多软件也是用C写的,特别是一些著名的服务软件,比如MyS ...

  9. C——Linux下的串口编程

    原 C--Linux下的串口编程 2017年06月06日 19:30:50 C_Aya 阅读数:11537 <span class="tags-box artic-tag-box&qu ...

最新文章

  1. python并发发送http请求_用python异步发送http请求来提升效率
  2. CCAI 2020 | 史元春:走出AI伦理困境「演讲回顾」
  3. 06.系统编程-2.线程
  4. 用计算机计算性别,2018预测生男生女计算器 超准的怀孕计算器查生男生女
  5. mysql查看已打开文件数_[MySQL FAQ]系列 -- mysql如何计算打开文件数
  6. Flex builder3 调试弹出窗口Flex builder cannot locate the required version of Flash Player解决办法
  7. 选购家用安防摄像头,考虑室内还是室外,无线还是有线
  8. 编程中取名,有什么需要注意?
  9. 华为更新系统10.1显示连接服务器失败,emui10.1正式版-华为emui10.1系统更新正式版预约 -优盘手机站...
  10. 用PPT制作简单海报
  11. java从零到项目实战(八)
  12. IP协议+以太网协议
  13. rtx2060为什么叫智商卡_二哈拆家,却把自己卡在了沙发里,智商确实令人捉急...
  14. 数控机床的基本组成包括哪些?
  15. verliog中有reg[7:0] mem[0:255]的写法,那么这跟直接用一个RAM有什么区别
  16. 本地计算机t3服务服务启动后停止,T3服务启动后又停止了
  17. [zz]Memory Barriers(内存屏障): a Hardware View for Software Hackers 阅读笔记
  18. MATLAB数字图像处理系统[多功能]
  19. Docker在英雄联盟游戏中的实践探索(二)
  20. 2022-01-22 每日打卡:难题精刷

热门文章

  1. 突发!神评论:VMware公司要被英特尔“吞并”了么?
  2. 计算机网络(2)——标准化工作及相关组织
  3. Socket编程5种模型——以代码说明一切,hhhhh
  4. 构建之法10,11,12章的读后感
  5. Thinkphp6使用pdo_odbc连接SQL Server2000
  6. java lang ill_请MATLAB高手帮忙我的MATLAB老出现以下东西,这些东东还刷的挺快,不按ESC都不停止.java.lang.Ill...
  7. MDT/UML2/Getting Started with UML2及我自己的一些理解
  8. 关于CC2541OTA升级的coed区溢出与bin文件生成问题
  9. (free)Windows下的stegdetect下载链接
  10. 并行程序设计方法实验(包括openmp、向量化实现pi计算、SPECOMP2012测试、矩阵乘法优化)