读书人

套接字编程 纠错 accept函数,该如何解

发布时间: 2013-09-09 20:31:09 作者: rapoo

套接字编程 纠错 accept函数
按照孙鑫老师的代码
在我的电脑上运行后出现错误:

TcpSrv.cpp运行到accept函数前就不在向后运行
TcpClient.cpp接受到的recvBuf是一堆乱码

这个是 TcpSrv.cpp 的代码

#include <stdio.h>
#include <Winsock2.h>
#include <String.h>

void main()
{
//第一步:加载套接字库 WSAStartup 最终会对应WSACleanup 释放为该应用程序分配的资源
WORD wVersionRequsted; //版本请求
WSADATA wsaData;//WSADATA型对象
int err;//错误

wVersionRequsted = MAKEWORD(1,1);

err = WSAStartup(wVersionRequsted,&wsaData);
//如果加载错误
if(err != 0)
{
return ;
}
//如果加载版本错误
if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return ;
}

//创建套接字 socket
SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);
//绑定IP和端口 bind
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

//将套接字设置为监听模式
listen(sockSrv,5);


SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);

//不断监听 并且与客户端交换信息
while(1)
{
//与客户端建立连接 accept
printf("*****************\n");
SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
printf("*****************\n");
//发送数据send
char sendBuf[100];
sprintf(sendBuf,"Welcome %s to http://www.baidu.com",inet_ntoa(addrClient.sin_addr));
printf("%s\n",sendBuf);
send(sockConn,sendBuf,strlen(sendBuf)+1,0);

//接受数据recv
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
closesocket(sockConn);

getchar();
}


}

这个是 TcpClient.cpp 的代码

#include <stdio.h>
#include <Winsock2.h>
#include <String.h>

void main()
{
//第一步:加载套接字库 WSAStartup 最终会对应WSACleanup 释放为该应用程序分配的资源
WORD wVersionRequsted; //版本请求
WSADATA wsaData;//WSADATA型对象
int err;//错误

wVersionRequsted = MAKEWORD(1,1);

err = WSAStartup(wVersionRequsted,&wsaData);
//如果加载错误
if(err != 0)
{
return ;
}
//如果加载版本错误
if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return ;


}

//创建套接字socket
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);

//连接服务器端connect
SOCKADDR_INaddrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);


connect(sockClient,(SOCKADDR*)&addrSrv,0);

char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
//char sendBuf[100];
send(sockClient,"hello the world",sizeof("hello the world")+1,0);

//关闭套接字
closesocket(sockClient);
//释放套接字库分配的资源
WSACleanup();
}

编程 套接字???孙鑫
[解决办法]
accept后,另开线程与客户端send和recv
[解决办法]
你的代码太随意了,两个问题:
1. 服务器的 accept 是阻塞的,没有客户连接不会向下执行;
2. 客户端的recv要这样:result = recv(sockClient,recvBuf,100,0);
if (result > 0){
recvBuf[result] = 0;
printf("%s\n",recvBuf); }
建议参考《WinSock网络编程经络》,源码下载地址:http://download.csdn.net/detail/geoff08zhang/4571358

读书人网 >C++

热点推荐