socket connect的问题

hanyuwei0 2010-06-28 08:52:21
我写的简单的socket服务器和客户端程序,服务器是只能接收一个客户端的连接。代码如下

// 创建套节字
SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sListen == INVALID_SOCKET)
{
printf("Failed socket() \n");
return 0;
}

// 填充sockaddr_in结构
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(6000);
sin.sin_addr.S_un.S_addr = INADDR_ANY;

// 绑定这个套节字到一个本地地址
if(::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf("Failed bind() \n");
return 0;
}

// 进入监听模式
if(::listen(sListen, 2) == SOCKET_ERROR)
{
printf("Failed listen() \n");
return 0;
}

// 接受客户的连接请求
sockaddr_in remoteAddr;
int nAddrLen = sizeof(remoteAddr);
SOCKET sClient;
char szText[1024];
memset(szText,0,1024);
// 接受一个新连接
sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);
if(sClient == INVALID_SOCKET)
{
printf("Failed accept()");

}

printf(" 接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
}


在客户端connect时我这样写

m_socket=socket(AF_INET,SOCK_STREAM,0);
if(INVALID_SOCKET==m_socket)
{
MessageBox("创建套接字失败!");
return ;
}


SOCKADDR_IN m_serv;
m_serv.sin_addr.S_un.S_addr=htonl(dwip);
m_serv.sin_family=AF_INET;
m_serv.sin_port=htons(m_port);


if(SOCKET_ERROR==connect(m_socket,(SOCKADDR*)&m_serv,sizeof(m_serv)))
{

MessageBox("连接服务器失败,请检查当前网络是否正常或对方服务器是否开启!");
return ;
}


目的是第一次运行客户端可以成功连上,第二次运行客户端会提示那段文字。但问题是第一次连接上了,第二次连接后程序没反应,MessageBox里那个里面没有执行,也就是connect成功了??
相不通是怎么回事,谁能解答下。顺便告诉下怎么样实现我想要的目的,就是只能一个客户端连上,另一个连会提示错误。
...全文
455 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanyuwei0 2010-07-01
  • 打赏
  • 举报
回复
5楼说的很对,如果把监听用的那个套接字给关闭了就不会connect成功了
灌水九段 2010-06-30
  • 打赏
  • 举报
回复
换一种思路 服务器端新建socket的时候 你专门开一个端口处理你要的客户端请求不行吗?
周药师 2010-06-29
  • 打赏
  • 举报
回复
用多线程吧
接收一个请求,新建一个线程,专门处理这个socket请求
Kylin_Bird_Lee 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fo1_sky 的回复:]
循环加重用
[/Quote]
怎么重用???重复调用ACCEPT???不明白啊~~~
fo1_sky 2010-06-29
  • 打赏
  • 举报
回复
循环加重用
Kylin_Bird_Lee 2010-06-29
  • 打赏
  • 举报
回复
to 2楼:

你的机制是循环检测ACCEPT进来的客户端,然后处理,最后必须要关闭socket才可以,如果你把closesocket(sock_client);去掉,你就出现和楼主一样的问题,现在楼主的意思是我是不是可以理解为只开一个连接,然后在不关闭SOCKET的情况下,持续发送和接收数据,客户端为同一个,之所以我这样理解,是因为我也遇到了同样的问题,我正在找相关的解决办法,之前我的程序和zhouzhangkui(周药师) 同学提供的程序基本一样,但是当客户端保持连接不断开的时候,持续发送数据SOCKET就没有反应了,只对第一个包有反应,进行了处理发送和接收,但是接下来再发送过来的包却不予理睬,我想到过用事件来响应ACCEPT,但是现在还没想到方法,在此帮顶,希望牛人大大帮忙解决..
另:连接多个客户端用线程池这个我了解,需要的是一个端,连接服务器持续发送接收包该如何操作??

帮楼主谢谢各位,谢谢,也帮我自己,哈哈
xgPaul 2010-06-29
  • 打赏
  • 举报
回复
你要想服务器是只能接收一个客户端的连接,则可以在服务器端接收到一个连接后,把监听套接字sListen置为INVALID_SOCKET,就不会再接收到连接。。。
xghuzd 2010-06-29
  • 打赏
  • 举报
回复
楼上的顶一个
周药师 2010-06-28
  • 打赏
  • 举报
回复
那不好办啊
做个变量 ,每次接收一个自加
你要只接收一个,变量加一次后马上退出循环即可
Eleven 2010-06-28
  • 打赏
  • 举报
回复
while循环accept()客户端来connect(),然后服务器利用accept返回的socket来与连接进来的客户端通讯,之前的socket继续监听等待后续的连接请求。。。
hanyuwei0 2010-06-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhouzhangkui 的回复:]
accept 这里加一个while循环 去等待客户的请求 来接受socket客户端
[/Quote]
谢谢楼上回答,加上while循环不就是接收多个客户端连接么,我是想只接收一个客户端,多了就提示错误
周药师 2010-06-28
  • 打赏
  • 举报
回复
accept 这里加一个while循环 去等待客户的请求 来接受socket客户端
周药师 2010-06-28
  • 打赏
  • 举报
回复

//C++ socket程序
//下面是一个C++调用windows API实现有通信程序,您可以据此进行修改,封装成类.
// *******************************************************************
// client.cpp : Defines the entry point for the console application.
// *******************************************************************
#include "stdafx.h"
#include <winsock2.h>
#include <iostream>
#define PORT_SERVER 6656

int main(int argc, char* argv[])
{
std::cout << "Start up tcp client." << std::endl;

WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 0);
if (0 != WSAStartup(sockVersion, &wsaData))
{
std::cout << "Failed to retrive socket version."
<< std::endl;
return 0;
}

SOCKET sock_client;
sock_client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sock_client)
{
std::cout << "Invalid socket." << std::endl;
WSACleanup();
return 0;
}
sockaddr_in addr_sev;
addr_sev.sin_family = AF_INET;
addr_sev.sin_port = htons(PORT_SERVER);
addr_sev.sin_addr.s_addr = inet_addr("127.0.0.1");
if (SOCKET_ERROR == connect(sock_client, (sockaddr *)&addr_sev, sizeof(addr_sev)))
{
std::cout << "Failed to connect." << std::endl;
WSACleanup();
return 0;
}
char buf[512];
int recv_size = 0;
recv_size = recv(sock_client, buf, 512, 0);
if (512 > recv_size)
{
buf[recv_size] = '\0';
std::cout << "receive data is :" << buf << std::endl;
memset(buf, 0, sizeof(buf));
}
else
{
std::cout << "receive data is overflow" << std::endl;
}
closesocket(sock_client);
WSACleanup();
system("PAUSE");
return 0;
}
// *******************************************************************
// server.cpp : Defines the entry point for the console application.

// *******************************************************************
#include "stdafx.h"
#include <winsock2.h>
#include <iostream>
#define PORT_SERVER 6656
#define NUM_CLIENTS 10
int main(int argc, char* argv[])
{
std::cout << "Start up tcp server." << std::endl;

WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 0);
if (0 != WSAStartup(sockVersion, &wsaData))
{
std::cout << "Failed to retrive socket version."
<< std::endl;
return 0;
}
SOCKET sock_sev;
sock_sev = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sock_sev)
{
std::cout << "Invalid socket." << std::endl;
WSACleanup();
return 0;
}
sockaddr_in addr_sev;
addr_sev.sin_family = AF_INET;
addr_sev.sin_port = htons(PORT_SERVER);
addr_sev.sin_addr.s_addr = INADDR_ANY;
if (SOCKET_ERROR == bind(sock_sev, (sockaddr *)&addr_sev, sizeof(addr_sev)))
{
std::cout << "Failed to bind." << std::endl;
WSACleanup();
return 0;
}
if (SOCKET_ERROR == listen(sock_sev, NUM_CLIENTS))
{
std::cout << "Failed to listen." << std::endl;
WSACleanup();
return 0;
}
sockaddr_in addr_client;
int nAddrLen = sizeof(addr_client);
while (true) //注意这里! 要加循环
{
char tmp[512];
sock_client = accept(sock_sev, (sockaddr *)&addr_client, &nAddrLen);

if (INVALID_SOCKET == sock_client)
{
std::cout << "Failed to accept." << std::endl;
continue;
}
sprintf(tmp, "Your IP is %s\n", inet_ntoa(addr_client.sin_addr));
send(sock_client, tmp, strlen(tmp), 0);
std::cout << "Connection from " << inet_ntoa(addr_client.sin_addr)
<< std::endl;
closesocket(sock_client);
}

return 0;
}

hanyuwei0 2010-06-28
  • 打赏
  • 举报
回复
高手快来回答啊

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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