Linux網路程式設計之socket簡單通訊TCP--服務端程式碼
Server端程式碼如下:
/*************************************************************************
#include<netinet/in.h> // sockaddr_in
#include<sys/types.h> // socket
#include<sys/socket.h> // socket
#include<stdio.h> // printf
#include<stdlib.h> // exit
#include<string.h> // bzero
#define SERVER_PORT 8000
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
int main(void)
{
// 宣告並初始化一個伺服器端的socket地址結構
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT);
// 建立socket,若成功,返回socket描述符
int server_socket_fd = socket(PF_INET, SOCK_STREAM, 0);
if(server_socket_fd < 0)
{
perror("Create Socket Failed:");
exit(1);
}
int opt = 1;
setsockopt(server_socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
// 繫結socket和socket地址結構
if(-1 == (bind(server_socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr))))
{
perror("Server Bind Failed:");
exit(1);
}
// socket監聽
if(-1 == (listen(server_socket_fd, LENGTH_OF_LISTEN_QUEUE)))
{
perror("Server Listen Failed:");
exit(1);
}
while(1)
{
// 定義客戶端的socket地址結構
struct sockaddr_in client_addr;
socklen_t client_addr_length = sizeof(client_addr);
// 接受連線請求,返回一個新的socket(描述符),這個新socket用於同連線的客戶端通訊
// accept函式會把連線到的客戶端資訊寫到client_addr中
int new_server_socket_fd = accept(server_socket_fd, (struct sockaddr*)&client_addr, &client_addr_length);
if(new_server_socket_fd < 0)
{
perror("Server Accept Failed:");
break;
}
// recv函式接收資料到緩衝區buffer中
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
if(recv(new_server_socket_fd, buffer, BUFFER_SIZE, 0) < 0)
{
perror("Server Recieve Data Failed:");
break;
}
// 然後從buffer(緩衝區)拷貝到file_name中
char file_name[FILE_NAME_MAX_SIZE+1];
bzero(file_name, FILE_NAME_MAX_SIZE+1);
strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));
printf("%s\n", file_name);
// 開啟檔案並讀取檔案資料
FILE *fp = fopen(file_name, "r");
if(NULL == fp)
{
printf("File:%s Not Found\n", file_name);
}
else
{
bzero(buffer, BUFFER_SIZE);
int length = 0;
// 每讀取一段資料,便將其傳送給客戶端,迴圈直到檔案讀完為止
while((length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0)
{
if(send(new_server_socket_fd, buffer, length, 0) < 0)
{
printf("Send File:%s Failed./n", file_name);
break;
}
bzero(buffer, BUFFER_SIZE);
}
// 關閉檔案
fclose(fp);
printf("File:%s Transfer Successful!\n", file_name);
}
// 關閉與客戶端的連線
close(new_server_socket_fd);
}
// 關閉監聽用的socket
close(server_socket_fd);
return 0;
}
******************************************************************************
/*************************************************************************
#include<netinet/in.h> // sockaddr_in
#include<sys/types.h> // socket
#include<sys/socket.h> // socket
#include<stdio.h> // printf
#include<stdlib.h> // exit
#include<string.h> // bzero
#define SERVER_PORT 8000
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
int main(void)
{
// 宣告並初始化一個伺服器端的socket地址結構
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT);
// 建立socket,若成功,返回socket描述符
int server_socket_fd = socket(PF_INET, SOCK_STREAM, 0);
if(server_socket_fd < 0)
{
perror("Create Socket Failed:");
exit(1);
}
int opt = 1;
setsockopt(server_socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
// 繫結socket和socket地址結構
if(-1 == (bind(server_socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr))))
{
perror("Server Bind Failed:");
exit(1);
}
// socket監聽
if(-1 == (listen(server_socket_fd, LENGTH_OF_LISTEN_QUEUE)))
{
perror("Server Listen Failed:");
exit(1);
}
while(1)
{
// 定義客戶端的socket地址結構
struct sockaddr_in client_addr;
socklen_t client_addr_length = sizeof(client_addr);
// 接受連線請求,返回一個新的socket(描述符),這個新socket用於同連線的客戶端通訊
// accept函式會把連線到的客戶端資訊寫到client_addr中
int new_server_socket_fd = accept(server_socket_fd, (struct sockaddr*)&client_addr, &client_addr_length);
if(new_server_socket_fd < 0)
{
perror("Server Accept Failed:");
break;
}
// recv函式接收資料到緩衝區buffer中
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
if(recv(new_server_socket_fd, buffer, BUFFER_SIZE, 0) < 0)
{
perror("Server Recieve Data Failed:");
break;
}
// 然後從buffer(緩衝區)拷貝到file_name中
char file_name[FILE_NAME_MAX_SIZE+1];
bzero(file_name, FILE_NAME_MAX_SIZE+1);
strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));
printf("%s\n", file_name);
// 開啟檔案並讀取檔案資料
FILE *fp = fopen(file_name, "r");
if(NULL == fp)
{
printf("File:%s Not Found\n", file_name);
}
else
{
bzero(buffer, BUFFER_SIZE);
int length = 0;
// 每讀取一段資料,便將其傳送給客戶端,迴圈直到檔案讀完為止
while((length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0)
{
if(send(new_server_socket_fd, buffer, length, 0) < 0)
{
printf("Send File:%s Failed./n", file_name);
break;
}
bzero(buffer, BUFFER_SIZE);
}
// 關閉檔案
fclose(fp);
printf("File:%s Transfer Successful!\n", file_name);
}
// 關閉與客戶端的連線
close(new_server_socket_fd);
}
// 關閉監聽用的socket
close(server_socket_fd);
return 0;
}
******************************************************************************
相關文章
- Linux網路程式設計之socket簡單通訊--客戶端程式碼Linux程式設計客戶端
- linux網路程式設計之用socket實現簡單客戶端和服務端的通訊(基於TCP)Linux程式設計客戶端服務端TCP
- 網路程式設計-Socket通訊程式設計
- Socket最簡單的客戶端與服務端通訊-Java客戶端服務端Java
- TCP通訊客戶端和服務端簡單程式碼實現TCP客戶端服務端
- 網路通訊程式設計程式設計
- C#網路程式設計-簡單的通訊原始碼C#程式設計原始碼
- 使用Scala模擬簡單的RPC通訊,Socket程式設計RPC程式設計
- (轉)Linux下 C++呼叫C 實現socket網路通訊程式設計LinuxC++程式設計
- Socket 程式設計 (網路篇)程式設計
- 《Linux網路開發必學教程》12_TCP通訊框架:服務端設計LinuxTCP框架服務端
- Linux Socket 程式設計簡介Linux程式設計
- 玩轉 PHP 網路程式設計全套之 unix 本地域 socket 通訊PHP程式設計
- 03Python網路程式設計之單執行緒服務端Python程式設計執行緒服務端
- 網路程式設計之socket程式設計
- Socket網路程式設計基礎與實踐:建立高效的網路通訊程式設計
- python網路-Socket之TCP程式設計(26)PythonTCP程式設計
- UDP協議網路Socket程式設計(java實現C/S通訊案例)UDP協議程式設計Java
- 客戶端與服務端Socket通訊原理詳解客戶端服務端
- 簡單的Socket通訊
- Python網路Socket程式設計Python程式設計
- 計算機通訊之謎,帶你徹底理解socket網路程式設計(五)計算機程式設計
- java socket 通訊socketServer 服務端多執行緒JavaServer服務端執行緒
- java多執行緒實現TCP網路Socket程式設計(C/S通訊)Java執行緒TCP程式設計
- Java:基於TCP協議網路socket程式設計(實現C/S通訊)JavaTCP協議程式設計
- 【Linux網路程式設計-5】多執行緒服務端Linux程式設計執行緒服務端
- socket 完成簡單的通訊
- 網路通訊2:TCP簡單通訊TCP
- 程式間通訊(Socket)
- AgileEAS.NET SOA 中介軟體平臺.Net Socket通訊框架-簡單例子-實現簡單的服務端客戶端訊息應答框架單例服務端客戶端
- 《Linux網路開發必學教程》2_服務端程式設計初體驗Linux服務端程式設計
- linux Socket 程式設計Linux程式設計
- Windows Socket程式設計精華《TCP通訊伺服器》Windows程式設計TCP伺服器
- Linux系統程式設計之程式間通訊方式:訊息佇列Linux程式設計佇列
- Linux系統程式設計之程式間通訊方式:管道(二)Linux程式設計
- Linux系統程式設計之程式間通訊方式:管道(一)Linux程式設計
- Linux Socket C語言網路程式設計:TCP SocketLinuxC語言程式設計TCP
- Linux Socket C語言網路程式設計:UDP SocketLinuxC語言程式設計UDP