最近入職培訓中需要寫乙個linux下的c/s網路檔案傳輸工具,在實現的過程中,遇到了一些坑,在這裡 做個總結:
由於udp伺服器不需要accept(),因此也沒有link_id(連線的客戶端id),在伺服器檔案接收或下發檔案時需要知道當下與之通訊的客戶端的識別符號,由於udp是無連線的,並且sockfd = socket()也不能起到標識客戶端的作用。
而recvfrom和sendto函式中需要識別符號來表示通訊中的客戶端,我們發現,client_addr起到了這個效果:
struct sockaddr_in client_addr; //客戶端位址結構
因此我們在udp連線方式下建立執行緒時,不能傳引數 sockfd,而是將client_addr這個引數傳出,到相應的執行緒函式裡,在相應的執行緒函式裡處理接收或傳送流程。(在tcp中我們是將link_id=accept()這個識別符號傳出的)
執行緒建立:pthread_create(&tcp_send_tid, null,udp_process_client_send, (void *)&client_addr);
執行緒函式:
/** @fn void *udp_process_client_send(void * arg)
* @param arg 引數同步,執行緒建立的時候.
* @return 無.
*/void
*udp_process_client_recv
(void
* arg)
struct sockaddr_in server_addr;
server_addr.sin_family = af_inet;
//address family
server_addr.sin_addr.s_addr =
htonl
(inaddr_any)
;// inaddr_loopback;0.0.0.0
server_addr.sin_port =
htons
(port)
;//port number
socklen_t addrlen =
sizeof
(server_addr)
;/**********傳送檔案************/
char buf[buff_size]
;int buf_len;
while
((buf_len =
read
(fd, buf,
sizeof
(buf)))
>0)
printf
("send_len: %d \n"
,send_len)
;bzero
(buf,buff_size);}
printf
("udpsend finished!\n");
close
(fd)
;//關閉檔案
}
socket檔案傳輸
伺服器 本檔案是伺服器的 include for sockaddr in include for socket include for socket include for printf include for exit include for bzero include for time t an...
Socket檔案傳輸
服務端 輸入檔案完整路徑傳送給客戶端 import struct import json import os tcp server socket ip port 127.0.0.1 8080 buffsize 1024 埠的重複利用 tcp server.bind ip port tcp serve...
socket通訊檔案傳輸
主機傳送方 fileinfo ezonefile new fileinfo 檔案路徑 開啟檔案流 filestream ezonestream ezonefile.openread 包的大小 int packetsize 1024 包的數量 int packetcount int ezonestre...