Ⅰ Linux C語言網路編程問題!
unsigned int dir(char * server) {
int sck;//套接字變數
struct sockaddr_in serv_adr; //遠程主機的地址
struct hostent *host; //指向遠程主機的指針
unsigned char databuf[FILEBUF_SIZE]; //數據
int bytes = 0, bytesread = 0; //位元組數,讀取到的位元組數
host = gethostbyname(server); //根據遠程主機的主機名,得到指向遠程主機的指針
if (host == (struct hostent *) NULL) { //如果得到指向遠程主機的指針失敗,報告錯誤,並返回
perror("gethostbyname failed");
return 0;
}memset(&serv_adr, 0, sizeof(serv_adr)); //初始化遠程主機的地址,結構體內所有成員清零
serv_adr.sin_family = AF_INET; //設置地址類型
memcpy(&serv_adr.sin_addr, host->h_addr, host->h_length);//取出指向遠程主機的指針中包含的地址信息,賦給遠程主機地址變數
serv_adr.sin_port = htons(SERVICE_PORT);//設置埠號,比如http服務對應80埠,ftp對應21埠
if ((sck = socket(AF_INET, SOCK_STREAM, 0)) < 0) { //如果建立TCP協議的套接字失敗,報告錯誤,並返回
perror("error on socket()");
return 0;
}
if (connect(sck, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) < 0) {//如果使用該套接字連接到遠程主機失敗,報告錯誤,並返回
perror("error on connect()");
return 0;
}write(sck, "DI\n\n", 4); //連接成功,發送內容為"DI\n\n"的消息,遠程主機收到該消息,解析後生成目錄列表,並將目錄列表信息傳遞回來
printf("Remote directory listing:\n");//輸出提示信息「遠程主機正在生成目錄列表」
while ((bytes = read(sck, databuf, FILEBUF_SIZE)) > 0) { //從套接字的數據流中讀取遠程主機的返回信息(即目錄列表),每次讀取FILEBUF_SIZE個位元組,直到全部讀取完畢
write(fileno(stdout), databuf, bytes);//將每次讀到的數據,輸出到標准輸出流(stdout),即屏幕上
bytesread += bytes;//接收到的位元組數累加
}
close(sck); /* Close the socket */ //通信完成,關閉套接字,關閉連接
return bytesread; //返回讀取到的位元組數(即遠程主機返回的信息的大小)
}
Ⅱ C語言怎麼實現TCP連接
TCP協議是一種面向連接、可靠的、基於位元組流的傳輸層通信協議,其定義出自於IETF的RFC 793。在簡化版的計算機網路OSI模型中,它承擔了第四層傳輸層的任務。TCP協議的關鍵特性包括三次握手過程,這一過程確保了連接的建立和斷開的可靠性。
三次握手的過程可以簡單地理解為客戶端向伺服器發送一個連接請求,然後伺服器回應確認信息,最後客戶端再次確認。這一過程確保了連接的建立和斷開的可靠性。基於位元組流的特點意味著數據在傳輸過程中會被分割成多個位元組進行傳輸,而接收端會將這些位元組重新組合成完整的數據流。
理解TCP協議的關鍵特性,是實現C語言中的TCP連接的基礎。在C語言中,實現TCP連接通常需要使用標准庫中的套接字功能。具體而言,通過創建套接字、綁定IP地址和埠號、監聽連接請求等步驟,可以實現與伺服器的TCP連接。
在創建套接字時,需要調用socket()函數,該函數會創建一個套接字,然後需要使用bind()函數將該套接字綁定到特定的IP地址和埠號。接下來,通過listen()函數使套接字進入監聽狀態,等待客戶端的連接請求。當客戶端發起連接請求時,伺服器會通過accept()函數接收連接請求,從而建立TCP連接。
在客戶端方面,首先需要調用socket()函數創建套接字,然後使用connect()函數連接到伺服器的特定地址和埠號。一旦連接成功,客戶端和伺服器之間的TCP連接就建立起來了,雙方可以通過send()和recv()等函數進行數據傳輸。
實現TCP連接的過程涉及多個步驟和函數調用,理解這些基本概念和操作能夠幫助開發者更好地掌握C語言中TCP連接的實現方法。
Ⅲ 在windows下用C語言如何實現socket網路編程,需要用到哪些頭文件或者庫
需要用到的頭文件包含:
#include <winsock2.h>
#include <windows.h>
與Linux環境下socket編程相比,windows環境多了一個步驟:啟動或者初始化winsock庫
Winsock,一種標准API,一種網路編程介面,用於兩個或多個應用程序(或進程)之間通過網路進行數據通信。具有兩個版本:
Winsock 1:
Windows CE平台支持。
頭文件:WinSock.h
庫:wsock32.lib
Winsock 2:
部分平台如Windows CE貌似不支持。通過前綴WSA可以區別於Winsock 1版本。個別函數如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都屬於Winsock 1.1規范的函數;
頭文件:WinSock2.h
庫:ws2_32.lib
mswsock.h用於編程擴展,使用時必須鏈接mswsock.dll
(3)c語言網路連接擴展閱讀
winsock庫的載入與卸載:
載入:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
載入成功,返回值為0。
WORD wVersionRequested:載入的winsock版本,使用宏MAKEWORD(x, y),x表示高位元組,y表示低位元組。然而使用時MAKEWORD(2, 2)。高位元組與低位元組相同~~
LPWSADATA lpWSAData:WSADATA結構的指針,傳入參數後,系統幫助我們填充版本信息。有興趣的可以看看結構體內容,不過基本用不著。
卸載:int WSACleanup(void);比起載入,卸載的函數真是輕松愉快。