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操作系统。