C语言编写TCP的文件传输

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言编写TCP的文件传输相关的知识,希望对你有一定的参考价值。

刚开始接触网络变成,按照书上写的一个文件传输小工具,控制台下的。发现这个程序只能由客户端向服务端提取文件,并不能让服务端主动发送文件。
问题是:怎样修改能让发送的一方主动地选择发送文件,而不是由接收方去选择。
代码太长,粘贴不进来。麻烦各位在网盘下载吧,txt格式,一个server端一个client端,绝无病毒。http://pan.baidu.com/s/1pL9u4sV

参考技术A 参考下面代码
#include <winsock2.h> #include <stdio.h> #include <stdlib.h>
#pragma comment(lib,"ws2_32.lib") #define DEFAULT_PORT 2302 #define DEFAULT_BUFFER 2048
#define DEFAULT_MESSAGE "This is a test of the emergency \ broadcasting system" char szServerip[128], // Server to connect to szMessage[1024]; // Message to send to sever
int iPort = DEFAULT_PORT; // Port on server to connect to
//DWORD dwCount = DEFAULT_COUNT; // Number of times to send message BOOL bSendOnly = FALSE; // Send data only; don't receive int dirfun();

var cpro_psid ="u2572954"; var cpro_pswidth =966; var cpro_psheight =120;

int getfun(); int putfun(); int pwdfun(); int cdfun(); int mdfun(); int delfun(); int usafun();
void usage()
printf("usage: client [-p:x] [-s:IP] [-n:x] [-o]\n\n"); printf(" -p:x Remote port to send to\n");
printf(" -s:IP Server's IP address or hostname\n"); printf(" -n:x Number of times to send message\n"); printf(" -o Send messages only; don't receive\n"); ExitProcess(1);
void ValidateArgs(int argc, char **argv)
int i;
for(i = 1; i < argc; i++)
if ((argv[i][0] == '-') || (argv[i][0] == '/'))
switch (tolower(argv[i][1]))
case 'p': // Remote port if (strlen(argv[i]) > 3) iPort = atoi(&argv[i][3]); break;
case 's': // Server if (strlen(argv[i]) > 3)
strcpy(szServerip, &argv[i][3]); break;
case 'n': // Number of times to send message if (strlen(argv[i]) > 3)
//dwCount = atol(&argv[i][3]); break;
case 'o': // Only send message; don't receive bSendOnly = TRUE; break; default: usage();追问

代码不全

追答

所以只是参考啊,哪有把代码写全的呢,余下的就靠你自己想了,这样才会有进步

追问

我只是想知道能不能基于我那个写好的代码修改呢

最近刚接触socket,什么都不懂

像飞鸽 QQ不都是可以主动发送的吗,他们怎么实现的

如何为多个客户端编写java TCP对象传输

【中文标题】如何为多个客户端编写java TCP对象传输【英文标题】:How to write java TCP object transmission for multiple clients 【发布时间】:2014-01-08 03:47:23 【问题描述】:

我正在编写一个原始的类似图形 MUD 的在线游戏,仅使用 Java 标准库 - 仅使用 Swing 和 TCP 套接字(用于学校和娱乐)。游戏有一个服务器(我壁橱里的一台备用笔记本电脑),它接受来自玩家的 TCP 连接并接收对象(使用 ObjectInputStream) - 聊天字符串和丢弃的物品等 - 并使用这些对象对虚拟世界进行更改,然后转发给其他玩家。

最初,我认为我可以通过让我的服务器的主线程使用循环监听他们的每个连接,让每个玩家连接到我服务器上的同一个 TCP 端口(端口 5010),就像这样......

while (true)

        //get new connection
    serversocket = new ServerSocket(5010);
    socket = serversocket.accept();
    serversocket.close();
        //proceed to log in player using their computer's host name.
 

然后我将每个新玩家的 TCP 套接字连接传递给专用于该玩家对象输入和输出的线程,如下所示:

new_thread = new Thread(new Server_Input_Thread(main_thread_socket));

在调试时,我通过在另一台笔记本电脑上运行服务器端应用程序和客户端应用程序并通过“localhost”连接来测试游戏。

但是我遇到了问题。在建立初始连接(也在端口 5010 上)后侦听新连接(在端口 5010 上)时,我无法通过 IOExceptions,例如绑定异常和“java.net.SocketException:套接字已关闭”。

显然我这样做的方式不起作用,也许我需要为每个玩家分配一个唯一的端口号,而不是让每个玩家都尝试连接到端口 5010,或者可能是因为我正在使用我的将笔记本电脑编码为客户端和服务器。

不幸的是,我不知道自己在做什么——一个学期前我刚刚宣布计算机科学为我的专业。请解释如何为这样的虚拟世界构建网络连接,并避免在客户端应用程序和服务器之间的初始连接后立即发生的 IOExceptions,因为服务器再次开始在端口 5010 上侦听新连接主线程。

【问题讨论】:

好吧,您在打开插座后直接关闭它。这是你的第一个问题。 你试过oracle网络教程吗? 是的,但它更像是略读而不是彻底阅读。 除了小小的技术细节之外,我很好奇整体设计中是否有任何大的漏洞。例如,如果 TCP 对于同时向许多不同的玩家发送数据是一个糟糕的设计选择——也许我应该改用 UDP Multisocket。或者 UDP 可能是一个糟糕的选择,因为 UDP 信号不太可能通过无线调制解调器、防火墙和 TCP 信号的一种方式。那些可预见的大问题。 【参考方案1】:

试试这个

serversocket = new ServerSocket(5010);

while (true)

    socket = serversocket.accept();


    //proceed to log in player using their computer's host name.
 
serversocket.close();

我不会向您展示您将面临的其他问题,但这至少应该让您继续前进。

【讨论】:

但我读到ServerSocket仅用于建立连接。 服务器套接字始终保持打开状态。它正在侦听连接。客户端可以连接到侦听套接字。服务器无法连接到客户端套接字。这就是 TCP 的工作原理。 哦,我明白了。 ServerSocket 对象不只是创建一个连接,然后在每次需要新连接时被一个新连接替换。 欢迎来到兔子洞。是的,你是对的。如果您需要答案,请发布更多内容。

以上是关于C语言编写TCP的文件传输的主要内容,如果未能解决你的问题,请参考以下文章

怎么使用C编写一个串口文件传输程序

使用C语言实现服务器/客户端的TCP通信

Go 语言自我提升 (三次握手 - 四次挥手 - TCP状态图 - udp - 网络文件传输)

Linux C系统编程中的文件传输问题:只能传送文本文件,不能传送二进制文件。(TCP+文件I/O实现)

艺萌TCP文件传输及自动更新系统介绍(TCP文件传输)

请教用C语言编的借助UDP协议实现的文件传输的程序