c语言socket文件传输问题

Python08

c语言socket文件传输问题,第1张

服务器端(发送文件):首先打开文件【fopen】,用rb方式打开,既可以发送文本文件,也可以发送二进制文件,在无错时初始化套接字socket,即初始化socket库【WSAStartup】,分配socket【socket】,填充服务器的地址,即填充sockaddr_in结构,然后进行绑定【bind】,设置套接字为监听套接字【listen】,接收连接【accept】,至此服务器阻塞,等待客户端的连接。

客户端(接收文件):首先打开文件【fopen】,用wb方式打开,在无错时初始化套接字socket,即初始化socket库【WSAStartup】,分配socket【socket】,填充客户端的地址,即填充sockaddr_in结构,然后进行绑定【bind】,再填充服务器的地址结构,然后调用【connect】进行连接,当连接成功后,第一阶段的工作便结束了。

第二阶段,发送文件。

服务器端:使用循环while,结束条件是(!feof(fp)),fp是文件指针,feof检测当前的文件读取指针是否到达文件尾部,若到达了就返回真,否则返回假。然后在循环内部依次调用【fread】、【send】进行发送。这里有一个问题需要注意,调用fread的时候有两个参数是要每次读多少字节和读多少次,将第一个设置为1,将第二个设置为缓冲区的大小,用一个变量记录实际读到多少字节,即【fread】的返回值,然后将其传递给【send】,就可以实现发送文件了,在发送完成后断开连接【closesocket】,关闭文件【fclose】。

客户端:使用while死循环,调用【recv】接收文件,【fwrite】写入文件,这里也有个和上面类似的问题,就是要将recv的返回值传递给fwrite的第三个参数,即受到了多少字节,就向文件中写多少字节。当recv返回值为0时(连接断开时)退出循环,【closesocket】关闭套接字,调用【fclose】关闭文件。

mfc只是对socket进行了一些封装,大部分人做

网络编程

都是用的原始的socket,比如如下接口都可以在c下进行调用

1.socket()

2.bind()

3.connect()

4.listen()

5.accept()

6.send()

和recv()

7.sendto()

和recvfrom()

8.close()

和shutdown()

9.

getpeername

()

10.

gethostname

()

这些接口是在Winsock2.h中定义的不是在mfc中定义的,你只需要包含Winsock2.h

头文件

Ws2

_32.lib库就可以了。

首先要写个什么都不干的c/s程序

s端:

int main(void)

{

int sockfd, confd

struct sockaddr_in ser, cli

int len

sockfd = socket(PF_INET, SOCK_STREAM, 0);

bzero(ser, sizeof(ser))

ser.sin_family = PF_INET

ser.sin_port = htons(8080)

ser.sin_addr.s_addr = htonl(INADDR_ANY)//任何ip主机都接收

bind(sockfd, (struct sockaddr *)&ser, sizeof(ser))//绑定套接字

listen(scokfd, 20)

printf("receive message..........\n")

while(1)

{

len = sizeof(cil)

confd = accept(sockfd, (struct sockaddr *)&cli, &len)//confd用于处理网络连接

read()

write()

close(confd)

}

return 0

}

------------------------------------------------------------------

c端

main()

{

int sockfd

struct sockaddr_indest_addr

sockfd = socket(PF_INET,SOCK_STREAM,0)

dest_addr.sin_family=PF_INET

dest_addr.sin_port=htons(8080)//必须一样,要问为什么自己看端口号是干什么用的

dest_addr.sin_addr.s_addr=htonl(主机ip)

connect(sockfd,(structsockaddr*)&dest_addr,sizeof(struct sockaddr))

while(1)

{

write();

read();

if()

break

}

close()

}

-------------------------------------------------------------

框架我给你搭好了。

中间部分由你自己回答。

记住传送文件的时候,同步很重要。