01 理解網路程式設計和套接字

2021-10-02 10:47:58 字數 3274 閱讀 8797

測試環境:ubuntu 10.10

gcc版本:4.4.5

一、理解網路程式設計和套接字

網路程式設計:編寫程式使兩台連網的計算機相互交換資料。

套接字:網路資料傳輸用的軟體裝置。

二、伺服器端套接字函式簡介

1)建立套接字

標頭檔案:#include 函式功能:建立套接字

返回值:成功時返回檔案描述符,失敗時返回-1.

函式原型:int socket(int domain, int type, int protocol);

2)建立好的套接字分配位址資訊(ip位址和埠號)

返回值:成功時返回0,失敗時返回-1

函式原型:int bind(int sockfd, struct sockadr* myaddr, socklen_t addrlen);

3)把套接字轉化成可接收連線的狀態

標頭檔案:#include 函式功能:把套接字轉化成可接收連線的狀態

返回值:成功時返回0,失敗時返回-1

函式原型:int listen(int sockfd, int backlog);

4)受理連線請求

標頭檔案:#include 函式功能:受理連線請求

返回值:成功時返回檔案描述符,失敗時返回-1

函式原型:int accept(int sockfd, struct sockaddr* addr, socklen_t* addrlen);

5)總結:接受連線請求的調節自建立過程,如下:

第一步:呼叫socket函式建立套接字

第三步:呼叫listen函式轉化為可接收請求狀態

第四步:呼叫accept函式受理連線請求

三、編寫「hello world!」伺服器端

伺服器端接收到連線請求後向請求者返回「hello world!」答覆。

helloserver.c

if(argc != 2)

servsock = socket(pf_inet, sock_stream, 0);

if(-1 == servsock)

errorhandling("socket() error");

memset(&servaddr, 0, sizeof(servaddr));

servaddr.sin_family = af_inet;

servaddr.sin_addr.s_addr = htonl(inaddr_any);

servaddr.sin_port = htons(atoi(ar**[1]));

if(-1 == bind(servsock, (struct sockaddr*)&servaddr, sizeof(servaddr)))

errorhandling("bind() error");

if(-1 == listen(servsock, 5))

errorhandling("listen() error");

clntaddrsize = sizeof(clntaddr);

clntsock = accept(servsock, (struct sockaddr*)&clntaddr, &clntaddrsize);

if(-1 == clntsock)

errorhandling("accept() error");

write(clntsock, message, sizeof(message));

close(clntsock);

close(servsock);

return 0;

}void errorhandling(const char *message)

四、客戶端套接字函式簡介

只介紹新增加的函式。

1)向伺服器請求連線客戶端套接字。

標頭檔案:#include 函式功能:向伺服器端請求客戶端套接字

返回值:成功時返回0,失敗時返回-1

函式原型:int connect(int sockfd, struct sockaddr* servaddr, socklen_t addrlen);

五、編寫「hello world!」客戶端

helloclient.c

#include #include #include #include #include #include void errorhandling(const char* message);

int main(int argc, char* ar**)

sock = socket(pf_inet, sock_stream, 0);

if(-1 == sock)

servaddr.sin_family = af_inet;

servaddr.sin_addr.s_addr = inet_addr(ar**[1]);

servaddr.sin_port = htons(atoi(ar**[2]));

if(-1 == connect(sock, (struct sockaddr*)&servaddr, sizeof(servaddr)))

errorhandling("connect() error");

strlen = read(sock, message, sizeof(message));

if(-1 == strlen)

errorhandling("read() error");

printf("message from server: %s\n", message);

close(sock);

return 0;

}void errorhandling(const char* message)

六、測試

服務端:./serv.out 9190。正常情況下將聽了在此狀態,因為伺服器端呼叫accept函式還未返回。

如圖:客戶端:/client.out 127.0.0.1 9190。

message from server: hello world!
如圖:

知識點:

1.輸入127.0.0.1是執行示例本地計算機的ip位址。如果在同一臺計算機中同時執行伺服器端和客戶端,將採用這種連線方式。

但如果伺服器端和客戶端在不同計算機中執行

,則應採用

伺服器端所在計算機ip位址。

理解網路程式設計和套接字

網路程式設計中接受連線請求的套接字的建立過程 1.呼叫socket函式建立套接字 2.呼叫bind函式分配ip位址和埠號 3.呼叫listen函式轉為可接收請求狀態 4.呼叫accept函式受理連線請求 int socket int domain,int type,int protocol 函式so...

理解網路程式設計和套接字

include include include include void error handling char message int main void void error handling char message 編譯測試 gcc low open.c o low open low ope...

1 1 理解網路程式設計和套接字

最近在看網路程式設計相關的知識,網上說尹聖雨的 tcpip網路程式設計 不錯,遂網上找了分電子版本的書籍,記錄下閱讀筆記。tcp套接字通訊可以模擬 機,接聽方流程如下 socket 安裝 機 bind 分配 號碼 listen 連線 線 accept 拿起話筒 打 端比較簡單,只需要 socket ...