c语言 socket 网络编程 一个客户端,多个服务器问题

sinat_19388205 2014-08-11 10:08:41
服务器代码:
#include <stdio.h>
#include <winsock2.h>
#include <stdlib.h>
#include <process.h>
#pragma comment(lib, "wsock32.lib")

SOCKET sck,consck[10];
int cur = 0;
struct sockaddr_in temp[10];

void listen_proc(void * pdummy)
{
int index = cur;
cur++;
char buf[256]; int r = 0;
for(;;)
{
memset(buf, 0, 256);
r = recv(consck[index], buf, 256, 0);
if (r < 1) break;
printf("收到%s的数据:%s\n", inet_ntoa(temp[index].sin_addr ), buf);
}
return;
}

void accept_proc(void * pdummy)
{
for(int i = 0;1;i++)
{
int length = sizeof(temp[i]);
consck[i] = accept(sck, (struct sockaddr *)&temp[i], &length);
printf("%s接收成功...\n", inet_ntoa(temp[i].sin_addr ));
_beginthread(&listen_proc, 0, 0);
}
return;
}


void main()
{
/*Socket()*/
WSAData w;
memset(&w, 0, sizeof(w));
if(WSAStartup(0x0101, &w)) //启动Socket
{
printf("启动Socket失败!");
exit(0);
}
printf("启动Socket成功...\n");

sck = socket(AF_INET, SOCK_STREAM, 0); //创建Socket
printf("创建Socket成功...\n");

/*Bind(),绑定ip地址和端口号*/
struct sockaddr_in my_addr;

memset(&my_addr, 0, sizeof(my_addr));
my_addr.sin_family = AF_INET; //设置版本
my_addr.sin_port = htons(10000); //设置端口号
my_addr.sin_addr.S_un.S_addr = INADDR_ANY; //设置服务器IP地址
//my_addr.sin_addr.S_un.S_addr = inet_addr(ip); //设置服务器IP地址

if(bind(sck, (sockaddr *)&my_addr, sizeof(my_addr)) == SOCKET_ERROR)
{
printf("绑定Scoket失败!\n");
exit(0);
}
printf("绑定Socket成功...\n");


/*Listen()*/
listen(sck, 5);
printf("服务器监听状态...\n");


/*Accept()*/
_beginthread(&accept_proc, 0, 0);




/*Send()*/
char buf[256];
int s;
do
{
memset(buf, 0, 256);
gets(buf);
s = send (consck[0], (char *)&buf, sizeof(buf),0);
if ( s < 1) break;
}
while(!strstr(buf, "exit"));

WSACleanup();
}


客户端代码:
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <process.h>
#pragma comment(lib, "wsock32.lib")

SOCKET sck;


void listen_proc(void * pdummy)
{
char buf[256]; int r = 0;
for(;;)
{
memset(buf, 0, 256);
r = recv(sck , buf, 256, 0);
if (r < 1) break;
printf("收到数据:%s\n", buf);
}
return;
}


void main()
{
/*Socket()*/
WSAData w; memset(&w, 0, sizeof(w));
if(WSAStartup(0x0101, &w)) //启动Socket
{
printf("启动Socket失败!");
exit(0);
}
printf("启动Socket成功...\n");

sck = socket(AF_INET, SOCK_STREAM, 0); //创建Socket
printf("创建Socket成功...\n");

/*Connet()*/
hostent *phost=gethostbyname("我的域名");
in_addr addr;
char* ip;
for(int i=0;;i++)
{
char *p=phost->h_addr_list[i];
if(p==NULL)
break;
memcpy(&addr.S_un.S_addr,p,phost->h_length);
ip = inet_ntoa(addr);
}

struct sockaddr_in client;
client.sin_family = AF_INET; //设置版本
client.sin_port = htons(10000); //设置端口号
client.sin_addr.S_un.S_addr = inet_addr(ip); //设置IP地址
//client.sin_addr.S_un.S_addr = inet_addr("192.168.1.22"); //设置IP地址
if(connect(sck, (struct sockaddr *)&client, sizeof(sockaddr)))
{
printf("服务器连接失败!\n");
exit(0);
}
printf("服务器连接成功...\n");

/*Recv()*/
printf("开始接收信息...\n");
_beginthread(&listen_proc, 0, 0);


/*Send()*/
char buf[256];
int s;
do
{
memset(buf, 0, 256);
gets(buf);
s = send (sck, (char *)&buf, sizeof(buf),0);
if ( s < 1) break;
}
while(!strstr(buf, "exit"));

WSACleanup();
}


为什么打开服务器之后,第一个客户端能够正常连接,第二个客户端无法连接成功?
...全文
886 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinat_19388205 2014-08-12
  • 打赏
  • 举报
回复
如果我采用127.0.0.1的地址的话 可以多开客户端..为什么我采用域名访问的时候就不行了呢? 花生壳注册的免费域名
赵4老师 2014-08-12
  • 打赏
  • 举报
回复
参考 MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLEC.DSP MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLES.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLEC.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\IOCTL.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\README.TXT MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\MAKEFILE
sinat_19388205 2014-08-12
  • 打赏
  • 举报
回复
怎么回复指定楼层啊.... 回复6楼: 服务器和客户端不是要同一个端口才能够进行连接吗? 一旦连接建立,会同时返回,是什么意思? 求教导
sinat_19388205 2014-08-12
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
试试将 ip 域名 添加到C:\WINDOWS\system32\drivers\etc\hosts末尾
不是这个问题吧。
赵4老师 2014-08-12
  • 打赏
  • 举报
回复
引用 8 楼 sinat_19388205 的回复:
如果我采用127.0.0.1的地址的话 可以多开客户端..为什么我采用域名访问的时候就不行了呢? 花生壳注册的免费域名
试试将 ip 域名 添加到C:\WINDOWS\system32\drivers\etc\hosts末尾
勤奋的小游侠 2014-08-11
  • 打赏
  • 举报
回复
for(int i=0;;i++)这里存在溢出,
服务器和客户用同一个端口号,要是在同一台机器上运行,后果就不说了。
服务器这样的多线程accept太乱了。
数个线程同时竞争一个socket,一但连接建立,会同时返回,导致没有线程再临听。
建议楼主看一下select模型。
sinat_19388205 2014-08-11
  • 打赏
  • 举报
回复
上面是服务器代码
sinat_19388205 2014-08-11
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <winsock2.h>
#include <stdlib.h>
#include <process.h>
#pragma comment(lib, "wsock32.lib")

SOCKET sck,consck[10];
int cur = 0;
struct sockaddr_in temp[10];

void  listen_proc(void * pdummy)
{
	int index = cur;
	cur++;
	char buf[256];	int r = 0;
	for(;;) 
	{	
		memset(buf, 0, 256);
		r = recv(consck[index], buf, 256, 0);
		if (r < 1) break;
		printf("收到%s的数据:%s\n", inet_ntoa(temp[index].sin_addr ), buf);
	}
	return;
}

void  accept_proc(void * pdummy)
{	
	for(int i = 0;1;i++) 
	{
		int length = sizeof(temp[i]);
		consck[i] = accept(sck, (struct sockaddr *)&temp[i], &length);
		printf("%s接收成功...\n", inet_ntoa(temp[i].sin_addr ));
		_beginthread(&listen_proc, 0, 0);
	}
	return;
}


void main()
{	
	/*Socket()*/
	WSAData w; 
	memset(&w, 0, sizeof(w));
	if(WSAStartup(0x0101, &w))	//启动Socket
	{	
		printf("启动Socket失败!");
		exit(0);
	}									
	printf("启动Socket成功...\n");

	sck = socket(AF_INET, SOCK_STREAM, 0);	//创建Socket
	printf("创建Socket成功...\n");

	/*Bind(),绑定ip地址和端口号*/
	struct sockaddr_in my_addr;

	memset(&my_addr, 0, sizeof(my_addr));
	my_addr.sin_family = AF_INET;	//设置版本
	my_addr.sin_port = htons(10000);	//设置端口号
	my_addr.sin_addr.S_un.S_addr =  INADDR_ANY;	//设置服务器IP地址
	//my_addr.sin_addr.S_un.S_addr =  inet_addr(ip);	//设置服务器IP地址

	if(bind(sck, (sockaddr *)&my_addr, sizeof(my_addr)) == SOCKET_ERROR)  
    {  
        printf("绑定Scoket失败!\n");  
		exit(0);
    } 
    printf("绑定Socket成功...\n");  
    

	/*Listen()*/
	listen(sck, 5);
	printf("服务器监听状态...\n");


	/*Accept()*/
	_beginthread(&accept_proc, 0, 0);

	
	
	
	/*Send()*/
	char buf[256];
	int s;
	do 
	{
		memset(buf, 0, 256);
		gets(buf);
		s = send (consck[0], (char *)&buf, sizeof(buf),0);
		if ( s < 1) break;
	}
	while(!strstr(buf, "exit"));

	WSACleanup();
}
sinat_19388205 2014-08-11
  • 打赏
  • 举报
回复
那个打错了~ 关于链接失败的错误 木有啊~~~
max_min_ 2014-08-11
  • 打赏
  • 举报
回复
代码太乱,没仔细看,把连接失败的错误打印出来看看! 还有是多个客户端连接服务端,不是多个服务端
sinat_19388205 2014-08-11
  • 打赏
  • 举报
回复
发个帖子电脑还被黑了- - 大神太多

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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