【Socket網絡編程】傳參時char* 類型轉 unsigned short 類型和 const char *類型

【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*類型的轉換。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章