TCP服務(wù)器和客戶端編程步驟詳解
一、TCP服務(wù)器編程步驟
1. 創(chuàng)建套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
- 功能:創(chuàng)建TCP套接字
- 參數(shù):
AF_INET:IPv4地址族
SOCK_STREAM:面向連接的流式套接字(TCP)
0:默認(rèn)協(xié)議
- 返回值:套接字文件描述符,失敗返回-1
2. 初始化服務(wù)器地址結(jié)構(gòu)
struct sockaddr_in Ssocksddr;
memset(&Ssocksddr, 0, sizeof(Ssocksddr));
Ssocksddr.sin_family = AF_INET;
Ssocksddr.sin_addr.s_addr = inet_addr("192.168.126.130");
Ssocksddr.sin_port = htons(6543);
- 功能:設(shè)置服務(wù)器IP和端口
- 關(guān)鍵函數(shù):
inet_addr():將點(diǎn)分十進(jìn)制IP轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序
htons():將主機(jī)字節(jié)序端口轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序
3. 綁定地址
int n = bind(sockfd, (struct sockaddr*)&Ssocksddr, sizeof(Ssocksddr));
- 功能:將套接字與服務(wù)器地址綁定
- 參數(shù):監(jiān)聽套接字、服務(wù)器地址結(jié)構(gòu)、結(jié)構(gòu)體大小
4. 開始監(jiān)聽
n = listen(sockfd, 5);
- 功能:將套接字設(shè)為監(jiān)聽狀態(tài),等待客戶端連接
- 參數(shù):
backlog=5表示已完成三次握手的連接隊列最大長度
5. 接受客戶端連接
int len = sizeof(Csocksddr);
int newsocked = accept(sockfd, (struct sockaddr*)&Csocksddr, &len);
- 功能:從連接隊列中取出一個客戶端連接
- 返回值:新的連接套接字,專門用于與該客戶端通信
- 注意:
accept()會阻塞直到有客戶端連接
6. 數(shù)據(jù)收發(fā)循環(huán)
// 接收數(shù)據(jù)
int n = recv(newsocked, buffer, 127, 0);
// 發(fā)送數(shù)據(jù)
send(newsocked, "Yes\n", 4, 0);
- 功能:與客戶端進(jìn)行數(shù)據(jù)通信
- recv參數(shù):
newsocked:連接套接字
buffer:接收緩沖區(qū)
127:最大接收字節(jié)數(shù)
0:默認(rèn)標(biāo)志
7. 關(guān)閉連接
close(newsocked);
二、TCP客戶端編程步驟
1. 創(chuàng)建套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
2. 初始化服務(wù)器地址結(jié)構(gòu)
struct sockaddr_in Ssock;
memset(&Ssock, 0, sizeof(Ssock));
Ssock.sin_family = AF_INET;
Ssock.sin_addr.s_addr = inet_addr("127.0.0.1");
Ssock.sin_port = htons(6543);
- 注意:這里設(shè)置的是要連接的服務(wù)器的地址
3. 連接服務(wù)器
int n = connect(sockfd, (struct sockaddr*)&Ssock, sizeof(Ssock));
- 功能:主動向服務(wù)器發(fā)起連接請求
- 觸發(fā):自動完成TCP三次握手過程
4. 數(shù)據(jù)收發(fā)循環(huán)
// 獲取用戶輸入
fgets(buffer, 128, stdin);
// 發(fā)送數(shù)據(jù)到服務(wù)器
send(sockfd, buffer, strlen(buffer)-1, 0);
// 接收服務(wù)器回復(fù)
recv(sockfd, buffer, 127, 0);
- 注意:
strlen(buffer)-1是為了去掉fgets讀取的換行符
5. 關(guān)閉連接
close(sockfd);
三、關(guān)鍵概念回顧
套接字類型
- 監(jiān)聽套接字:由
socket()創(chuàng)建,用于listen()和accept()
- 連接套接字:由
accept()返回,用于與特定客戶端通信
字節(jié)序轉(zhuǎn)換
htons():主機(jī)到網(wǎng)絡(luò)短整型(端口)
inet_addr():字符串IP到網(wǎng)絡(luò)字節(jié)序
核心函數(shù)對比
| 函數(shù) |
服務(wù)器 |
客戶端 |
功能 |
| socket() |
? |
? |
創(chuàng)建套接字 |
| bind() |
? |
? |
綁定地址 |
| listen() |
? |
? |
開始監(jiān)聽 |
| accept() |
? |
? |
接受連接 |
| connect() |
? |
? |
連接服務(wù)器 |
| send()/recv() |
? |
? |
數(shù)據(jù)收發(fā) |
| close() |
? |
? |
關(guān)閉連接 |