c++網路程式設計離不開socket程式設計。我們現在使用socket編寫簡單的回聲伺服器。
這裡所說的流程包括兩部分:
socket函式呼叫流程。
伺服器與客戶端互動流程。
回聲伺服器主要功能:伺服器將接收到來自客戶端的資料傳回客戶端。
伺服器的功能:
客戶端的功能:
#include #include #include #include #include #include const int buf_size = 1024;
void error_handling(const char *message);
// 接收兩個引數,ar**[1]為埠號
int main(int argc, char *ar**)
server_socket = socket(pf_inet, sock_stream, 0); // 建立ipv4 tcp socket
if (server_socket == -1)
// 位址資訊初始化
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = af_inet; // ipv4 位址族
server_addr.sin_addr.s_addr = htonl(inaddr_any); // 使用inaddr_any分配伺服器的ip位址
server_addr.sin_port = htons(atoi(ar**[1])); // 埠號由第乙個引數設定
// 分配位址資訊
if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(sockaddr)) == -1)
// 監聽連線請求,最大同時連線數為5
if (listen(server_socket, 5) == -1)
client_addr_size = sizeof(client_addr);
for (i = 0; i < 5; ++i) else
// 讀取來自客戶端的資料
while ((str_len = read(client_sock, message, buf_size)) != 0)
}// 關閉連線
close(client_sock);
printf("echo server\n");
return 0;
}
#include #include #include #include #include #include const int buf_size = 1024;
void error_handling(const char *message);
// 接收兩個引數,ar**[1]為ip位址,ar**[2]為埠號
int main(int argc, char *ar**)
sock = socket(pf_inet, sock_stream, 0);
if (sock == -1)
// 位址資訊初始化
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = af_inet; // ipv4 位址族
server_addr.sin_addr.s_addr = inet_addr(ar**[1]); // 伺服器ip位址
server_addr.sin_port = htons(atoi(ar**[2])); // 伺服器端口號
// 向伺服器傳送連線請求
if (connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) else
while (1)
write(sock, message, strlen(message)); // 向伺服器傳送資料
str_len = read(sock, message, buf_size); // 讀取來自客戶端的伺服器
message[str_len] = 0;
printf("message from server: %s \n", message);
}// 關閉連線
close(sock);
return 0;
}
客戶端傳輸資料,通過呼叫write函式一次性傳送,之後呼叫一次read函式,期望接收自己傳輸的資料。只是問題所在。因為「tcp不存在資料邊界」,存在兩個異常情況:
客戶端多次呼叫write函式傳輸的資料有可能一次性傳送給伺服器。
伺服器呼叫一次write函式傳輸資料,但資料太大,作業系統有可能把資料分成多個資料報傳送到客戶端。另外,在此過程中,客戶端有可能在尚未收到全部資料報時就呼叫了read函式。
github
《tcp/ip網路程式設計》
C 回聲伺服器 1 簡單版本
c 網路程式設計離不開socket程式設計。我們現在使用socket編寫簡單的回聲伺服器。這裡所說的流程包括兩部分 socket函式呼叫流程。伺服器與客戶端互動流程。回聲伺服器主要功能 伺服器將接收到來自客戶端的資料傳回客戶端。伺服器的功能 客戶端的功能 include include includ...
C 回聲伺服器 1 簡單版本
c 網路程式設計離不開socket程式設計。我們現在使用socket編寫簡單的回聲伺服器。這裡所說的流程包括兩部分 socket函式呼叫流程。伺服器與客戶端互動流程。回聲伺服器主要功能 伺服器將接收到來自客戶端的資料傳回客戶端。伺服器的功能 客戶端的功能 include include includ...
C 回聲伺服器 3 UDP版本
這次我們實現乙個udp版本的回聲伺服器。udp套接字不會像tcp套接字那樣保持連線狀態,因此每次傳輸資料都要新增目標位址資訊。用於傳輸資料的函式 傳送資料到目標伺服器。include ssize t sendto int sock,void buff,size t nbytes,int flags,...