導航:首頁 > 編程系統 > linuxsocket轉發

linuxsocket轉發

發布時間:2025-02-21 01:24:52

1. linux下socket如何傳輸一個目錄以及目錄下的子文件子目錄

socket編程,需要一個伺服器端和一個客戶端
傳輸文件夾的話可以在伺服器端進行發送在客戶端進行接收
方法是,在指定埠建立偵聽,比如8888,使用的協議可以是tcp/ip或者udp/ip
udp是種無鏈接不可靠的協議,建議傳輸文件還是使用tcp協議
客戶端通過connect函數連接伺服器端後就可進行數據傳輸

其實文件傳輸本質就是數據傳輸,我們在伺服器端只需要使用opendir函數「打開」文件夾
再使用readdir函數遍歷文件夾即可,將所有讀到的文件名進行判斷,比如判斷該文件是否為文件夾,或者是否會特殊文件,比如軟鏈接,socket文件,管道文件等等,如果是文件夾則進行該文件夾進行遞歸(即進入該文件夾後施行前面相同的方法,以此類推下去,直到讀取完所有的文件夾),並將該文件夾名稱發送給客戶端,客戶端接收到該文件夾名稱後使用mkdir函數創建一個文件夾,如果為一般文件將該文件名和所在目錄發送到客戶端,客戶端創建該文件(如果是多級文件夾則客戶端則進入文件夾)讀取該文件(fopen或者open),可以一邊讀取文件內容一邊將讀取的內容發送給客戶端,客戶端則將接收到的內容寫入到文件即可

這里需要注意的就是伺服器端與客戶端需要規劃好一定的規則,也就是需要建立一個簡單的伺服器與客戶端通信的協議
比如最簡單的我們使用 文件類型:文件名 來表明傳輸的數據的意義
伺服器端在檢查文件夾內的文件時通過不同的文件類型來制定不同的標簽,客戶端通過檢測這些標簽來確定下一步的操作
比如伺服器檢測到一個文件夾則會發送 文件夾:該文件夾的名稱
客戶端在接收到該數據後進行解析,解析到冒號前的文件類型為文件夾則創建一個冒號後的文件夾名稱(這里文件夾名稱包括多級目錄,我們也可以設置的更完善點,比如 文件類型:文件夾:文件夾:文件夾,最後一個文件夾名稱則為客戶端需要創建的文件夾,前面的則是該文件夾所在的絕對路徑)
有了這種簡明的協議就可以更好地完成socket文件夾復制工作

2. linux c socket 客戶端循環十次向伺服器發送數據(tcp連接),為啥只能接受第一次的求代碼

只是做這些動作的話不需要多線程

找了下以前寫的 改成了你說的10次發送
client.c:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>

int main(int argc,char **argv)
{
char wbuf[] = "hello server";
char rbuf[128];
int i;
int sock;
struct sockaddr_in server = {0};
struct timeval timeo;

timeo.tv_sec = 0;
timeo.tv_usec = 1000 * 1000; //
socklen_t len = sizeof(timeo);
if( argc != 2)
{
printf("usage: ./client <ipaddress>\n");
return -1;
}

sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0)
{
perror("Create TCP Socket");

return -1;
}

setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeo, len);

server.sin_family = AF_INET;
server.sin_port = htons(30000);
inet_pton(AF_INET, argv[1], &(server.sin_addr));

int res = connect(sock, (struct sockaddr*)&server, sizeof(server));
if (res < 0)
{
if(res == EINPROGRESS)
perror("connecting stream socket time out:");
else
perror("connecting stream socket error:");
close(sock);
return -1;
}
else
{
printf("Connect Server@%s\n",argv[1]);
for(i=0;i<10;i++)
{
int wsize = send(sock,wbuf,sizeof(wbuf),0);
if(wsize<=0)
{

perror("write error:");
close(sock);
return -1;
}
printf("1111111i=%d\n",i);
while(1)
{
int rsize=recv(sock,rbuf,sizeof(rbuf),0);
if(rsize>0)
{
rbuf[rsize]='\0';
printf("recv msg from server: %s\n",rbuf);
break;
}
if(rsize<0)
{
close(sock);
perror("read error:");
return -1;
}
}

}
close(sock);
return 0;
}

}

server.c:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>

int main(int argc, char** argv)
{
int listenfd, connfd;
struct sockaddr_in servaddr = {0};
char rbuf[128];
char wbuf[] = "hello client";
int n;

if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
{
perror("Create TCP Socket");
return -1;
}

servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(30000);

if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
{
perror("bind socket error:");
return -1;
}

if( listen(listenfd, 10) == -1)
{
perror("listen socket error:");
return -1;
}

printf("======waiting for client's request======\n");
while(1)
{
if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)
{
perror("accept socket error:");
continue;
}
while(1)
{
n = recv(connfd, rbuf, sizeof(rbuf), 0);
if(n>0)
{
rbuf[n] = '\0';
printf("recvmsg from client: %s\n", rbuf);
n = send(connfd, wbuf, sizeof(wbuf),0);
if(n<=0)
{
perror("sned error:");
close(connfd);
break;
}
}
else if(n < 0)
{
perror("recv error:");
close(connfd);
break;
}
}
close(connfd);
}
close(listenfd);
return 0;
}

運行的時候 client
./client 你的serverip
埠我用的30000 寫死在程序里了

3. linux socket 設置從哪個網路設備發送數據 SO

||m_SockFd = socket(AF_INET, SOCK_STREAM, 0);

if (m_SockFd==-1)
{
LOG4CPLUS_ERROR(logger, "opening stream socket ," <<__FILE__ <<" , "<<__LINE__ );

return 1;
}

// 綁定網路路由,eth0 or wlan0
struct ifreq struIR;
char sDev[16]={0};
if(GlobalConfig::IsHasGateWay("eth0") == true){
strcpy(sDev,"eth0");
LOG4CPLUS_WARN(logger, "tcpclient SO_BINDTODEVICE 1sDev = " << sDev);

}
else if(GlobalConfig::IsHasGateWay("wlan0") == true){
strcpy(sDev,"wlan0");
LOG4CPLUS_WARN(logger, "tcpclient SO_BINDTODEVICE 2sDev = " << sDev);

}
LOG4CPLUS_WARN(logger, "tcpclient SO_BINDTODEVICE sDev = " << sDev);
if(strstr(sDev,"eth0") || strstr(sDev,"wlan0")){
strncpy(struIR.ifr_name, sDev, IFNAMSIZ);
if (setsockopt(m_SockFd, SOL_SOCKET, SO_BINDTODEVICE, (char *)&struIR, sizeof(struIR)) < 0){
perror("setsockopt SO_BINDTODEVICE error\n");
LOG4CPLUS_WARN(logger, "tcpclient SO_BINDTODEVICE error\n");
}

4. linux下socket客戶端怎麼分包發送數據,以及報文,

socket系列的函數都是系統調用,你只要指定要傳輸的數據、對端IP、埠,socket介面會陷入內核,通過TCP/IP協議棧對你的數據進行封裝以及路由轉發。

5. linux發送socket報文

使用sendto函數。
linux發送socket報搜肢文使用UDP協議發送報文,首先創建褲仿一個socket,然後設置伺服器的IP地址和埠號,最後使用sendto函數發送報文。
Linux全稱是GNU/Linux,是一種免費使用和自由胡漏纖傳播的類UNIX操作系統。

閱讀全文

與linuxsocket轉發相關的資料

熱點內容
長安車短程行駛里程數據如何清零 瀏覽:67
長文件如何分頁復制 瀏覽:246
u裝機裝系統教程 瀏覽:953
蘋果越獄會泄露個人銀行信息嗎 瀏覽:881
windows網路連接數 瀏覽:406
ios判斷沙盒文件是否存在 瀏覽:681
知識瀏覽app 瀏覽:640
ug編程外r角怎麼弄出來 瀏覽:474
點擊展開隱藏代碼 瀏覽:76
華強北組裝機蘋果手機 瀏覽:683
直接在工件上扎溝怎麼編程對刀 瀏覽:145
智能車教程 瀏覽:615
大數據干到多少歲 瀏覽:508
excel2013的工作薄文件默認擴展名 瀏覽:609
iphone6splus水貨報價 瀏覽:12
單向鏈表如何存入數據 瀏覽:312
視頻播客程序 瀏覽:25
有什麼做文件壓縮包免費的軟體 瀏覽:658
問卷星下拉題目為什麼數據是序號 瀏覽:161
蘇寧銷售數據多少 瀏覽:412

友情鏈接