包含在C语言中的soket文件传输条目

今天给大家分享一下C语言soket文件传输的知识,也会讲解一下。如果你碰巧解决了你现在面临的问题,别忘了关注这个网站,现在就开始吧!

这篇文章的列表: 1.C语言如何用socket传输图片? 2.用C语言实现socket文件传输? 3.c语言套接字编程实现网络数据传输。 C语言中如何用socket传输图片 每个数据包都有大小限制,图片可能会太大而无法发送。

建议你给每个包加一个类似序列号的结构。然后传输图片数据,并按序列号重新组装。如果缺少任何序列号,您可以通过序列号再次申请。

数据包结构:图片数据的序列号(2字节)和数据包长度(4字节)部分。

图片分为n个部分。

传输方;有一个函数可以合成新的包。有一个函数可以处理丢失的包请求。

接收器:有一个功能检查片段是否完全传输。有一个合并图片片段的功能。还应该有一个功能来发送数据包丢失请求。

用c语言实现socket文件传输? 服务器代码:

#包含stdio.h

#包含stdlib.h

#包含错误号h

#包含字符串. h

#包含sys/types.h

#包含netinet/in.h

#包含sys/socket.h

#包含sys/wait.h

#define MYPORT 3490 /*定义用户连接端口*/

#定义BACKLOG 10 /*等待连接控制*/

主()

{

int sockfd,new _ fd/*监听sock_fd,new_fd上的新连接

*/

struct sockaddr _ in my _ addr/*我的地址信息*/

struct sockaddr _ in their _ addr/*连接器的地址信息*/

int sin _ size

if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) {

perror(“插座”);

出口(1);

}

我的_地址. sin _家庭= AF _ INET/*主机字节顺序*/

my _ addr . sin _ port = htons(my port);/*短,网络字节顺序*/

my _ addr . sin _ addr . s _ addr = in addr _ ANY;/*自动填充我的IP */

bzero((my_addr.sin_zero),;/*将结构的其余部分归零*/

if (bind(sockfd,(struct sockaddr *)my_addr,sizeof(struct

sockaddr))== -1) {

perror(" bind ");

出口(1);

}

if (listen(sockfd,BACKLOG)=-1){

perror(“听”);

出口(1);

}

while(1) { /* main accept()循环*/

sin _ size = sizeof(struct sockaddr _ in);

if ((new_fd = accept(sockfd,(struct sockaddr *)their_addr,\

sin_size)) == -1) {

perror(“接受”);

继续;

}

printf("服务器:从%s获得连接\n ",\

inet _ ntoa(their _ addr . sin _ addr));

如果(!fork()) { /*这是子进程*/

如果(发送(new_fd,“你好,世界!\n ",14,0) == -1)

perror(“发送”);

close(new _ FD);

退出(0);

}

close(new _ FD);/*家长不需要这个*/

while(waitpid(-1,NULL,wno hang)0);/*清理子进程*/

}

}

客户代码:

#包含stdio.h

#包含stdlib.h

#包含错误号h

#包含字符串. h

#包含sys/types.h

#包含netinet/in.h

#包含sys/socket.h

#包含sys/wait.h

#定义端口3490 /*客户端连接到远程主机的端口*/

#定义MAXDATASIZE 100 /*一次可以接收的最大字节数*/

Int main(int argc,char *argvC语言套接字编程实现网络数据传输。 仅供参考

// serverTCP.cpp:定义控制台应用程序的入口点。

//

#包含" stdafx.h "

使用命名空间std

long long CNT = 0;

无效转换(插座s)

{

Printf("新的子服务% d ... ",CNT);

发送“欢迎使用TCP文件服务器!”,strlen("欢迎来到TCP文件服务器!") 1,0);

char Buf[BUFSIZE];

FILE * fp

//printf("客户端已经打开\ n请输入文件存储地址:\ n ");

char file path[128]= { " 0 " };

ltoa(cnt,FilePath,10);

if((fp=fopen(FilePath," WB))= = NULL)

{

Printf("文件未打开\ n ");

返回;

}

其他

{

Send(s,“开始传输”,strlen(“开始传输”)1,0);

//获取文件大小

字符大小[20];

long int FileSize = 0;

recv(s,Size,21,0);

FileSize = atol(Size);

Printf("获得的文件大小:%d\n ",FileSize);

//开始传输

char Block[BUFSIZE];

long int x = 0;

while (1)

{

x = BUFSIZE

if(x文件大小)

{

recv(s,Block,BUFSIZE 1,0);

fwrite(Block,1,BUFSIZE,FP);

}

其他

{

recv(s,Block,FileSize BUFSIZE-x 1,0);

Printf("文件已接收\ n ");

fwrite(Block,1,FileSize BUFSIZE-x,FP);

fclose(FP);

打破;

}

}

}

fclose(FP);

closesocket

}

int _tmain(int argc,_TCHAR* argv[])

{

WORD myVersionRequest

WSADATA wsaData

myVersionRequest=MAKEWORD(1,1);

int err

err = wsa startup(myVersionRequest,wsa data);

如果(!呃)

{

Printf("服务器启动......................................................);

}

其他

{

Printf("服务器启动失败!");

退出(0);

}

SOCKET serSocket = socket(AF_INET,SOCK_STREAM,0);//创建了可识别的套接字

SOCKADDR _ IN addr

addr.sin _ family = AF _ INET

addr.sin_addr。S_un。s _ addr = htonl(in addr _ ANY);//ip地址

addr . sin _ port = htons(port base);//绑定端口

bind(serSocket,(SOCKADDR*)addr,sizeof(SOCKADDR));//绑定完成

listen(serSocket,ACESIZE);//其中第二个参数表示可以接收的最大连接数。

SOCKADDR _ IN clientAddr

int len = sizeof(SOCKADDR);

while(1)

{

cnt

插座serConn

serConn = accept(serSocket,(SOCKADDR*)clientAddr,len);//如果这不是accept而是conection。。你会一直听下去

if(_ begin thread((void(*)(void *))trans file,ACESIZE,(void *)serConn) 0)返回0;

}

返回0;

}

// clientTCP.cpp:定义控制台应用程序的入口点。

//

#包含" stdafx.h "

使用命名空间std

int _tmain(int argc,_TCHAR* argv[])

{

WORD myVersionRequest

WSADATA wsaData

myVersionRequest=MAKEWORD(1,1);

int err

err = wsa startup(myVersionRequest,wsa data);

如果(!呃)

{

Printf ("socket \n "已打开);

}

其他

{

//进一步绑定套接字

Printf("套接字未打开!");

返回0;

}

SOCKET cliSocket =socket(AF_INET,SOCK_STREAM,0);

SOCKADDR _ IN addr

char IP _ addr[16]= { " 127 . 0 . 0 . 1 " };

addr.sin_addr。S_un。s _ addr = inet _ addr(IP _ addr);

addr.sin _ family = AF _ INET

addr . sin _ PORT = htons(PORT);

char ACK[64];

connect(cliSocket,(SOCKADDR*)addr,sizeof(SOCKADDR));//启动连接

recv(cliSocket,ACK,sizeof(ACK),0);

printf("%s\n ",ACK);

FILE * fp

int FileSize = 0;

char Block[BUFSIZE]= { " 0 " };

char file path[128]= { " 0 " };

int I = 0;

{

Printf("请输入文件地址:\ n ");

获取(文件路径);

I = 0;

if((fp=fopen(FilePath," Rb))= = NULL)

{

I = 1;

Printf("文件无法打开\ n ");

}

}while(我);

fseek(fp,0L,SEEK _ END);

FileSize = ftell(FP);

Printf("要传输的文件大小:%d\n ",FileSize);

Printf("等待服务器接受......................................................................................................................................................................

recv(cliSocket,Block,sizeof(Block),0);

printf("%s\n ",Block);

If(strcmp(Block,“开始传输”)==0)

{

字符大小[20];

ltoa(文件大小,大小,10);

send(cliSocket,Size,sizeof(Size),0);

fseek(fp,0L,SEEK _ SET);

long int y = 0;

char trans[BUFSIZE];

而(!feof(fp))

{

fread(trans,1,BUFSIZE,FP);

y = y BUFSIZE

if(yFileSize)

{

send(cliSocket,trans,BUFSIZE 1,0);

}

其他

{

send(cliSocket,trans,FileSize BUFSIZE-y 1,0);

close socket(CLI socket);

WSACleanup();

}

}

}

Printf("文件已发送\ n ");

fclose(FP);

close socket(CLI socket);

WSACleanup();

系统(“暂停”);

返回0;

}

C语言soket文件传输介绍到此结束。不知道你有没有从中找到你需要的信息?如果你想了解更多这方面的内容,记得关注这个网站。

相关文章

发表新评论