【Socket網絡編程】傳參時char* 類型轉 unsigned short 類型和 const char *類型
一、問題
在Linux操作系統下,實現客戶端向服務器端發消息的過程,爲了方便的快速構建一個客戶端,會把客戶端寫成一個函數。函數需要傳遞的參數有三種:無符號短型的端口,常量字符型指針的服務器IP號以及需要傳遞的字符類型的數組。
爲了不在程序裏就把服務器的IP和端口號寫死了,Linux g++編譯代碼之後我們可以手動傳參給可執行文件的main接口。可以實現手動輸入的目標服務器socket建立通信。
但是在定義mian函數傳參的時候,傳遞的參數爲字符指針數組char * argv[],這時候就會涉及到char* 類型轉 unsigned short 類型和 const char *類型。
二、解決
需要傳遞的參數有port和server_ip,而send_buf[]是在調用客戶端程序之前就寫好了的可以先不用管。
在這裏聚焦於argv的類型到port的類型和server_ip的類型的轉換。
int main(int argc, char *argv[])
void clientmain(unsigned short port, const char *server_ip,char send_buf[])
通過下面的代碼就可以看到轉換的一個過程。
//test.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include<typeinfo>
#include<sstream>
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) //用於傳參的主函數
{
//cout<<argv[0]<<endl; //顯示argv[0]的值
//記錄了參數port的值
char* unsignedshorttemp = argv[1];
cout<<typeid(unsignedshorttemp).name()<<" -unsignedshorttemp- "<<unsignedshorttemp<<endl; //顯示當前port的類型和值
//char *類型向unsigned short類型的轉換
//實現方式1,直接atoi之後賦值
unsigned short port1 = atoi(unsignedshorttemp);
cout<<typeid(port1).name()<<" -port1- "<<port1<<endl; //顯示當前port1的類型和值
//實現方式2,char *轉成string,string轉char* ,char* 轉 unsigned short
//繞了一圈又到實現方式1,但是這個過程可以看到char *轉成string,string轉char*的實現。
//char *類型轉成string類型
string str;
stringstream stream;
stream << unsignedshorttemp;
str = stream.str();
//string類型轉char*類型,char* a = (char*)str.c_str();
unsigned short port2 ;
port2 = atoi((char*)str.c_str()); //char *類型轉unsigned short類型
cout<<typeid(port2).name()<<"-port2-"<<port2<<endl; //顯示當前port2的類型和值
//記錄了參數server_ip的類型
char* constchartemp = argv[2];
cout<<typeid(constchartemp).name()<<" -constchartemp- "<<constchartemp<<endl; //顯示當前server_ip的類型和值
//char *類型向const char*類型的轉換
//實現方法1,間接賦值
const char* server_ip1;
server_ip1=constchartemp;
cout<<typeid(server_ip1).name()<<" -server_ip1- "<<server_ip1<<endl; //顯示當前server_ip1的類型和值
//實現方法2,直接賦值
const char* server_ip2=constchartemp;
cout<<typeid(server_ip2).name()<<" -server_ip2- "<<server_ip2<<endl; //顯示當前server_ip2的類型和值
}
上述代碼首先進行編譯:
g++ test.cpp -o test
傳參運行的命令行:
./test 8017 10.2.25.137
Linux將命令行參數傳遞給main函數
回憶一下main函數的定義:
int main(int argc, char *argv[])
在這裏通過main函數穿的參數爲8017和10.2.25.137這兩個數據。而這兩個值的位置對應的在argv[1]和argv[2]上。argv[0]爲./test,可以把第一行的註釋取消看到。
傳參會把命令行的輸入按照空格隔開來存入argv[]數組中,argc對應的值爲argv[]數組的元素個數。比如在上面的傳參命令中,操作系統爲main傳遞的參數 argc 值爲3。
三、typeid().name() 返回值
typeid(變量名).name() 是可以查看當前變量的類型。
有的編譯器需要加上typeid的頭文件:
#include<typeinfo> //typeid需要的頭文件
上述程序輸出的運行結果每行的開頭都會出現 typeid(變量名).name() 的返回值,這個返回值就是變量的類型表示形式。
返回值的輸出格式爲: [指針][名稱空間][類型][模板]
[指針]:若是指針則輸出P,const 指針爲PK。
[名稱空間]:若是std則輸出St,若是自定義的名稱空間則輸出字符數及它的名字,並在開頭加N,在結尾加E。
[類型]:若是自定義的名稱空間則輸出字符數及它的名字,若內建類型輸出如下:
類型 | 返回值 |
---|---|
bool | b |
char | c |
signed char | a |
unsigned char | h |
(signed) short (int) | s |
unsigned short (int) | t |
(signed) (int) | i |
unsigned (int) | j |
(signed) long (int) | l |
unsigned long (int) | m |
(signed) long long (int) | x |
unsigned long long (int) | y |
float | f |
double | d |
long double | e |
[模板] :類型模板以I開頭,以E結尾;常數模板以L開頭,以E結尾。只有整型變量(int、char之類的)才能做爲常數模板,浮點數不行。
具體參考鏈接: typeid().name() 返回值
四、運行結果
運行結果如下圖:
從運行結果可以看到:
unsignedshorttemp 爲 char* 類型的變量(Pc);
port1和port2爲unsigned short類型的變量(t);
constchartemp 爲 char* 類型的變量(Pc);
server_ip1和server_ip2爲const char*類型的變量(PKc);
通過上述代碼可以實現char型向unsigned short類型的轉換,char類型向const char*類型的轉換。