1.socket是屬於LINUX下的進程間通信的一種方式BSD,(socket)套接字。
既可以實現同一台主機間的進程間通信,也可以實現不同主機間的進程間通信,
也是操作系統給應用程序提供的用於網路通信的介面。
在Linux下,由於一切皆文件,所以socket也是一種文件。可以通過文件描述符去操作。
2.IP號:主機的唯一標識。
子網掩碼:用於判斷數據包向外網還是向內網發送。
IP地址在使用必須轉換為二進制形式(inet_addr)。
對應的埠號轉換(htons);
IP區分主機,埠號區分進程。
3.客戶端的創建(對應的函數)
(1)創建SOCKET套接字 (socket)
(2)綁定地址信息(bind)(這一步驟可以省略,系統會自動分配)
(3)發送連接請求(connect)
(4)收發消息(send/recv)
(5)關閉套接字 (close)
4.伺服器的創建(對應的函數)
(1)創建SOCKET套接字 (socket)
(2)綁定地址信息(bind)(伺服器對應的IP地址和埠號)
(3)創建一個監聽隊列(listen)
(4)接受連接請求 (accept)
(5)收發消息 (send/recv)
(6)關閉套接字 (close)
下面就是客戶端的代碼如下:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
int main()
{
//定義Internet協議結構,客戶端的IP信息
struct sockaddr_in myaddr;
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family = PF_INET;
myaddr.sin_port = htons(1314);
myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//1.創建套接字
int clientId = socket(PF_INET,SOCK_STREAM,0);
if(clientId<0)
{
perror("socket\n");
return -1;
}
printf("socket ok\n");
//2發起鏈接請求
int ret = connect(clientId,(struct sockaddr *)&myaddr,sizeof(myaddr));
if(ret <0)
{
perror("connect\n");
close(clientId);
return -1;
}
printf("connect ok\n");
// 3接收消息
while(1)
{
char buf[1024];
memset(buf,0,1024);
ret = recv(clientId,buf,sizeof(buf),0);
if(ret<0)
{
perror("recv\n");
close(clientId);
return -1;
}
printf("received from xldserver:%s\n",buf);
memset(buf,0,1024);
printf("xldclient: ");
gets(buf);
if(strcmp(buf,"quit")==0)
{
break;
}
ret=send(clientId,buf,sizeof(buf),0);
if(ret<0)
{
perror("send\n");
close(clientId);
return -1;
}
}
//4.關閉套接字
close(clientId);
return 0;
}
下面是伺服器的具體代碼
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
int main()
{
//定義Internet協議結構,伺服器的埠號和IP地址
struct sockaddr_in myaddr;
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family = PF_INET;
myaddr.sin_port = htons(1314);
myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//1.創建套接字
int uouo123 = socket(PF_INET,SOCK_STREAM,0);
if(uouo123<0)
{
perror("serverFd\n");
return -1;
}
printf("socket ok\n");
//2.綁定地址信息
int ret = bind(uouo123,(struct sockaddr *)&myaddr,sizeof(myaddr));
if(ret<0)
{
perror("bind\n");
close(uouo123);
return -1;
}
printf("bind ok\n");
//3.創建一個監聽隊列
if(listen(uouo123,10)<0)
{
perror("listen\n");
close(uouo123);
return -1;
}
printf("listening....\n");
//4.接受鏈接請求
int conId=accept(uouo123,NULL,NULL);
if(conId<0)
{
perror("accept\n");
close(uouo123);
return -1;
}
printf("accept ok\n");
//5.收發消息
while(1)
{
char buf[1024];
memset(buf,0,1024);
printf("please input message (to xldclient)\n");
gets(buf);
if(strcmp(buf,"quit")==0)
{
break;
}
ret = send(conId,buf,sizeof(buf),0);
if(ret <0)
{
perror("send\n");
close(uouo123);
close(conId);
return -1;
}
ret = recv(conId,buf,sizeof(buf),0);
if(ret<0)
{
perror("recv\n");
close(uouo123);
close(conId);
return -1;
}
printf("from xldclient:%s\n",buf);
}
//6.關閉套接字
close(uouo123);
close(conId);
return 0;
}
Ⅱ 如何在makefile中增加mysql編譯參數
用QT Creator生成的文件進行編譯時出現錯誤,網上查找說是要修改生成的Makefile文件,在CFLAGS和CXXFLAGS中添加「-fno-rtti」編譯參數。這樣每個Makefile文件都要修改,很麻煩。那麼能不能在生成Makefile時自動加上呢。可以,只需要修改qmake的配置即可!
以下為解決方法(也可供同類問題參考):
1、#sudo gedit Makefile 查看生成的Makefile。在其中找到Makefile: mycom.pro /QT4/builddir/sdk/qtopiacore/target/mkspecs/qws/linux-arm-g++/qmake.conf 。
這就是要修改的配置文件
2、#sudo gedit /QT4/builddir/sdk/qtopiacore/target/mkspecs/qws/linux-arm-g++/qmake.conf
找到要修改的項並修改QMAKE_CFLAGS = -fno-rtti -pipe,QMAKE_CXXFLAGS = $$QMAKE_CFLAGS(說明引用QMAKE_CFLAGS)
那麼這就完成修改。保存退出即可。
Ⅲ 系統編譯:如何給Make命令來傳遞參數
但有時候我們還是需要讓make命令帶入些參數給makefile腳本 比如你在代碼裡面需要定義個宏DEBUG來打開調試開關代碼如下:{i=9;#def DEBUGi=1;#i=0;#endprf("i=%d\n", i);0;} 般來說這個宏定義可以通過直接修改源代碼進行但這樣顯然不是很好辦法 另外個辦法是通過makefile修改比如: CFLAGS=-g -Wall -DDEBUG object=myprog all:$objectmyprog:a.c gcc ${CFLAGS} a.c -o ${object} 如果更進步連makefile都不想修改我們可以通過向make命令傳遞參數來進行為此我們需要適當修改makefile如下: CFLAGS=CFLAG CFLAGS-g -Wall -DDEBUG object=myprog all:$objectmyprog:a.c gcc ${CFLAGS} a.c -o ${object} 此時如果想打開DEBUG宏我們可以這樣輸入make命令: [ychq@ICM3-2 net]$ make CFLAG=-DDEBUG gcc -g -Wall -DDEBUG a.c a.c: In function `': a.c:9: warning: implicit declaration of function `prf' [ychq@ICM3-2 net]$ 我們可以發現DEBUG宏已經被正確傳入 更進步我們可以通過傳遞區別參數給make讓make編譯區別模塊
Ⅳ cmake交叉編譯參數toolchain
CMake給交叉編譯預留了一個很好的變數即 CMAKE_TOOLCHAIN_FILE ,它定義了一個文件的路徑,這個文件即toolChain,裡面set了一系列你需要改變的變數和屬性,包括 C_COMPILER , CXX_COMPILER 。CMake為了不讓用戶每次交叉編譯都要重新輸入這些命令,因此它帶來toolChain機制,簡而言之就是一個cmake腳本,內嵌了你需要改變以及需要set的所有交叉環境的設置。
這裡面也牽扯了一些相關的變數設置,在這里我通過自己的項目,簡單介紹下幾個比較重要的:
添加鏈接參數
買火車票、高鐵票、機票,訂酒店都打9折的出行工具TRIP, 點擊注冊
Ⅳ cmake使用方法(詳細)
例子
在 cmake 腳本中,設置編譯選項可以通過 add_compile_options 命令,也可以通過 set 命令修改 CMAKE_CXX_FLAGS 或 CMAKE_C_FLAGS 。
使用這兩種方式在有的情況下效果是一樣的,但請注意它們還是有區別的:
例子
也可以直接在編譯的時候指定:
語法
待補充
語法
在CMake中基礎的數據形式是字元串。CMake也支持字元串列表。
列表通過分號分隔。譬如兩個聲明給變數VAR設同樣的值:
字元串列表可以通過foreach命令迭代或直接操控列表命令。
CMake 支持簡單的變數可以是字元串也可以是字元串列表。變數參考使用 ${VAR} 語法。多參數可以使用 set 命令組合到一個列表中。所有其他的命令
通過空白分隔符傳遞命令來擴展列表,例如
像大多數語言一樣,Cmake 提供了控制流結構。Cmake提供了三中控制流:
更多控制流信息參見命令 if,while,foreach,macro,function文檔。
在CMake中原義字元串用雙引號括起來。字元串可以是多行字元串,並在其中嵌入新的行。例如
也可以在一個字元串中轉義字元和使用變數
同樣支持標准C中的轉義
如果字元在引號之前是空格則原義字元串只是原義字元串。但是引號必須成對,例如
cmake可以使用正則表達式
cmake project 頭文件必須存在這行命令, 例如 cmake_minimum_required(VERSION 3.10)
設置項目名稱 project(Tutorial)
語法
例子
語法
將指定的源文件(CPP文件)生成鏈接文件,然後添加到工程中去。
語法
其中 <name> 表示庫文件的名字,該庫文件會根據命令里列出的源文件來創建。而 STATIC 、 SHARED 和 MODULE 的作用是指定生成的庫文件的類型。
例子
在子文件夾添加了 library 或者 executable 之後,在上層目錄添加 subdirectory , 也可以在同一個CMakeList.txt中使用
它相當於 g++ 選項中的 -I 參數的作用,也相當於環境變數中增加路徑到CPLUS_INCLUDE_PATH變數的作用。
語法:
它相當於 g++ 命令的 -L 選項的作用,也相當於環境變數中增加 LD_LIBRARY_PATH 的路徑的作用。
語法:
語法:
該指令的作用主要是指定要鏈接的庫文件的路徑,該指令有時候不一定需要。因為find_package和find_library指令可以得到庫文件的絕對路徑。不過你自己寫的動態庫文件放在自己新建的目錄下時,可以用該指令指定該目錄的路徑以便工程能夠找到。
語法:
link_libraries(library1 <debug | optimized> library2 ...)
可以鏈接一個,也可以多個,中間使用空格分隔.
語法:
語法:
簡單的例子如下:
一般情況下, make install 在不指定 prefix 默認安裝在`/usr/local/bin
Ⅵ cmake中怎樣設置gcc的編譯參數
在configure的時候,加上–host=arm-linux,結果沒有實現我們要的效果,沒有將編譯器從默認的 gcc改成arm-linux-gcc,編譯器還是用的默認的gcc: [crifan@localhost lrzsz-0.12.20]$ CFLAGS=-O2