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;
}