我写了一对非常简单的socket服务器端和客户端,代码如下。先启动服务端再启动客户端。
可是一连上,两端就报错,send error和recv error.这是为什么呢? 高人帮忙教一下哈!服务端:
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsa;
if(0!=WSAStartup(MAKEWORD(2,2),&wsa))return 1;
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//IPPROTO_TCP和0的区别在哪里?
if(sockSrv==INVALID_SOCKET)return 1;
SOCKADDR_IN sAddr;
sAddr.sin_family=AF_INET;
sAddr.sin_port =htons(34567);
sAddr.sin_addr.S_un.S_addr =htonl(INADDR_ANY);
if(SOCKET_ERROR == bind( sockSrv, (LPSOCKADDR)&sAddr, sizeof( SOCKADDR )))return 1;
if(SOCKET_ERROR == listen(sockSrv,0))return 1;//backlog的作用是什么?
int cbAddr = sizeof(SOCKADDR);
while(1){
SOCKET hAccSocket = accept(sockSrv, (SOCKADDR*)&sAddr, &cbAddr );
if(hAccSocket==INVALID_SOCKET)return 1;
printf("Accepted!\n");
while(1){
if(SOCKET_ERROR == send(sockSrv,"Hi",3,0) ){
printf("send error\n");
break;
}
printf("data sent\n");
}
closesocket(hAccSocket);
}
WSACleanup();
return 0;
}
客户端:
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
if(0!=WSAStartup(MAKEWORD(2,2), &wsaData ))return 1;
SOCKET hClient=socket(AF_INET,SOCK_STREAM,0);
if(hClient==INVALID_SOCKET)return 1;
SOCKADDR_IN sAddr;
sAddr.sin_family=AF_INET;
sAddr.sin_port =htons(34567);
sAddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");
if( SOCKET_ERROR==connect( hClient, (LPSOCKADDR)&sAddr, sizeof(SOCKADDR) ) )return 1;
while(1){
char buf[10]={0};
if(0>=recv(hClient,buf,10,0)){
printf("recv error\n");
break;
}
printf("received %s\n",buf);
Sleep(5000);
}
closesocket(hClient);
WSACleanup();
return 0;
}
可是一连上,两端就报错,send error和recv error.这是为什么呢? 高人帮忙教一下哈!服务端:
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsa;
if(0!=WSAStartup(MAKEWORD(2,2),&wsa))return 1;
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//IPPROTO_TCP和0的区别在哪里?
if(sockSrv==INVALID_SOCKET)return 1;
SOCKADDR_IN sAddr;
sAddr.sin_family=AF_INET;
sAddr.sin_port =htons(34567);
sAddr.sin_addr.S_un.S_addr =htonl(INADDR_ANY);
if(SOCKET_ERROR == bind( sockSrv, (LPSOCKADDR)&sAddr, sizeof( SOCKADDR )))return 1;
if(SOCKET_ERROR == listen(sockSrv,0))return 1;//backlog的作用是什么?
int cbAddr = sizeof(SOCKADDR);
while(1){
SOCKET hAccSocket = accept(sockSrv, (SOCKADDR*)&sAddr, &cbAddr );
if(hAccSocket==INVALID_SOCKET)return 1;
printf("Accepted!\n");
while(1){
if(SOCKET_ERROR == send(sockSrv,"Hi",3,0) ){
printf("send error\n");
break;
}
printf("data sent\n");
}
closesocket(hAccSocket);
}
WSACleanup();
return 0;
}
客户端:
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
if(0!=WSAStartup(MAKEWORD(2,2), &wsaData ))return 1;
SOCKET hClient=socket(AF_INET,SOCK_STREAM,0);
if(hClient==INVALID_SOCKET)return 1;
SOCKADDR_IN sAddr;
sAddr.sin_family=AF_INET;
sAddr.sin_port =htons(34567);
sAddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");
if( SOCKET_ERROR==connect( hClient, (LPSOCKADDR)&sAddr, sizeof(SOCKADDR) ) )return 1;
while(1){
char buf[10]={0};
if(0>=recv(hClient,buf,10,0)){
printf("recv error\n");
break;
}
printf("received %s\n",buf);
Sleep(5000);
}
closesocket(hClient);
WSACleanup();
return 0;
}
解决方案 »
- 哪位有 BCGControlbar 10.21的安装版?给我一份.未安装版的不要.
- vc++ List Control 如何在每行、每列都添加复选框?
- 如何在CIimageList变量中添加图标?
- 按钮又见按钮
- VC连接数据库问题!
- 急请教:怎么从用户socket传递的信息获得用户请求的服务器的IP?
- 删除记录出错,请帮忙!
- 怎样一行一行的画图打印
- 新手要做个在线升级程序,help
- 实现 动态创建的RichEdit控件支持的文件拖放
- CDECL和_cdecl有什么不同以及为什么使用变参和_stdcall不出错?
- vs2005 mfc dialog,不用unicode,combox下拉列表很短?怎么解决
{
WSADATA wsa;
if(0!=WSAStartup(MAKEWORD(2,2),&wsa))return 1;
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//IPPROTO_TCP和0的区别在哪里?
if(sockSrv==INVALID_SOCKET)return 1;
SOCKADDR_IN sAddr;
sAddr.sin_family=AF_INET;
sAddr.sin_port =htons(34567);
sAddr.sin_addr.S_un.S_addr =htonl(INADDR_ANY);
if(SOCKET_ERROR == bind( sockSrv, (LPSOCKADDR)&sAddr, sizeof( SOCKADDR )))return 1;
if(SOCKET_ERROR == listen(sockSrv,0))return 1;//backlog的作用是什么?
int cbAddr = sizeof(SOCKADDR);
while(1){
SOCKET hAccSocket = accept(sockSrv, (SOCKADDR*)&sAddr, &cbAddr );
if(hAccSocket==INVALID_SOCKET)return 1;
printf("Accepted!\n");
while(1){
if(SOCKET_ERROR == send(sockSrv,"Hi",3,0) ){ ////这句是干什么用的? printf("send error\n");
break;
}
printf("data sent\n");
}
closesocket(hAccSocket); }
WSACleanup();
return 0;
}
楼主的服务器程序在收到连接后将套接字转让到hAccSocket 后,就应该用hAccSocket 进行数据交换。所以
if(SOCKET_ERROR == send(sockSrv,"Hi",3,0) )应该改为if(SOCKET_ERROR == send(hAccSocket ,"Hi",3,0) )
printf("send error\n");
break;
第一个参数应该是accept函数返回的hAccSocket句柄,而不是监听SOCKET句柄