包含在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文件传输介绍到此结束。不知道你有没有从中找到你需要的信息?如果你想了解更多这方面的内容,记得关注这个网站。
最后更新于 2023-09-13 10:40:30 并被添加「」标签,已有 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
相关文章
- 静态多线程c语言(java静态多线程)
- C语言中的十六进制(C语言中的十六进制是十进制)
- C语言后缀的功能(C语言程序后缀)
- C语言命令行参数示例(如何在C语言中运行命令行参数)
- C语言中的非法实数常量(C语言中的合法实数常量)