windows tcp 多线程server端断开 本帖最后由 oyljerry 于 2013-01-24 18:53:37 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 client端:#include <stdio.h>#include <windows.h>#include <stdlib.h>#define FILENAME 200#define BUFFER 1024#define PORT 9999#pragma comment(lib, "ws2_32.lib") #define LENGTH 200struct FILEHEAD //文件信息结构{ char path_buffer[LENGTH]; //文件绝对路径 char filename[LENGTH]; //文件名 char ext[LENGTH]; //文件扩展名 unsigned int length; //文件长度 };FILEHEAD file; void setFileInformation(){ memset(&file,0,sizeof(FILEHEAD)); //_makepath( path_buffer, "c", "\\sample\\crt\\", "makepath", "c" ); printf( "input the path and name : \n"); scanf("%s",file.path_buffer); _splitpath( file.path_buffer, NULL, NULL, file.filename, file.ext ); FILE *fp= NULL; fp=fopen(file.path_buffer,"r"); if (NULL==fp) { printf("cannot open the %s \n",file.path_buffer); exit(0); } fseek(fp,0l,SEEK_END); file.length=ftell(fp); //fclose(fp); //fp = NULL; //需要指向空,否则会指向原打开文件地址 printf( "file head information:\n" ); //printf( " Drive: %s\n", drive ); //printf( " Dir: %s\n", dir ); printf( " Filename: %s\n", file.filename ); printf( " Ext: %s\n", file.ext ); printf( " length is btye: %ld btye\n", file.length );}int main(int argc, char *argv[]){ WSADATA wsadata; WSAStartup(MAKEWORD(2,0),&wsadata); SOCKET sock_trans=socket(AF_INET,SOCK_STREAM,0); if (sock_trans==0) { printf ("socket build faile!!\n"); exit(1); } printf ("target pc's IP address: 127.0.0.1\n"); //如果正式调试,将服务器端ip写死。 SOCKADDR_IN sockadd; sockadd.sin_family=AF_INET; sockadd.sin_port=htons(PORT); sockadd.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); int con_info=connect(sock_trans,(SOCKADDR*)&sockadd,sizeof(sockadd)); if (con_info==SOCKET_ERROR) { printf ("connect fail!\n"); //exit(2); } Sleep(1000); setFileInformation(); FILE *fp; fp=fopen(file.path_buffer,"rb"); if (fp==NULL) { perror("\nopen file error:"); exit(1); } //freed_return_val=fread(buf,1,1024,fp);//读文件字符 char buf[BUFFER]; int fread_return_val=0;//文件读出字符的返回值 //发送文件头信息 printf("发送文件头信息...\n"); send(sock_trans,(char *)&file,sizeof(file),0); printf("发送文件信息...\n"); while (1) { fread_return_val=fread(buf,1,1024,fp); if (0==fread_return_val) { break; } //freed_return_val=fread(buf,1,1024,fp); send(sock_trans,buf,fread_return_val,0); printf("."); } fclose(fp); closesocket(sock_trans); WSACleanup(); printf("\n发送完成...\n"); return 0; } while (1) { SOCKET connect; //循环等待 if ((connect=accept(socklisten,(sockaddr *)&clientaddr,&client_addr_length))==INVALID_SOCKET) { printf("accept failed!!\n"); closesocket(connect); WSACleanup(); return -1; } //创建新线程 DWORD ThreadID; CreateThread(NULL,0,RequestThread,(LPVOID)connect,0,&ThreadID); } 这样也还是存在断开的问题啊 如何制作类似VS2005的工具箱控件 vc6如何设置Unicode字符集 Windows下 驱动安装问题 如何能够知道listctrl列表中数据的行数 关于IDD 寻找一种物质,请见多识广的人帮帮忙。 关于msgina的替换 回溯法 问个有关msdn的问题 最小堆排序时的问题 求助:关于获取线程输出写入文本的问题 ????求助:vc++2010 使用CMSComm出现“该组件上的 GetValue 操作失败,生成错误代码 0x80020003。”
#include <windows.h>
#include <stdlib.h>#define FILENAME 200
#define BUFFER 1024
#define PORT 9999
#pragma comment(lib, "ws2_32.lib") #define LENGTH 200
struct FILEHEAD //文件信息结构
{
char path_buffer[LENGTH]; //文件绝对路径
char filename[LENGTH]; //文件名
char ext[LENGTH]; //文件扩展名
unsigned int length; //文件长度
};FILEHEAD file; void setFileInformation()
{
memset(&file,0,sizeof(FILEHEAD));
//_makepath( path_buffer, "c", "\\sample\\crt\\", "makepath", "c" );
printf( "input the path and name : \n");
scanf("%s",file.path_buffer);
_splitpath( file.path_buffer, NULL, NULL, file.filename, file.ext );
FILE *fp= NULL;
fp=fopen(file.path_buffer,"r");
if (NULL==fp)
{
printf("cannot open the %s \n",file.path_buffer);
exit(0);
}
fseek(fp,0l,SEEK_END);
file.length=ftell(fp);
//fclose(fp);
//fp = NULL; //需要指向空,否则会指向原打开文件地址
printf( "file head information:\n" );
//printf( " Drive: %s\n", drive );
//printf( " Dir: %s\n", dir );
printf( " Filename: %s\n", file.filename );
printf( " Ext: %s\n", file.ext );
printf( " length is btye: %ld btye\n", file.length );
}int main(int argc, char *argv[])
{
WSADATA wsadata;
WSAStartup(MAKEWORD(2,0),&wsadata);
SOCKET sock_trans=socket(AF_INET,SOCK_STREAM,0);
if (sock_trans==0)
{
printf ("socket build faile!!\n");
exit(1);
}
printf ("target pc's IP address: 127.0.0.1\n");
//如果正式调试,将服务器端ip写死。
SOCKADDR_IN sockadd;
sockadd.sin_family=AF_INET;
sockadd.sin_port=htons(PORT);
sockadd.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
int con_info=connect(sock_trans,(SOCKADDR*)&sockadd,sizeof(sockadd));
if (con_info==SOCKET_ERROR)
{
printf ("connect fail!\n");
//exit(2);
}
Sleep(1000);
setFileInformation(); FILE *fp;
fp=fopen(file.path_buffer,"rb");
if (fp==NULL)
{
perror("\nopen file error:");
exit(1);
}
//freed_return_val=fread(buf,1,1024,fp);//读文件字符
char buf[BUFFER];
int fread_return_val=0;//文件读出字符的返回值 //发送文件头信息
printf("发送文件头信息...\n");
send(sock_trans,(char *)&file,sizeof(file),0); printf("发送文件信息...\n");
while (1)
{
fread_return_val=fread(buf,1,1024,fp);
if (0==fread_return_val)
{
break;
}
//freed_return_val=fread(buf,1,1024,fp);
send(sock_trans,buf,fread_return_val,0);
printf(".");
}
fclose(fp);
closesocket(sock_trans);
WSACleanup();
printf("\n发送完成...\n");
return 0;
}
SOCKET connect; //循环等待
if ((connect=accept(socklisten,(sockaddr *)&clientaddr,&client_addr_length))==INVALID_SOCKET) { printf("accept failed!!\n"); closesocket(connect); WSACleanup(); return -1; } //创建新线程 DWORD ThreadID; CreateThread(NULL,0,RequestThread,(LPVOID)connect,0,&ThreadID); }
这样也还是存在断开的问题啊