windows编程多线程套接字传输文件

Rexxx 2008-04-29 09:15:24
大侠们,以下是我写的不能实现并发传输的,我得怎么改才行??说说思路就好.不要mfc的方法,要api的
// q008.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "winsock.h"
#include "stdlib.h"
#include "stdio.h"
#define BUF_SIZE 100000
#define MAX_THREADS 5

DWORD dwThreadId[MAX_THREADS];
HANDLE hThread[MAX_THREADS];


SOCKET servsock,clisock;
struct sockaddr_in sa;
struct sockaddr_in cliaddr; /* 存放返回的客户地址信息 */
int len;
int err;
int servport = 4567; /* 默认服务端口 */
char buff[BUF_SIZE]; /* 存放时间/日期信息的缓冲区 */
SYSTEMTIME st;
WSADATA wsd;
HANDLE hIn;
DWORD nIn;
int i;

void usage(char *name)
{
fprintf(stderr, "usage: %s [port]\n", name);
}
DWORD WINAPI Netcpf(LPVOID pp);

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


/* 初始化Winsock2.0 */
if (WSAStartup(MAKEWORD(2,0), &wsd) != 0) {
printf("WSAStartup() failed !\n");
return -3;
}

/* 创建套接字 */
printf("create socket ...\n");
servsock = socket(AF_INET, SOCK_STREAM, 0);
if (servsock == INVALID_SOCKET) {
fprintf(stderr, "socket() failed: %d\n", WSAGetLastError());
return -4;
}
printf("[OK]\n");

/* 填充服务器地址结构 */
memset(&sa, 0, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_port = htons(servport);
sa.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

/* 绑定套接字到服务器地址结构 */
printf("bind ...\n");
err = bind(servsock, (const sockaddr *)&sa,sizeof(sa));
if (err != 0) {
fprintf(stderr, "bind() failed: %d\n", WSAGetLastError());
return -5;
}
printf("[OK]\n");

/* 监听套接字 */
printf("listen ...\n");
err = listen(servsock,5);
if (err != 0) {
fprintf(stderr, "listen() failed: %d\n", WSAGetLastError());
return -6;
}
printf("[OK]\n");

/* 循环接受连接请求 */
for(i=0;i<MAX_THREADS;i++){
printf("wait request ...\n");
len = sizeof(cliaddr);
clisock = accept(servsock, (struct sockaddr *)&cliaddr, &len);
if (clisock == INVALID_SOCKET) {
fprintf(stderr, "accept() failed: %d\n", WSAGetLastError());
closesocket(servsock);
return -7;
}
printf("accept client: %s:%d\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));

hThread[i]= CreateThread(
NULL,
0,
Netcpf,
0,
0,
&dwThreadId[i]);
CloseHandle(hThread[i]);
if(i==MAX_THREADS-1) i=0;
}
closesocket(servsock); /* 关闭服务套接字 */
WSACleanup(); /* 释放资源 */
return 0;
}
DWORD WINAPI Netcpf(LPVOID pp){
hIn = CreateFile(L"E:\\BAK\\handle.txt", GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hIn == INVALID_HANDLE_VALUE) {
printf ("Cannot open input file. Error: %x\n", GetLastError ());
return 2;
}
ReadFile (hIn, buff, BUF_SIZE, &nIn, NULL);
send(clisock, buff, strlen(buff), 0); /* 发送给客户 */
CloseHandle (hIn);
closesocket(clisock); /* 关闭与客户的连接 */
printf("[server OK]\n");

return 0;
}
...全文
81 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
cba5796 2008-05-23
  • 打赏
  • 举报
回复
据说 这种情况下 用多线程 不会对速度有很大影响。
不过你的代码直接吧整个文件发过去不太好吧。
试试分快发送和断点续传吧

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧